@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", "~> 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,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
- Settings.shared.appID = appId
14
+ let error = ObjCExceptionHelper.tryBlock {
15
+ Settings.shared.appID = appId
15
16
 
16
- if let token = clientToken, !token.isEmpty {
17
- Settings.shared.clientToken = token
18
- }
17
+ if let token = clientToken, !token.isEmpty {
18
+ Settings.shared.clientToken = token
19
+ }
19
20
 
20
- Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
21
- Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
21
+ Settings.shared.isAdvertiserTrackingEnabled = advertiserTrackingEnabled
22
+ Settings.shared.isAdvertiserIDCollectionEnabled = advertiserTrackingEnabled
22
23
 
23
- ApplicationDelegate.shared.application(
24
- UIApplication.shared,
25
- didFinishLaunchingWithOptions: nil
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
- AppLinkUtility.fetchDeferredAppLink { url, error in
34
- if error != nil {
35
- promise.resolve(nil)
36
- return
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
- if let url = url {
40
- promise.resolve(url.absoluteString)
41
- } else {
42
- promise.resolve(nil)
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
- 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)
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
- AppEvents.shared.logPurchase(amount: amount, currency: currency, parameters: params)
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
- 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)
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
- AppEvents.shared.clearUserData()
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
- Settings.shared.isAdvertiserTrackingEnabled = enabled
102
- Settings.shared.isAdvertiserIDCollectionEnabled = enabled
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
- if let validConfig = config {
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 event: TikTokBaseEvent
191
+ let error = ObjCExceptionHelper.tryBlock {
192
+ let event: TikTokBaseEvent
132
193
 
133
- if let eid = eventId, !eid.isEmpty {
134
- event = TikTokBaseEvent(eventName: eventName, eventId: eid)
135
- } else {
136
- event = TikTokBaseEvent(eventName: eventName)
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
- if let dict = properties {
140
- for (key, value) in dict {
141
- event.addProperty(withKey: key, value: value)
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
- 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
- )
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
- TikTokBusiness.logout()
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,11 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface ObjCExceptionHelper : NSObject
6
+
7
+ + (nullable NSError *)tryBlock:(void (NS_NOESCAPE ^)(void))block;
8
+
9
+ @end
10
+
11
+ NS_ASSUME_NONNULL_END
@@ -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",
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": [