@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", "~> 1.6"
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
- Settings.shared.appID = appId
14
+ var nativeError: NSError?
15
+ let success = ObjCExceptionHelper.tryBlock({
16
+ Settings.shared.appID = appId
15
17
 
16
- if let token = clientToken, !token.isEmpty {
17
- Settings.shared.clientToken = token
18
- }
18
+ if let token = clientToken, !token.isEmpty {
19
+ Settings.shared.clientToken = token
20
+ }
19
21
 
20
- Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
21
- Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
22
+ Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
23
+ Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
22
24
 
23
- ApplicationDelegate.shared.application(
24
- UIApplication.shared,
25
- didFinishLaunchingWithOptions: nil
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
- AppLinkUtility.fetchDeferredAppLink { url, error in
34
- if error != nil {
35
- promise.resolve(nil)
36
- return
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
- if let url = url {
40
- promise.resolve(url.absoluteString)
41
- } else {
42
- promise.resolve(nil)
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
- if let value = valueToSum {
57
- AppEvents.shared.logEvent(AppEvents.Name(eventName), valueToSum: value, parameters: params)
58
- } else if params.isEmpty {
59
- AppEvents.shared.logEvent(AppEvents.Name(eventName))
60
- } else {
61
- AppEvents.shared.logEvent(AppEvents.Name(eventName), parameters: params)
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
- AppEvents.shared.logPurchase(amount: amount, currency: currency, parameters: params)
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
- AppEvents.shared.setUserData(userData["email"] as? String, forType: .email)
82
- AppEvents.shared.setUserData(userData["firstName"] as? String, forType: .firstName)
83
- AppEvents.shared.setUserData(userData["lastName"] as? String, forType: .lastName)
84
- AppEvents.shared.setUserData(userData["phone"] as? String, forType: .phone)
85
- AppEvents.shared.setUserData(userData["dateOfBirth"] as? String, forType: .dateOfBirth)
86
- AppEvents.shared.setUserData(userData["gender"] as? String, forType: .gender)
87
- AppEvents.shared.setUserData(userData["city"] as? String, forType: .city)
88
- AppEvents.shared.setUserData(userData["state"] as? String, forType: .state)
89
- AppEvents.shared.setUserData(userData["zip"] as? String, forType: .zip)
90
- AppEvents.shared.setUserData(userData["country"] as? String, forType: .country)
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
- AppEvents.shared.clearUserData()
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
- Settings.shared.isAdvertiserTrackingEnabled = enabled
102
- Settings.shared.isAdvertiserIDCollectionEnabled = enabled
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(.verbose)
176
+ config?.setLogLevel(TikTokLogLevelDebug)
119
177
  }
120
178
 
121
- if let validConfig = config {
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
- let event: TikTokBaseEvent
199
+ var nativeError: NSError?
200
+ let success = ObjCExceptionHelper.tryBlock({
201
+ let event: TikTokBaseEvent
132
202
 
133
- if let eid = eventId, !eid.isEmpty {
134
- event = TikTokBaseEvent(eventName: eventName, eventId: eid)
135
- } else {
136
- event = TikTokBaseEvent(eventName: eventName)
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
- if let dict = properties {
140
- for (key, value) in dict {
141
- event.addProperty(withKey: key, value: value)
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
- TikTokBusiness.identify(
151
- withExternalID: externalId.isEmpty ? nil : externalId,
152
- externalUserName: externalUserName.isEmpty ? nil : externalUserName,
153
- phoneNumber: phoneNumber.isEmpty ? nil : phoneNumber,
154
- email: email.isEmpty ? nil : email
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
- TikTokBusiness.logout()
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,11 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface ObjCExceptionHelper : NSObject
6
+
7
+ + (BOOL)tryBlock:(void (NS_NOESCAPE ^)(void))block error:(NSError *_Nullable *_Nullable)error;
8
+
9
+ @end
10
+
11
+ NS_ASSUME_NONNULL_END
@@ -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.2",
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": [