1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114//
// OTAServices.swift
// hyperswitch
//
// Created by Kuntimaddi Manideep on 24/01/25.
//
import Foundation
import HyperOTA
private func getHyperOTAPlist(_ key: String) -> String? {
guard let path = Bundle(for: RNViewManager.self).path(forResource: "HyperOTA", ofType: "plist"),
let dict = NSDictionary(contentsOfFile: path),
let value = dict[key] as? String, !value.isEmpty else {
return nil
}
return value
}
internal class EventLogger: NSObject, HPJPLoggerDelegate {
private func isJSONSerializable(_ value: Any) -> Bool {
return JSONSerialization.isValidJSONObject(["key": value])
}
internal func addLog(eventData: [String: Any], logLevel : String, key: String?){
do {
let jsonData = try JSONSerialization.data(withJSONObject: eventData, options: [])
guard let jsonString = String(data: jsonData, encoding: .utf8) else {
print("Error: JSON data encoding failed.")
return
}
var log = LogBuilder()
.setLogType(logLevel)
.setValue(jsonString)
switch key {
case "init_with_local_config_versions":
log = log.setEventName(.HYPER_OTA_INIT)
break
case "init":
log = log.setEventName(.HYPER_OTA_INIT)
break
case "update_end":
log = log.setEventName(.HYPER_OTA_FINISH)
case "end":
log = log.setEventName(.HYPER_OTA_FINISH)
break
default:
log = log.setEventName(.HYPER_OTA_EVENT)
}
LogManager.addLog(log.build())
} catch {
print("Error serializing event data: \(error.localizedDescription)")
}
}
func trackEvent(
withLevel logLevel: String,
label eventLabel: String,
key eventKey: String? = nil,
value eventValue: Any,
category eventCategory: String,
subcategory eventSubcategory: String
) {
let eventData: [String: Any] = [
"label": eventLabel,
"value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
"key" : eventKey ?? "",
"category": eventCategory,
"subcategory": eventSubcategory
]
addLog(eventData: eventData, logLevel: logLevel, key : eventKey)
}
func trackEvent(
withLevel logLevel: String,
label eventLabel: String,
value eventValue: Any,
category eventCategory: String,
subcategory eventSubcategory: String
) {
let eventData: [String: Any] = [
"label": eventLabel,
"value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
"category": eventCategory,
"subcategory": eventSubcategory
]
addLog(eventData: eventData, logLevel: logLevel, key : eventLabel)
}
}
public final class OTAServices {
public static var shared = OTAServices()
public var otaServices : HyperOTAServices? = nil
let logger = EventLogger()
public func initialize(publishableKey : String) {
if(self.otaServices == nil) {
let environment = SDKEnvironment.getEnvironment(publishableKey)
let configKey = (environment == .SANDBOX) ? "sandBoxReleaseConfigURL" : "releaseConfigURL"
let payload = [
"clientId": getHyperOTAPlist("clientId") ?? "" ,
"namespace": getHyperOTAPlist("namespace") ?? "",
"forceUpdate": true,
"localAssets": (getHyperOTAPlist(configKey) ?? "releaseConfigURL") == "releaseConfigURL",
"fileName": getHyperOTAPlist("fileName") ?? "" ,
"releaseConfigURL": (getHyperOTAPlist(configKey) ?? "") + "/mobile-ota/ios/" + SDKVersion.current + "/config.json",
] as [String: Any]
self.otaServices = HyperOTAServices(payload: payload, loggerDelegate: logger, baseBundle: Bundle(for: OTAServices.self))
}
}
public func getBundleURL() -> URL? {
return otaServices?.bundleURL() ?? Bundle(for: OTAServices.self).url(forResource: "hyperswitch", withExtension: "bundle")
}
}