@datalyr/react-native 1.4.2 → 1.4.4
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,36 +11,51 @@ 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
|
+
var nativeError: NSError?
|
|
15
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
16
|
+
Settings.shared.appID = appId
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
if let token = clientToken, !token.isEmpty {
|
|
19
|
+
Settings.shared.clientToken = token
|
|
20
|
+
}
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
|
|
23
|
+
Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
ApplicationDelegate.shared.application(
|
|
26
|
+
UIApplication.shared,
|
|
27
|
+
didFinishLaunchingWithOptions: nil
|
|
28
|
+
)
|
|
29
|
+
}, error: &nativeError)
|
|
30
|
+
|
|
31
|
+
if !success, let error = nativeError {
|
|
32
|
+
promise.reject("meta_init_exception", error.localizedDescription)
|
|
33
|
+
return
|
|
34
|
+
}
|
|
27
35
|
|
|
28
36
|
promise.resolve(true)
|
|
29
37
|
}
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
AsyncFunction("fetchDeferredAppLink") { (promise: Promise) in
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
var nativeError: NSError?
|
|
42
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
43
|
+
AppLinkUtility.fetchDeferredAppLink { url, error in
|
|
44
|
+
if error != nil {
|
|
45
|
+
promise.resolve(nil)
|
|
46
|
+
return
|
|
47
|
+
}
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
if let url = url {
|
|
50
|
+
promise.resolve(url.absoluteString)
|
|
51
|
+
} else {
|
|
52
|
+
promise.resolve(nil)
|
|
53
|
+
}
|
|
43
54
|
}
|
|
55
|
+
}, error: &nativeError)
|
|
56
|
+
|
|
57
|
+
if !success {
|
|
58
|
+
promise.resolve(nil)
|
|
44
59
|
}
|
|
45
60
|
}
|
|
46
61
|
|
|
@@ -53,12 +68,20 @@ public class DatalyrNativeModule: Module {
|
|
|
53
68
|
}
|
|
54
69
|
}
|
|
55
70
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
71
|
+
var nativeError: NSError?
|
|
72
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
73
|
+
if let value = valueToSum {
|
|
74
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName), valueToSum: value, parameters: params)
|
|
75
|
+
} else if params.isEmpty {
|
|
76
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName))
|
|
77
|
+
} else {
|
|
78
|
+
AppEvents.shared.logEvent(AppEvents.Name(eventName), parameters: params)
|
|
79
|
+
}
|
|
80
|
+
}, error: &nativeError)
|
|
81
|
+
|
|
82
|
+
if !success, let error = nativeError {
|
|
83
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
84
|
+
return
|
|
62
85
|
}
|
|
63
86
|
|
|
64
87
|
promise.resolve(true)
|
|
@@ -73,33 +96,68 @@ public class DatalyrNativeModule: Module {
|
|
|
73
96
|
}
|
|
74
97
|
}
|
|
75
98
|
|
|
76
|
-
|
|
99
|
+
var nativeError: NSError?
|
|
100
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
101
|
+
AppEvents.shared.logPurchase(amount: amount, currency: currency, parameters: params)
|
|
102
|
+
}, error: &nativeError)
|
|
103
|
+
|
|
104
|
+
if !success, let error = nativeError {
|
|
105
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
77
109
|
promise.resolve(true)
|
|
78
110
|
}
|
|
79
111
|
|
|
80
112
|
AsyncFunction("setMetaUserData") { (userData: [String: Any], promise: Promise) in
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
113
|
+
var nativeError: NSError?
|
|
114
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
115
|
+
AppEvents.shared.setUserData(userData["email"] as? String, forType: .email)
|
|
116
|
+
AppEvents.shared.setUserData(userData["firstName"] as? String, forType: .firstName)
|
|
117
|
+
AppEvents.shared.setUserData(userData["lastName"] as? String, forType: .lastName)
|
|
118
|
+
AppEvents.shared.setUserData(userData["phone"] as? String, forType: .phone)
|
|
119
|
+
AppEvents.shared.setUserData(userData["dateOfBirth"] as? String, forType: .dateOfBirth)
|
|
120
|
+
AppEvents.shared.setUserData(userData["gender"] as? String, forType: .gender)
|
|
121
|
+
AppEvents.shared.setUserData(userData["city"] as? String, forType: .city)
|
|
122
|
+
AppEvents.shared.setUserData(userData["state"] as? String, forType: .state)
|
|
123
|
+
AppEvents.shared.setUserData(userData["zip"] as? String, forType: .zip)
|
|
124
|
+
AppEvents.shared.setUserData(userData["country"] as? String, forType: .country)
|
|
125
|
+
}, error: &nativeError)
|
|
126
|
+
|
|
127
|
+
if !success, let error = nativeError {
|
|
128
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
129
|
+
return
|
|
130
|
+
}
|
|
91
131
|
|
|
92
132
|
promise.resolve(true)
|
|
93
133
|
}
|
|
94
134
|
|
|
95
135
|
AsyncFunction("clearMetaUserData") { (promise: Promise) in
|
|
96
|
-
|
|
136
|
+
var nativeError: NSError?
|
|
137
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
138
|
+
AppEvents.shared.clearUserData()
|
|
139
|
+
}, error: &nativeError)
|
|
140
|
+
|
|
141
|
+
if !success, let error = nativeError {
|
|
142
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
143
|
+
return
|
|
144
|
+
}
|
|
145
|
+
|
|
97
146
|
promise.resolve(true)
|
|
98
147
|
}
|
|
99
148
|
|
|
100
149
|
AsyncFunction("updateMetaTrackingAuthorization") { (enabled: Bool, promise: Promise) in
|
|
101
|
-
|
|
102
|
-
|
|
150
|
+
var nativeError: NSError?
|
|
151
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
152
|
+
Settings.shared.isAdvertiserTrackingEnabled = enabled
|
|
153
|
+
Settings.shared.isAdvertiserIDCollectionEnabled = enabled
|
|
154
|
+
}, error: &nativeError)
|
|
155
|
+
|
|
156
|
+
if !success, let error = nativeError {
|
|
157
|
+
promise.reject("meta_exception", error.localizedDescription)
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
|
|
103
161
|
promise.resolve(true)
|
|
104
162
|
}
|
|
105
163
|
|
|
@@ -115,49 +173,86 @@ public class DatalyrNativeModule: Module {
|
|
|
115
173
|
}
|
|
116
174
|
|
|
117
175
|
if debug {
|
|
118
|
-
config?.setLogLevel(
|
|
176
|
+
config?.setLogLevel(TikTokLogLevelDebug)
|
|
119
177
|
}
|
|
120
178
|
|
|
121
|
-
|
|
122
|
-
TikTokBusiness.initializeSdk(validConfig)
|
|
123
|
-
promise.resolve(true)
|
|
124
|
-
} else {
|
|
179
|
+
guard let validConfig = config else {
|
|
125
180
|
promise.reject("tiktok_init_error", "Failed to create TikTok config")
|
|
181
|
+
return
|
|
126
182
|
}
|
|
183
|
+
|
|
184
|
+
var nativeError: NSError?
|
|
185
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
186
|
+
TikTokBusiness.initializeSdk(validConfig)
|
|
187
|
+
}, error: &nativeError)
|
|
188
|
+
|
|
189
|
+
if !success, let error = nativeError {
|
|
190
|
+
promise.reject("tiktok_init_exception", error.localizedDescription)
|
|
191
|
+
return
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
promise.resolve(true)
|
|
127
195
|
}
|
|
128
196
|
}
|
|
129
197
|
|
|
130
198
|
AsyncFunction("trackTikTokEvent") { (eventName: String, eventId: String?, properties: [String: Any]?, promise: Promise) in
|
|
131
|
-
|
|
199
|
+
var nativeError: NSError?
|
|
200
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
201
|
+
let event: TikTokBaseEvent
|
|
132
202
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
203
|
+
if let eid = eventId, !eid.isEmpty {
|
|
204
|
+
event = TikTokBaseEvent(eventName: eventName, eventId: eid)
|
|
205
|
+
} else {
|
|
206
|
+
event = TikTokBaseEvent(eventName: eventName)
|
|
207
|
+
}
|
|
138
208
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
209
|
+
if let dict = properties {
|
|
210
|
+
for (key, value) in dict {
|
|
211
|
+
event.addProperty(withKey: key, value: value)
|
|
212
|
+
}
|
|
142
213
|
}
|
|
214
|
+
|
|
215
|
+
TikTokBusiness.trackTTEvent(event)
|
|
216
|
+
}, error: &nativeError)
|
|
217
|
+
|
|
218
|
+
if !success, let error = nativeError {
|
|
219
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
220
|
+
return
|
|
143
221
|
}
|
|
144
222
|
|
|
145
|
-
TikTokBusiness.trackTTEvent(event)
|
|
146
223
|
promise.resolve(true)
|
|
147
224
|
}
|
|
148
225
|
|
|
149
226
|
AsyncFunction("identifyTikTokUser") { (externalId: String, externalUserName: String, phoneNumber: String, email: String, promise: Promise) in
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
227
|
+
var nativeError: NSError?
|
|
228
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
229
|
+
TikTokBusiness.identify(
|
|
230
|
+
withExternalID: externalId.isEmpty ? nil : externalId,
|
|
231
|
+
externalUserName: externalUserName.isEmpty ? nil : externalUserName,
|
|
232
|
+
phoneNumber: phoneNumber.isEmpty ? nil : phoneNumber,
|
|
233
|
+
email: email.isEmpty ? nil : email
|
|
234
|
+
)
|
|
235
|
+
}, error: &nativeError)
|
|
236
|
+
|
|
237
|
+
if !success, let error = nativeError {
|
|
238
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
|
|
156
242
|
promise.resolve(true)
|
|
157
243
|
}
|
|
158
244
|
|
|
159
245
|
AsyncFunction("logoutTikTok") { (promise: Promise) in
|
|
160
|
-
|
|
246
|
+
var nativeError: NSError?
|
|
247
|
+
let success = ObjCExceptionHelper.tryBlock({
|
|
248
|
+
TikTokBusiness.logout()
|
|
249
|
+
}, error: &nativeError)
|
|
250
|
+
|
|
251
|
+
if !success, let error = nativeError {
|
|
252
|
+
promise.reject("tiktok_exception", error.localizedDescription)
|
|
253
|
+
return
|
|
254
|
+
}
|
|
255
|
+
|
|
161
256
|
promise.resolve(true)
|
|
162
257
|
}
|
|
163
258
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#import "ObjCExceptionHelper.h"
|
|
2
|
+
|
|
3
|
+
@implementation ObjCExceptionHelper
|
|
4
|
+
|
|
5
|
+
+ (BOOL)tryBlock:(void (NS_NOESCAPE ^)(void))block error:(NSError **)error {
|
|
6
|
+
@try {
|
|
7
|
+
block();
|
|
8
|
+
return YES;
|
|
9
|
+
} @catch (NSException *exception) {
|
|
10
|
+
if (error) {
|
|
11
|
+
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
|
12
|
+
userInfo[NSLocalizedDescriptionKey] = exception.reason ?: @"Unknown NSException";
|
|
13
|
+
userInfo[@"ExceptionName"] = exception.name;
|
|
14
|
+
if (exception.userInfo) {
|
|
15
|
+
userInfo[@"ExceptionUserInfo"] = exception.userInfo;
|
|
16
|
+
}
|
|
17
|
+
*error = [NSError errorWithDomain:@"com.datalyr.exception"
|
|
18
|
+
code:-1
|
|
19
|
+
userInfo:userInfo];
|
|
20
|
+
}
|
|
21
|
+
return NO;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@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.4",
|
|
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": [
|