Ver Fonte

Send first open time in Remote Config fetch request (#9663)

* Extract first open time from analytics user properties

* Add tests

* Address comments

* Update tests
karenyz há 4 anos atrás
pai
commit
b58ae5344b

+ 26 - 10
FirebaseRemoteConfig/Sources/RCNConfigSettings.m

@@ -28,6 +28,7 @@
 static NSString *const kRCNGroupPrefix = @"frc.group.";
 static NSString *const kRCNUserDefaultsKeyNamelastETag = @"lastETag";
 static NSString *const kRCNUserDefaultsKeyNameLastSuccessfulFetchTime = @"lastSuccessfulFetchTime";
+static NSString *const kRCNAnalyticsFirstOpenTimePropertyName = @"_fot";
 static const int kRCNExponentialBackoffMinimumInterval = 60 * 2;       // 2 mins.
 static const int kRCNExponentialBackoffMaximumInterval = 60 * 60 * 4;  // 4 hours.
 
@@ -359,16 +360,31 @@ static const int kRCNExponentialBackoffMaximumInterval = 60 * 60 * 4;  // 4 hour
 
   if (userProperties && userProperties.count > 0) {
     NSError *error;
-    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userProperties
-                                                       options:0
-                                                         error:&error];
-    if (!error) {
-      ret = [ret
-          stringByAppendingString:[NSString
-                                      stringWithFormat:@", analytics_user_properties:%@",
-                                                       [[NSString alloc]
-                                                           initWithData:jsonData
-                                                               encoding:NSUTF8StringEncoding]]];
+
+    // Extract first open time from user properties and send as a separate field
+    NSNumber *firstOpenTime = userProperties[kRCNAnalyticsFirstOpenTimePropertyName];
+    NSMutableDictionary *remainingUserProperties = [userProperties mutableCopy];
+    if (firstOpenTime != nil) {
+      NSDate *date = [NSDate dateWithTimeIntervalSince1970:([firstOpenTime longValue] / 1000)];
+      NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
+      NSString *firstOpenTimeISOString = [formatter stringFromDate:date];
+      ret = [ret stringByAppendingString:[NSString stringWithFormat:@", first_open_time:'%@'",
+                                                                    firstOpenTimeISOString]];
+
+      [remainingUserProperties removeObjectForKey:kRCNAnalyticsFirstOpenTimePropertyName];
+    }
+    if (remainingUserProperties.count > 0) {
+      NSData *jsonData = [NSJSONSerialization dataWithJSONObject:remainingUserProperties
+                                                         options:0
+                                                           error:&error];
+      if (!error) {
+        ret = [ret
+            stringByAppendingString:[NSString
+                                        stringWithFormat:@", analytics_user_properties:%@",
+                                                         [[NSString alloc]
+                                                             initWithData:jsonData
+                                                                 encoding:NSUTF8StringEncoding]]];
+      }
     }
   }
   ret = [ret stringByAppendingString:@"}"];

+ 28 - 0
FirebaseRemoteConfig/Tests/Unit/RCNRemoteConfigTest.m

@@ -79,6 +79,10 @@
 + (NSUserDefaults *)sharedUserDefaultsForBundleIdentifier:(NSString *)bundleIdentifier;
 @end
 
+@interface RCNConfigSettings (Test)
+- (NSString *)nextRequestWithUserProperties:(NSDictionary *)userProperties;
+@end
+
 typedef NS_ENUM(NSInteger, RCNTestRCInstance) {
   RCNTestRCInstanceDefault,
   RCNTestRCInstanceSecondNamespace,
@@ -1415,6 +1419,30 @@ static NSString *UTCToLocal(NSString *utcTime) {
   }
 }
 
+- (void)testFetchRequestWithUserPropertiesOnly {
+  NSDictionary *userProperties = @{@"user_key" : @"user_value"};
+  NSString *req = [_settings nextRequestWithUserProperties:userProperties];
+
+  XCTAssertTrue([req containsString:@"analytics_user_properties:{\"user_key\":\"user_value\"}"]);
+  XCTAssertFalse([req containsString:@"first_open_time"]);
+}
+
+- (void)testFetchRequestWithFirstOpenTimeAndUserProperties {
+  NSDictionary *userProperties = @{@"_fot" : @1649116800000, @"user_key" : @"user_value"};
+  NSString *req = [_settings nextRequestWithUserProperties:userProperties];
+
+  XCTAssertTrue([req containsString:@"first_open_time:'2022-04-05T00:00:00Z'"]);
+  XCTAssertTrue([req containsString:@"analytics_user_properties:{\"user_key\":\"user_value\"}"]);
+}
+
+- (void)testFetchRequestFirstOpenTimeOnly {
+  NSDictionary *userProperties = @{@"_fot" : @1650315600000};
+  NSString *req = [_settings nextRequestWithUserProperties:userProperties];
+
+  XCTAssertTrue([req containsString:@"first_open_time:'2022-04-18T21:00:00Z'"]);
+  XCTAssertFalse([req containsString:@"analytics_user_properties"]);
+}
+
 #pragma mark - Public Factory Methods
 
 - (void)testConfigureConfigWithValidInput {