Skip to content

Commit b470851

Browse files
authored
Merge 59c4ffb into 136e71f
2 parents 136e71f + 59c4ffb commit b470851

File tree

2 files changed

+54
-10
lines changed

2 files changed

+54
-10
lines changed

FirebaseRemoteConfig/Sources/RCNConfigSettings.m

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
static NSString *const kRCNGroupPrefix = @"frc.group.";
2929
static NSString *const kRCNUserDefaultsKeyNamelastETag = @"lastETag";
3030
static NSString *const kRCNUserDefaultsKeyNameLastSuccessfulFetchTime = @"lastSuccessfulFetchTime";
31+
static NSString *const kRCNAnalyticsFirstOpenTimePropertyName = @"_fot";
3132
static const int kRCNExponentialBackoffMinimumInterval = 60 * 2; // 2 mins.
3233
static const int kRCNExponentialBackoffMaximumInterval = 60 * 60 * 4; // 4 hours.
3334

@@ -359,16 +360,31 @@ - (NSString *)nextRequestWithUserProperties:(NSDictionary *)userProperties {
359360

360361
if (userProperties && userProperties.count > 0) {
361362
NSError *error;
362-
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userProperties
363-
options:0
364-
error:&error];
365-
if (!error) {
366-
ret = [ret
367-
stringByAppendingString:[NSString
368-
stringWithFormat:@", analytics_user_properties:%@",
369-
[[NSString alloc]
370-
initWithData:jsonData
371-
encoding:NSUTF8StringEncoding]]];
363+
364+
// Extract first open time from user properties and send as a separate field
365+
NSNumber *firstOpenTime = userProperties[kRCNAnalyticsFirstOpenTimePropertyName];
366+
NSMutableDictionary *remainingUserProperties = [userProperties mutableCopy];
367+
if (firstOpenTime != nil) {
368+
NSDate *date = [NSDate dateWithTimeIntervalSince1970:([firstOpenTime longValue] / 1000)];
369+
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
370+
NSString *firstOpenTimeISOString = [formatter stringFromDate:date];
371+
ret = [ret stringByAppendingString:[NSString stringWithFormat:@", first_open_time:'%@'",
372+
firstOpenTimeISOString]];
373+
374+
[remainingUserProperties removeObjectForKey:kRCNAnalyticsFirstOpenTimePropertyName];
375+
}
376+
if (remainingUserProperties.count > 0) {
377+
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:remainingUserProperties
378+
options:0
379+
error:&error];
380+
if (!error) {
381+
ret = [ret
382+
stringByAppendingString:[NSString
383+
stringWithFormat:@", analytics_user_properties:%@",
384+
[[NSString alloc]
385+
initWithData:jsonData
386+
encoding:NSUTF8StringEncoding]]];
387+
}
372388
}
373389
}
374390
ret = [ret stringByAppendingString:@"}"];

FirebaseRemoteConfig/Tests/Unit/RCNRemoteConfigTest.m

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ @interface RCNUserDefaultsManager (Test)
7979
+ (NSUserDefaults *)sharedUserDefaultsForBundleIdentifier:(NSString *)bundleIdentifier;
8080
@end
8181

82+
@interface RCNConfigSettings (Test)
83+
- (NSString *)nextRequestWithUserProperties:(NSDictionary *)userProperties;
84+
@end
85+
8286
typedef NS_ENUM(NSInteger, RCNTestRCInstance) {
8387
RCNTestRCInstanceDefault,
8488
RCNTestRCInstanceSecondNamespace,
@@ -1415,6 +1419,30 @@ - (void)testSetFetchTimeoutConfigSetting {
14151419
}
14161420
}
14171421

1422+
- (void)testFetchRequestWithUserPropertiesOnly {
1423+
NSDictionary *userProperties = @{@"user_key" : @"user_value"};
1424+
NSString *req = [_settings nextRequestWithUserProperties:userProperties];
1425+
1426+
XCTAssertTrue([req containsString:@"analytics_user_properties:{\"user_key\":\"user_value\"}"]);
1427+
XCTAssertFalse([req containsString:@"first_open_time"]);
1428+
}
1429+
1430+
- (void)testFetchRequestWithFirstOpenTimeAndUserProperties {
1431+
NSDictionary *userProperties = @{@"_fot" : @1649116800000, @"user_key" : @"user_value"};
1432+
NSString *req = [_settings nextRequestWithUserProperties:userProperties];
1433+
1434+
XCTAssertTrue([req containsString:@"first_open_time:'2022-04-05T00:00:00Z'"]);
1435+
XCTAssertTrue([req containsString:@"analytics_user_properties:{\"user_key\":\"user_value\"}"]);
1436+
}
1437+
1438+
- (void)testFetchRequestFirstOpenTimeOnly {
1439+
NSDictionary *userProperties = @{@"_fot" : @1650315600000};
1440+
NSString *req = [_settings nextRequestWithUserProperties:userProperties];
1441+
1442+
XCTAssertTrue([req containsString:@"first_open_time:'2022-04-18T21:00:00Z'"]);
1443+
XCTAssertFalse([req containsString:@"analytics_user_properties"]);
1444+
}
1445+
14181446
#pragma mark - Public Factory Methods
14191447

14201448
- (void)testConfigureConfigWithValidInput {

0 commit comments

Comments
 (0)