@datalyr/react-native 1.4.3 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -21,7 +21,7 @@ Pod::Spec.new do |s|
|
|
|
21
21
|
|
|
22
22
|
s.dependency "ExpoModulesCore"
|
|
23
23
|
s.dependency "FBSDKCoreKit", "~> 18.0"
|
|
24
|
-
s.dependency "TikTokBusinessSDK", "
|
|
24
|
+
s.dependency "TikTokBusinessSDK", "1.6.0"
|
|
25
25
|
|
|
26
26
|
# Disable bitcode (required for TikTok SDK)
|
|
27
27
|
s.pod_target_xcconfig = {
|
|
@@ -11,37 +11,50 @@ public class DatalyrNativeModule: Module {
|
|
|
11
11
|
|
|
12
12
|
AsyncFunction("initializeMetaSDK") { (appId: String, clientToken: String?, advertiserTrackingEnabled: Bool, promise: Promise) in
|
|
13
13
|
DispatchQueue.main.async {
|
|
14
|
-
|
|
14
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
15
|
+
Settings.shared.appID = appId
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
if let token = clientToken, !token.isEmpty {
|
|
18
|
+
Settings.shared.clientToken = token
|
|
19
|
+
}
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
|
|
22
|
+
Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
ApplicationDelegate.shared.application(
|
|
25
|
+
UIApplication.shared,
|
|
26
|
+
didFinishLaunchingWithOptions: nil
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if let error = error {
|
|
31
|
+
promise.reject("meta_init_exception", error.localizedDescription)
|
|
32
|
+
return
|
|
33
|
+
}
|
|
27
34
|
|
|
28
35
|
promise.resolve(true)
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
38
|
|
|
32
39
|
AsyncFunction("fetchDeferredAppLink") { (promise: Promise) in
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
41
|
+
AppLinkUtility.fetchDeferredAppLink { url, error in
|
|
42
|
+
if error != nil {
|
|
43
|
+
promise.resolve(nil)
|
|
44
|
+
return
|
|
45
|
+
}
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
if let url = url {
|
|
48
|
+
promise.resolve(url.absoluteString)
|
|
49
|
+
} else {
|
|
50
|
+
promise.resolve(nil)
|
|
51
|
+
}
|
|
43
52
|
}
|
|
44
53
|
}
|
|
54
|
+
|
|
55
|
+
if error != nil {
|
|
56
|
+
promise.resolve(nil)
|
|
57
|
+
}
|
|
45
58
|
}
|
|
46
59
|
|
|
47
60
|
AsyncFunction("logMetaEvent") { (eventName: String, valueToSum: Double?, parameters: [String: Any]?, promise: Promise) in
|
|
@@ -53,12 +66,19 @@ public class DatalyrNativeModule: Module {
|
|
|
53
66
|
}
|
|
54
67
|
}
|
|
55
68
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
70
|
+
if let value = valueToSum {
|
|
71
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName), valueToSum: value, parameters: params)
|
|
72
|
+
} else if params.isEmpty {
|
|
73
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName))
|
|
74
|
+
} else {
|
|
75
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName), parameters: params)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if let error = error {
|
|
80
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
81
|
+
return
|
|
62
82
|
}
|
|
63
83
|
|
|
64
84
|
promise.resolve(true)
|
|
@@ -73,33 +93,64 @@ public class DatalyrNativeModule: Module {
|
|
|
73
93
|
}
|
|
74
94
|
}
|
|
75
95
|
|
|
76
|
-
|
|
96
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
97
|
+
AppEvents.shared.logPurchase(amount: amount, currency: currency, parameters: params)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if let error = error {
|
|
101
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
|
|
77
105
|
promise.resolve(true)
|
|
78
106
|
}
|
|
79
107
|
|
|
80
108
|
AsyncFunction("setMetaUserData") { (userData: [String: Any], promise: Promise) in
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
109
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
110
|
+
AppEvents.shared.setUserData(userData["email"] as? String, forType: .email)
|
|
111
|
+
AppEvents.shared.setUserData(userData["firstName"] as? String, forType: .firstName)
|
|
112
|
+
AppEvents.shared.setUserData(userData["lastName"] as? String, forType: .lastName)
|
|
113
|
+
AppEvents.shared.setUserData(userData["phone"] as? String, forType: .phone)
|
|
114
|
+
AppEvents.shared.setUserData(userData["dateOfBirth"] as? String, forType: .dateOfBirth)
|
|
115
|
+
AppEvents.shared.setUserData(userData["gender"] as? String, forType: .gender)
|
|
116
|
+
AppEvents.shared.setUserData(userData["city"] as? String, forType: .city)
|
|
117
|
+
AppEvents.shared.setUserData(userData["state"] as? String, forType: .state)
|
|
118
|
+
AppEvents.shared.setUserData(userData["zip"] as? String, forType: .zip)
|
|
119
|
+
AppEvents.shared.setUserData(userData["country"] as? String, forType: .country)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if let error = error {
|
|
123
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
124
|
+
return
|
|
125
|
+
}
|
|
91
126
|
|
|
92
127
|
promise.resolve(true)
|
|
93
128
|
}
|
|
94
129
|
|
|
95
130
|
AsyncFunction("clearMetaUserData") { (promise: Promise) in
|
|
96
|
-
|
|
131
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
132
|
+
AppEvents.shared.clearUserData()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if let error = error {
|
|
136
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
|
|
97
140
|
promise.resolve(true)
|
|
98
141
|
}
|
|
99
142
|
|
|
100
143
|
AsyncFunction("updateMetaTrackingAuthorization") { (enabled: Bool, promise: Promise) in
|
|
101
|
-
|
|
102
|
-
|
|
144
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
145
|
+
Settings.shared.isAdvertiserTrackingEnabled = enabled
|
|
146
|
+
Settings.shared.isAdvertiserIDCollectionEnabled = enabled
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if let error = error {
|
|
150
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
|
|
103
154
|
promise.resolve(true)
|
|
104
155
|
}
|
|
105
156
|
|
|
@@ -118,46 +169,79 @@ public class DatalyrNativeModule: Module {
|
|
|
118
169
|
config?.setLogLevel(TikTokLogLevelDebug)
|
|
119
170
|
}
|
|
120
171
|
|
|
121
|
-
|
|
122
|
-
TikTokBusiness.initializeSdk(validConfig)
|
|
123
|
-
promise.resolve(true)
|
|
124
|
-
} else {
|
|
172
|
+
guard let validConfig = config else {
|
|
125
173
|
promise.reject("tiktok_init_error", "Failed to create TikTok config")
|
|
174
|
+
return
|
|
126
175
|
}
|
|
176
|
+
|
|
177
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
178
|
+
TikTokBusiness.initializeSdk(validConfig)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if let error = error {
|
|
182
|
+
promise.reject("tiktok_init_exception", error.localizedDescription)
|
|
183
|
+
return
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
promise.resolve(true)
|
|
127
187
|
}
|
|
128
188
|
}
|
|
129
189
|
|
|
130
190
|
AsyncFunction("trackTikTokEvent") { (eventName: String, eventId: String?, properties: [String: Any]?, promise: Promise) in
|
|
131
|
-
let
|
|
191
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
192
|
+
let event: TikTokBaseEvent
|
|
132
193
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
194
|
+
if let eid = eventId, !eid.isEmpty {
|
|
195
|
+
event = TikTokBaseEvent(eventName: eventName, eventId: eid)
|
|
196
|
+
} else {
|
|
197
|
+
event = TikTokBaseEvent(eventName: eventName)
|
|
198
|
+
}
|
|
138
199
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
200
|
+
if let dict = properties {
|
|
201
|
+
for (key, value) in dict {
|
|
202
|
+
event.addProperty(withKey: key, value: value)
|
|
203
|
+
}
|
|
142
204
|
}
|
|
205
|
+
|
|
206
|
+
TikTokBusiness.trackTTEvent(event)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if let error = error {
|
|
210
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
211
|
+
return
|
|
143
212
|
}
|
|
144
213
|
|
|
145
|
-
TikTokBusiness.trackTTEvent(event)
|
|
146
214
|
promise.resolve(true)
|
|
147
215
|
}
|
|
148
216
|
|
|
149
217
|
AsyncFunction("identifyTikTokUser") { (externalId: String, externalUserName: String, phoneNumber: String, email: String, promise: Promise) in
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
218
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
219
|
+
TikTokBusiness.identify(
|
|
220
|
+
withExternalID: externalId.isEmpty ? nil : externalId,
|
|
221
|
+
externalUserName: externalUserName.isEmpty ? nil : externalUserName,
|
|
222
|
+
phoneNumber: phoneNumber.isEmpty ? nil : phoneNumber,
|
|
223
|
+
email: email.isEmpty ? nil : email
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if let error = error {
|
|
228
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
|
|
156
232
|
promise.resolve(true)
|
|
157
233
|
}
|
|
158
234
|
|
|
159
235
|
AsyncFunction("logoutTikTok") { (promise: Promise) in
|
|
160
|
-
|
|
236
|
+
let error = ObjCExceptionHelper.tryBlock {
|
|
237
|
+
TikTokBusiness.logout()
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if let error = error {
|
|
241
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
|
|
161
245
|
promise.resolve(true)
|
|
162
246
|
}
|
|
163
247
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#import "ObjCExceptionHelper.h"
|
|
2
|
+
|
|
3
|
+
@implementation ObjCExceptionHelper
|
|
4
|
+
|
|
5
|
+
+ (nullable NSError *)tryBlock:(void (NS_NOESCAPE ^)(void))block {
|
|
6
|
+
@try {
|
|
7
|
+
block();
|
|
8
|
+
return nil;
|
|
9
|
+
} @catch (NSException *exception) {
|
|
10
|
+
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
|
11
|
+
userInfo[NSLocalizedDescriptionKey] = exception.reason ?: @"Unknown NSException";
|
|
12
|
+
userInfo[@"ExceptionName"] = exception.name;
|
|
13
|
+
if (exception.userInfo) {
|
|
14
|
+
userInfo[@"ExceptionUserInfo"] = exception.userInfo;
|
|
15
|
+
}
|
|
16
|
+
return [NSError errorWithDomain:@"com.datalyr.exception"
|
|
17
|
+
code:-1
|
|
18
|
+
userInfo:userInfo];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@end
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datalyr/react-native",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.5",
|
|
4
4
|
"description": "Datalyr SDK for React Native & Expo - Server-side attribution tracking with bundled Meta and TikTok SDKs for iOS and Android",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"dev": "tsc --watch",
|
|
10
10
|
"test": "jest",
|
|
11
11
|
"lint": "eslint src --ext .ts,.tsx",
|
|
12
|
+
"validate:ios": "bash scripts/validate-ios.sh",
|
|
12
13
|
"prepublishOnly": "npm run build"
|
|
13
14
|
},
|
|
14
15
|
"files": [
|