@react-native-firebase/analytics 26.4.0 → 27.1.0
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.
- package/CHANGELOG.md +12 -0
- package/RNFBAnalytics.podspec +49 -2
- package/dist/module/index.js +2 -2
- package/dist/module/index.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/lib/index.d.ts.map +1 -1
- package/dist/typescript/lib/version.d.ts +1 -1
- package/ios/RNFBAnalytics/RNFBAnalyticsConsentSettingsMapper.swift +98 -0
- package/ios/RNFBAnalytics/RNFBAnalyticsHelper.h +111 -0
- package/ios/RNFBAnalytics/RNFBAnalyticsHelper.m +338 -0
- package/ios/RNFBAnalytics/RNFBAnalyticsJavascriptParamsCleaner.swift +167 -0
- package/ios/RNFBAnalytics/RNFBAnalyticsModule.mm +32 -282
- package/ios/RNFBAnalytics.xcodeproj/project.pbxproj +16 -2
- package/ios/RNFBAnalyticsUnitTests/HostStubs/Firebase/FIRAnalyticsHostStub.m +304 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/Firebase/Firebase.h +71 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBAnalytics/RNFBAnalyticsLogTransactionHostStub.h +20 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBAnalytics/RNFBAnalyticsLogTransactionHostStub.m +43 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBApp/RNFBSharedUtils.h +21 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBApp/RNFBSharedUtilsHostStub.m +26 -0
- package/ios/RNFBAnalyticsUnitTests/HostStubs/React/RCTBridgeModule.h +10 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsConsentSettingsMapperHostStubTests.m +62 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsConsentSettingsMapperTests.swift +91 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsHelperHostStubTests.m +542 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsJavascriptParamsCleanerHostStubTests.m +59 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsJavascriptParamsCleanerTests.swift +205 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsNullSentinelDecodeTests.m +111 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsUnitTests.xcodeproj/project.pbxproj +302 -0
- package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAnalyticsUnitTests.xcscheme +69 -0
- package/lib/index.ts +1 -1
- package/lib/version.ts +1 -1
- package/package.json +4 -4
|
@@ -15,88 +15,14 @@
|
|
|
15
15
|
*
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@import FirebaseCore;
|
|
25
|
-
@import FirebaseAnalytics;
|
|
26
|
-
#endif
|
|
27
|
-
#import <React/RCTUtils.h>
|
|
28
|
-
|
|
29
|
-
#if __has_include(<RNFBAnalytics/RNFBAnalytics-Swift.h>)
|
|
30
|
-
// This import will work in situations where `use_frameworks!` is in use
|
|
31
|
-
#import <RNFBAnalytics/RNFBAnalytics-Swift.h>
|
|
32
|
-
#elif __has_include("RNFBAnalytics-Swift.h")
|
|
33
|
-
// If `use_frameworks!` is not in use (for example, while using pre-built
|
|
34
|
-
// react-native core) then header imports based on frameworks assumptions fail.
|
|
35
|
-
// So, if frameworks are not available, fall back to importing the header directly, it
|
|
36
|
-
// should be findable from a header search path pointing to the build
|
|
37
|
-
// directory. See firebase-ios-sdk#12611 for more context.
|
|
38
|
-
#import "RNFBAnalytics-Swift.h"
|
|
39
|
-
#endif
|
|
40
|
-
#import <RNFBApp/RNFBSharedUtils.h>
|
|
18
|
+
// This module intentionally has no Firebase imports and no `*-Swift.h` —
|
|
19
|
+
// see RNFBAnalyticsHelper.h. Every Firebase Analytics SDK call (and the
|
|
20
|
+
// Swift param cleaner / consent mapper / log-transaction types) is routed
|
|
21
|
+
// through the plain Objective-C RNFBAnalyticsHelper class instead, which
|
|
22
|
+
// can safely `@import` FirebaseAnalytics / import the generated Swift
|
|
23
|
+
// interface because it compiles as ObjC, not ObjC++.
|
|
41
24
|
#import "RNFBAnalyticsModule.h"
|
|
42
|
-
|
|
43
|
-
/** GA4 parameters that must be sent as integer NSNumber values (not doubles from JS). */
|
|
44
|
-
static NSArray<NSString *> *RNFBAnalyticsLongNumericParameterKeys(void) {
|
|
45
|
-
static NSArray<NSString *> *keys;
|
|
46
|
-
static dispatch_once_t onceToken;
|
|
47
|
-
dispatch_once(&onceToken, ^{
|
|
48
|
-
keys = @[
|
|
49
|
-
kFIRParameterQuantity,
|
|
50
|
-
kFIRParameterIndex,
|
|
51
|
-
kFIRParameterLevel,
|
|
52
|
-
kFIRParameterNumberOfNights,
|
|
53
|
-
kFIRParameterNumberOfPassengers,
|
|
54
|
-
kFIRParameterNumberOfRooms,
|
|
55
|
-
kFIRParameterScore,
|
|
56
|
-
];
|
|
57
|
-
});
|
|
58
|
-
return keys;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
static void RNFBAnalyticsAddConsentStatus(NSMutableDictionary *consent,
|
|
62
|
-
NSDictionary *consentSettings, NSString *key,
|
|
63
|
-
FIRConsentType type) {
|
|
64
|
-
NSNumber *value = consentSettings[key];
|
|
65
|
-
if (value != nil) {
|
|
66
|
-
consent[type] = value.boolValue ? FIRConsentStatusGranted : FIRConsentStatusDenied;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
static int RNFBAnalyticsHexDigit(unichar character) {
|
|
71
|
-
if (character >= '0' && character <= '9') {
|
|
72
|
-
return character - '0';
|
|
73
|
-
}
|
|
74
|
-
if (character >= 'a' && character <= 'f') {
|
|
75
|
-
return character - 'a' + 10;
|
|
76
|
-
}
|
|
77
|
-
if (character >= 'A' && character <= 'F') {
|
|
78
|
-
return character - 'A' + 10;
|
|
79
|
-
}
|
|
80
|
-
return -1;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
static NSData *RNFBAnalyticsDataFromSHA256HexString(NSString *hexString) {
|
|
84
|
-
if (hexString.length != 64) {
|
|
85
|
-
return nil;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
unsigned char bytes[32];
|
|
89
|
-
for (NSUInteger i = 0; i < sizeof(bytes); i++) {
|
|
90
|
-
int high = RNFBAnalyticsHexDigit([hexString characterAtIndex:i * 2]);
|
|
91
|
-
int low = RNFBAnalyticsHexDigit([hexString characterAtIndex:i * 2 + 1]);
|
|
92
|
-
if (high < 0 || low < 0) {
|
|
93
|
-
return nil;
|
|
94
|
-
}
|
|
95
|
-
bytes[i] = (high << 4) | low;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return [NSData dataWithBytes:bytes length:sizeof(bytes)];
|
|
99
|
-
}
|
|
25
|
+
#import "RNFBAnalyticsHelper.h"
|
|
100
26
|
|
|
101
27
|
@implementation RNFBAnalyticsModule
|
|
102
28
|
#pragma mark -
|
|
@@ -120,277 +46,101 @@ RCT_EXPORT_MODULE(NativeRNFBTurboAnalytics)
|
|
|
120
46
|
params:(NSDictionary *)params
|
|
121
47
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
122
48
|
reject:(RCTPromiseRejectBlock)reject {
|
|
123
|
-
|
|
124
|
-
[FIRAnalytics logEventWithName:name parameters:[self cleanJavascriptParams:params]];
|
|
125
|
-
} @catch (NSException *exception) {
|
|
126
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return resolve([NSNull null]);
|
|
49
|
+
[RNFBAnalyticsHelper logEvent:name params:params resolve:resolve reject:reject];
|
|
130
50
|
}
|
|
131
51
|
|
|
132
52
|
- (void)setAnalyticsCollectionEnabled:(BOOL)enabled
|
|
133
53
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
134
54
|
reject:(RCTPromiseRejectBlock)reject {
|
|
135
|
-
|
|
136
|
-
[FIRAnalytics setAnalyticsCollectionEnabled:enabled];
|
|
137
|
-
} @catch (NSException *exception) {
|
|
138
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return resolve([NSNull null]);
|
|
55
|
+
[RNFBAnalyticsHelper setAnalyticsCollectionEnabled:enabled resolve:resolve reject:reject];
|
|
142
56
|
}
|
|
143
57
|
|
|
144
58
|
- (void)setUserId:(NSString *)id
|
|
145
59
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
146
60
|
reject:(RCTPromiseRejectBlock)reject {
|
|
147
|
-
|
|
148
|
-
[FIRAnalytics setUserID:[self convertNSNullToNil:id]];
|
|
149
|
-
} @catch (NSException *exception) {
|
|
150
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
151
|
-
}
|
|
152
|
-
return resolve([NSNull null]);
|
|
61
|
+
[RNFBAnalyticsHelper setUserId:id resolve:resolve reject:reject];
|
|
153
62
|
}
|
|
154
63
|
|
|
155
64
|
- (void)setUserProperty:(NSString *)name
|
|
156
65
|
value:(NSString *)value
|
|
157
66
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
158
67
|
reject:(RCTPromiseRejectBlock)reject {
|
|
159
|
-
|
|
160
|
-
[FIRAnalytics setUserPropertyString:[self convertNSNullToNil:value] forName:name];
|
|
161
|
-
} @catch (NSException *exception) {
|
|
162
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
163
|
-
}
|
|
164
|
-
return resolve([NSNull null]);
|
|
68
|
+
[RNFBAnalyticsHelper setUserProperty:name value:value resolve:resolve reject:reject];
|
|
165
69
|
}
|
|
166
70
|
|
|
167
71
|
- (void)setUserProperties:(NSDictionary *)properties
|
|
168
72
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
169
73
|
reject:(RCTPromiseRejectBlock)reject {
|
|
170
|
-
|
|
171
|
-
[properties enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
|
|
172
|
-
[FIRAnalytics setUserPropertyString:[self convertNSNullToNil:value] forName:key];
|
|
173
|
-
}];
|
|
174
|
-
} @catch (NSException *exception) {
|
|
175
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
176
|
-
}
|
|
177
|
-
return resolve([NSNull null]);
|
|
74
|
+
[RNFBAnalyticsHelper setUserProperties:properties resolve:resolve reject:reject];
|
|
178
75
|
}
|
|
179
76
|
|
|
180
77
|
- (void)resetAnalyticsData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
|
|
181
|
-
|
|
182
|
-
[FIRAnalytics resetAnalyticsData];
|
|
183
|
-
} @catch (NSException *exception) {
|
|
184
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
185
|
-
}
|
|
186
|
-
return resolve([NSNull null]);
|
|
78
|
+
[RNFBAnalyticsHelper resetAnalyticsData:resolve reject:reject];
|
|
187
79
|
}
|
|
188
80
|
|
|
189
81
|
- (void)setSessionTimeoutDuration:(double)milliseconds
|
|
190
82
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
191
83
|
reject:(RCTPromiseRejectBlock)reject {
|
|
192
|
-
[
|
|
193
|
-
return resolve([NSNull null]);
|
|
84
|
+
[RNFBAnalyticsHelper setSessionTimeoutDuration:milliseconds resolve:resolve reject:reject];
|
|
194
85
|
}
|
|
195
86
|
|
|
196
87
|
- (void)getAppInstanceId:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
|
|
197
|
-
|
|
88
|
+
[RNFBAnalyticsHelper getAppInstanceId:resolve reject:reject];
|
|
198
89
|
}
|
|
199
90
|
|
|
200
91
|
- (void)getSessionId:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
|
|
201
|
-
|
|
202
|
-
const int64_t timeoutNs = (int64_t)(60 * NSEC_PER_SEC);
|
|
203
|
-
|
|
204
|
-
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, timeoutNs), dispatch_get_main_queue(), ^{
|
|
205
|
-
if (completed) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
completed = YES;
|
|
209
|
-
DLog(@"getSessionId timed_out: no SDK callback within 60 seconds");
|
|
210
|
-
resolve([NSNull null]);
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
[FIRAnalytics sessionIDWithCompletion:^(int64_t sessionID, NSError *_Nullable error) {
|
|
214
|
-
dispatch_async(dispatch_get_main_queue(), ^{
|
|
215
|
-
if (completed) {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
completed = YES;
|
|
219
|
-
|
|
220
|
-
// Occasionally sessionID is 0 despite nil error, reject as if it were an error
|
|
221
|
-
// https://github.com/firebase/firebase-ios-sdk/issues/15258
|
|
222
|
-
if (!error && [NSNumber numberWithLongLong:sessionID] == 0) {
|
|
223
|
-
DLog(@"getSessionId zero_without_error: sessionID=0 (firebase-ios-sdk#15258)");
|
|
224
|
-
return resolve([NSNull null]);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (error) {
|
|
228
|
-
DLog(@"getSessionId sdk_error: domain=%@ code=%ld description=%@", error.domain,
|
|
229
|
-
(long)error.code, error.localizedDescription ?: @"(none)");
|
|
230
|
-
return resolve([NSNull null]);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
DLog(@"getSessionId success: sessionID=%lld", sessionID);
|
|
234
|
-
return resolve([NSNumber numberWithLongLong:sessionID]);
|
|
235
|
-
});
|
|
236
|
-
}];
|
|
92
|
+
[RNFBAnalyticsHelper getSessionId:resolve reject:reject];
|
|
237
93
|
}
|
|
238
94
|
|
|
239
95
|
- (void)setDefaultEventParameters:(NSDictionary *)params
|
|
240
96
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
241
97
|
reject:(RCTPromiseRejectBlock)reject {
|
|
242
|
-
|
|
243
|
-
[FIRAnalytics setDefaultEventParameters:[self cleanJavascriptParams:params]];
|
|
244
|
-
} @catch (NSException *exception) {
|
|
245
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
return resolve([NSNull null]);
|
|
98
|
+
[RNFBAnalyticsHelper setDefaultEventParameters:params resolve:resolve reject:reject];
|
|
249
99
|
}
|
|
250
100
|
|
|
251
101
|
- (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress
|
|
252
102
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
253
103
|
reject:(RCTPromiseRejectBlock)reject {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return resolve([NSNull null]);
|
|
104
|
+
[RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithEmailAddress:emailAddress
|
|
105
|
+
resolve:resolve
|
|
106
|
+
reject:reject];
|
|
261
107
|
}
|
|
262
108
|
|
|
263
109
|
- (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSString *)hashedEmailAddress
|
|
264
110
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
265
111
|
reject:(RCTPromiseRejectBlock)reject {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
[FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedEmailAddress:emailAddress];
|
|
273
|
-
} @catch (NSException *exception) {
|
|
274
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return resolve([NSNull null]);
|
|
112
|
+
[RNFBAnalyticsHelper
|
|
113
|
+
initiateOnDeviceConversionMeasurementWithHashedEmailAddress:hashedEmailAddress
|
|
114
|
+
resolve:resolve
|
|
115
|
+
reject:reject];
|
|
278
116
|
}
|
|
279
117
|
|
|
280
118
|
- (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber
|
|
281
119
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
282
120
|
reject:(RCTPromiseRejectBlock)reject {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return resolve([NSNull null]);
|
|
121
|
+
[RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithPhoneNumber:phoneNumber
|
|
122
|
+
resolve:resolve
|
|
123
|
+
reject:reject];
|
|
290
124
|
}
|
|
291
125
|
|
|
292
126
|
- (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSString *)hashedPhoneNumber
|
|
293
127
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
294
128
|
reject:(RCTPromiseRejectBlock)reject {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
reject(@"firebase_analytics", @"Expected a 64-character SHA-256 hex string", nil);
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
[FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:phoneNumber];
|
|
302
|
-
} @catch (NSException *exception) {
|
|
303
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
return resolve([NSNull null]);
|
|
129
|
+
[RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:hashedPhoneNumber
|
|
130
|
+
resolve:resolve
|
|
131
|
+
reject:reject];
|
|
307
132
|
}
|
|
308
133
|
|
|
309
134
|
- (void)logTransaction:(NSString *)transactionId
|
|
310
135
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
311
136
|
reject:(RCTPromiseRejectBlock)reject {
|
|
312
|
-
|
|
313
|
-
RNFBAnalyticsLogTransaction *handler = [[RNFBAnalyticsLogTransaction alloc] init];
|
|
314
|
-
[handler logTransactionWithTransactionId:transactionId resolve:resolve reject:reject];
|
|
315
|
-
} else {
|
|
316
|
-
reject(@"firebase_analytics", @"logTransaction() is only supported on iOS 15.0 or newer", nil);
|
|
317
|
-
}
|
|
137
|
+
[RNFBAnalyticsHelper logTransaction:transactionId resolve:resolve reject:reject];
|
|
318
138
|
}
|
|
319
139
|
|
|
320
140
|
- (void)setConsent:(NSDictionary *)consentSettings
|
|
321
141
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
322
142
|
reject:(RCTPromiseRejectBlock)reject {
|
|
323
|
-
|
|
324
|
-
NSMutableDictionary *consent = [NSMutableDictionary dictionaryWithCapacity:4];
|
|
325
|
-
RNFBAnalyticsAddConsentStatus(consent, consentSettings, @"analytics_storage",
|
|
326
|
-
FIRConsentTypeAnalyticsStorage);
|
|
327
|
-
RNFBAnalyticsAddConsentStatus(consent, consentSettings, @"ad_storage", FIRConsentTypeAdStorage);
|
|
328
|
-
RNFBAnalyticsAddConsentStatus(consent, consentSettings, @"ad_user_data",
|
|
329
|
-
FIRConsentTypeAdUserData);
|
|
330
|
-
RNFBAnalyticsAddConsentStatus(consent, consentSettings, @"ad_personalization",
|
|
331
|
-
FIRConsentTypeAdPersonalization);
|
|
332
|
-
[FIRAnalytics setConsent:consent];
|
|
333
|
-
} @catch (NSException *exception) {
|
|
334
|
-
return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
|
|
335
|
-
}
|
|
336
|
-
return resolve([NSNull null]);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
#pragma mark -
|
|
340
|
-
#pragma mark Private methods
|
|
341
|
-
|
|
342
|
-
- (NSDictionary *)cleanJavascriptParams:(NSDictionary *)params {
|
|
343
|
-
NSMutableDictionary *newParams = [params mutableCopy];
|
|
344
|
-
if (newParams[kFIRParameterItems]) {
|
|
345
|
-
NSMutableArray *newItems = [NSMutableArray array];
|
|
346
|
-
[(NSArray *)newParams[kFIRParameterItems]
|
|
347
|
-
enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
|
|
348
|
-
NSMutableDictionary *item = [obj mutableCopy];
|
|
349
|
-
[self rnfb_coerceLongNumericParametersInMutableDictionary:item];
|
|
350
|
-
[newItems addObject:[item copy]];
|
|
351
|
-
}];
|
|
352
|
-
newParams[kFIRParameterItems] = [newItems copy];
|
|
353
|
-
}
|
|
354
|
-
[self rnfb_coerceLongNumericParametersInMutableDictionary:newParams];
|
|
355
|
-
[self rnfb_coerceSuccessParameterInMutableDictionary:newParams];
|
|
356
|
-
NSNumber *extendSession = [newParams valueForKey:kFIRParameterExtendSession];
|
|
357
|
-
if ([extendSession isEqualToNumber:@1]) {
|
|
358
|
-
newParams[kFIRParameterExtendSession] = @YES;
|
|
359
|
-
}
|
|
360
|
-
return [newParams copy];
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
- (void)rnfb_coerceLongNumericParametersInMutableDictionary:(NSMutableDictionary *)dict {
|
|
364
|
-
for (NSString *key in RNFBAnalyticsLongNumericParameterKeys()) {
|
|
365
|
-
id value = dict[key];
|
|
366
|
-
if (value != nil && value != [NSNull null]) {
|
|
367
|
-
dict[key] = @([value integerValue]);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
- (void)rnfb_coerceSuccessParameterInMutableDictionary:(NSMutableDictionary *)dict {
|
|
373
|
-
id value = dict[kFIRParameterSuccess];
|
|
374
|
-
if (value == nil || value == [NSNull null]) {
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
int success = 0;
|
|
378
|
-
if ([value isKindOfClass:[NSString class]]) {
|
|
379
|
-
NSString *lower = [(NSString *)value lowercaseString];
|
|
380
|
-
if ([lower isEqualToString:@"true"] || [lower isEqualToString:@"yes"] ||
|
|
381
|
-
[lower isEqualToString:@"1"]) {
|
|
382
|
-
success = 1;
|
|
383
|
-
}
|
|
384
|
-
} else {
|
|
385
|
-
success = [value boolValue] ? 1 : 0;
|
|
386
|
-
}
|
|
387
|
-
dict[kFIRParameterSuccess] = @(success);
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
/// Converts null values received over the bridge from NSNull to nil
|
|
391
|
-
/// @param value Nullable string value
|
|
392
|
-
- (NSString *)convertNSNullToNil:(NSString *)value {
|
|
393
|
-
return [value isEqual:[NSNull null]] ? nil : value;
|
|
143
|
+
[RNFBAnalyticsHelper setConsent:consentSettings resolve:resolve reject:reject];
|
|
394
144
|
}
|
|
395
145
|
|
|
396
146
|
@end
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
/* Begin PBXBuildFile section */
|
|
10
10
|
2744B98621F45429004F8E3F /* RNFBAnalyticsModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */; };
|
|
11
11
|
2744B99021F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */; };
|
|
12
|
+
2744B99121F45429004F8E3F /* RNFBAnalyticsJavascriptParamsCleaner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2744B99221F45429004F8E3F /* RNFBAnalyticsJavascriptParamsCleaner.swift */; };
|
|
13
|
+
2744B99321F45429004F8E3F /* RNFBAnalyticsConsentSettingsMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2744B99421F45429004F8E3F /* RNFBAnalyticsConsentSettingsMapper.swift */; };
|
|
14
|
+
RNFBAN000000000000000006 /* RNFBAnalyticsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = RNFBAN000000000000000008 /* RNFBAnalyticsHelper.m */; };
|
|
12
15
|
/* End PBXBuildFile section */
|
|
13
16
|
|
|
14
17
|
/* Begin PBXCopyFilesBuildPhase section */
|
|
@@ -28,6 +31,10 @@
|
|
|
28
31
|
2744B98421F45429004F8E3F /* RNFBAnalyticsModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAnalyticsModule.h; path = RNFBAnalytics/RNFBAnalyticsModule.h; sourceTree = SOURCE_ROOT; };
|
|
29
32
|
2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBAnalyticsModule.mm; path = RNFBAnalytics/RNFBAnalyticsModule.mm; sourceTree = SOURCE_ROOT; };
|
|
30
33
|
2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RNFBAnalyticsLogTransaction.swift; path = RNFBAnalytics/RNFBAnalyticsLogTransaction.swift; sourceTree = SOURCE_ROOT; };
|
|
34
|
+
2744B99221F45429004F8E3F /* RNFBAnalyticsJavascriptParamsCleaner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RNFBAnalyticsJavascriptParamsCleaner.swift; path = RNFBAnalytics/RNFBAnalyticsJavascriptParamsCleaner.swift; sourceTree = SOURCE_ROOT; };
|
|
35
|
+
2744B99421F45429004F8E3F /* RNFBAnalyticsConsentSettingsMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RNFBAnalyticsConsentSettingsMapper.swift; path = RNFBAnalytics/RNFBAnalyticsConsentSettingsMapper.swift; sourceTree = SOURCE_ROOT; };
|
|
36
|
+
RNFBAN000000000000000007 /* RNFBAnalyticsHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAnalyticsHelper.h; path = RNFBAnalytics/RNFBAnalyticsHelper.h; sourceTree = SOURCE_ROOT; };
|
|
37
|
+
RNFBAN000000000000000008 /* RNFBAnalyticsHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAnalyticsHelper.m; path = RNFBAnalytics/RNFBAnalyticsHelper.m; sourceTree = SOURCE_ROOT; };
|
|
31
38
|
/* End PBXFileReference section */
|
|
32
39
|
|
|
33
40
|
/* Begin PBXFrameworksBuildPhase section */
|
|
@@ -56,7 +63,11 @@
|
|
|
56
63
|
2744B98C21F45C64004F8E3F /* common */,
|
|
57
64
|
2744B98421F45429004F8E3F /* RNFBAnalyticsModule.h */,
|
|
58
65
|
2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */,
|
|
66
|
+
RNFBAN000000000000000007 /* RNFBAnalyticsHelper.h */,
|
|
67
|
+
RNFBAN000000000000000008 /* RNFBAnalyticsHelper.m */,
|
|
59
68
|
2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */,
|
|
69
|
+
2744B99221F45429004F8E3F /* RNFBAnalyticsJavascriptParamsCleaner.swift */,
|
|
70
|
+
2744B99421F45429004F8E3F /* RNFBAnalyticsConsentSettingsMapper.swift */,
|
|
60
71
|
);
|
|
61
72
|
path = RNFBAnalytics;
|
|
62
73
|
sourceTree = "<group>";
|
|
@@ -128,7 +139,10 @@
|
|
|
128
139
|
buildActionMask = 2147483647;
|
|
129
140
|
files = (
|
|
130
141
|
2744B98621F45429004F8E3F /* RNFBAnalyticsModule.mm in Sources */,
|
|
142
|
+
RNFBAN000000000000000006 /* RNFBAnalyticsHelper.m in Sources */,
|
|
131
143
|
2744B99021F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift in Sources */,
|
|
144
|
+
2744B99121F45429004F8E3F /* RNFBAnalyticsJavascriptParamsCleaner.swift in Sources */,
|
|
145
|
+
2744B99321F45429004F8E3F /* RNFBAnalyticsConsentSettingsMapper.swift in Sources */,
|
|
132
146
|
);
|
|
133
147
|
runOnlyForDeploymentPostprocessing = 0;
|
|
134
148
|
};
|
|
@@ -170,7 +184,7 @@
|
|
|
170
184
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
171
185
|
SDKROOT = iphoneos;
|
|
172
186
|
SKIP_INSTALL = YES;
|
|
173
|
-
SWIFT_VERSION = 5.
|
|
187
|
+
SWIFT_VERSION = 5.10;
|
|
174
188
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
175
189
|
};
|
|
176
190
|
name = Debug;
|
|
@@ -205,7 +219,7 @@
|
|
|
205
219
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
206
220
|
SDKROOT = iphoneos;
|
|
207
221
|
SKIP_INSTALL = YES;
|
|
208
|
-
SWIFT_VERSION = 5.
|
|
222
|
+
SWIFT_VERSION = 5.10;
|
|
209
223
|
TARGETED_DEVICE_FAMILY = "1,2";
|
|
210
224
|
VALIDATE_PRODUCT = YES;
|
|
211
225
|
};
|