From cf0151ddb45dd1148d0c12a753ca842f1f05777e Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 15:38:43 -0700 Subject: [PATCH 1/7] feat: add method to get device ID synchronously --- Sources/Amplitude/Amplitude.m | 4 ++++ Sources/Amplitude/Public/Amplitude.h | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/Sources/Amplitude/Amplitude.m b/Sources/Amplitude/Amplitude.m index c080ecf6..39dddc38 100644 --- a/Sources/Amplitude/Amplitude.m +++ b/Sources/Amplitude/Amplitude.m @@ -1672,6 +1672,10 @@ - (NSString *)getDeviceId { return self.deviceId; } +- (NSString *)getDeviceIdSync { + return [self initializeDeviceId]; +} + - (long long)getSessionId { return _sessionId; } diff --git a/Sources/Amplitude/Public/Amplitude.h b/Sources/Amplitude/Public/Amplitude.h index 8fa9ee39..5be0f8d7 100644 --- a/Sources/Amplitude/Public/Amplitude.h +++ b/Sources/Amplitude/Public/Amplitude.h @@ -726,6 +726,13 @@ typedef void (^AMPInitCompletionBlock)(void); */ - (NSString *)getDeviceId; +/** + Fetches the deviceId synchronously. This must be called after initialization, but will access the device ID from the storage or generate one if the asynchronous intialization function has not reached that point yet. The device ID is a unique identifier shared between multiple users using the same app on the same device. + + @returns the deviceId. + */ +- (NSString *)getDeviceIdSync; + /** Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you are doing. This can be used in conjunction with setUserId:nil to anonymize users after they log out. With a nil userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. From 2e30d1c4ca2b282a9321c5192a002e25cd93497b Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 15:49:18 -0700 Subject: [PATCH 2/7] fix: add sync for device ID --- Sources/Amplitude/Amplitude.m | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Sources/Amplitude/Amplitude.m b/Sources/Amplitude/Amplitude.m index 39dddc38..ac56ce87 100644 --- a/Sources/Amplitude/Amplitude.m +++ b/Sources/Amplitude/Amplitude.m @@ -1681,11 +1681,13 @@ - (long long)getSessionId { } - (NSString *)initializeDeviceId { - if (self.deviceId == nil) { - self.deviceId = [self.dbHelper getValue:DEVICE_ID]; - if (![self isValidDeviceId:self.deviceId]) { - self.deviceId = [self _getDeviceId]; - [self.dbHelper insertOrReplaceKeyValue:DEVICE_ID value:self.deviceId]; + @synchronized (self) { + if (self.deviceId == nil) { + self.deviceId = [self.dbHelper getValue:DEVICE_ID]; + if (![self isValidDeviceId:self.deviceId]) { + self.deviceId = [self _getDeviceId]; + [self.dbHelper insertOrReplaceKeyValue:DEVICE_ID value:self.deviceId]; + } } } return self.deviceId; From eca6cc20624eb83bb234980d6a9249ce600ca48c Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 17:30:44 -0700 Subject: [PATCH 3/7] fix: remove sync method, call initializeDeviceID from getDeviceId --- Sources/Amplitude/Amplitude.m | 4 ---- Sources/Amplitude/Public/Amplitude.h | 7 ------- 2 files changed, 11 deletions(-) diff --git a/Sources/Amplitude/Amplitude.m b/Sources/Amplitude/Amplitude.m index ac56ce87..74e94613 100644 --- a/Sources/Amplitude/Amplitude.m +++ b/Sources/Amplitude/Amplitude.m @@ -1669,10 +1669,6 @@ - (NSString *)getAdSupportID { } - (NSString *)getDeviceId { - return self.deviceId; -} - -- (NSString *)getDeviceIdSync { return [self initializeDeviceId]; } diff --git a/Sources/Amplitude/Public/Amplitude.h b/Sources/Amplitude/Public/Amplitude.h index 5be0f8d7..8fa9ee39 100644 --- a/Sources/Amplitude/Public/Amplitude.h +++ b/Sources/Amplitude/Public/Amplitude.h @@ -726,13 +726,6 @@ typedef void (^AMPInitCompletionBlock)(void); */ - (NSString *)getDeviceId; -/** - Fetches the deviceId synchronously. This must be called after initialization, but will access the device ID from the storage or generate one if the asynchronous intialization function has not reached that point yet. The device ID is a unique identifier shared between multiple users using the same app on the same device. - - @returns the deviceId. - */ -- (NSString *)getDeviceIdSync; - /** Regenerates a new random deviceId for current user. Note: this is not recommended unless you know what you are doing. This can be used in conjunction with setUserId:nil to anonymize users after they log out. With a nil userId and a completely new deviceId, the current user would appear as a brand new user in dashboard. From 2fc7f3ea8e2d809ac24b10b8f3166f982348e941 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 18:38:04 -0700 Subject: [PATCH 4/7] test: add nil check and fix/update tests --- Sources/Amplitude/Amplitude.m | 5 ++++- Tests/AmplitudeTests.m | 8 ++++++++ Tests/SetupTests.m | 3 --- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Sources/Amplitude/Amplitude.m b/Sources/Amplitude/Amplitude.m index 74e94613..2c9f3d11 100644 --- a/Sources/Amplitude/Amplitude.m +++ b/Sources/Amplitude/Amplitude.m @@ -1669,7 +1669,10 @@ - (NSString *)getAdSupportID { } - (NSString *)getDeviceId { - return [self initializeDeviceId]; + if (self.deviceId == nil) { + return [self initializeDeviceId]; + } + return self.deviceId; } - (long long)getSessionId { diff --git a/Tests/AmplitudeTests.m b/Tests/AmplitudeTests.m index af997e1f..1f3db4aa 100644 --- a/Tests/AmplitudeTests.m +++ b/Tests/AmplitudeTests.m @@ -1705,4 +1705,12 @@ - (void)testOpenURLFiresDeepLinkEvent { XCTAssertEqualObjects([[event objectForKey:@"event_properties"] objectForKey:kAMPEventPropLinkUrl], @"https://test-app.com"); } +- (void)testGetDeviceIdAfterInit { + NSString *instanceName = @"testGetDeviceIdAfterInit"; + Amplitude *client = [Amplitude instanceWithName:instanceName]; + [client initializeApiKey:@"test"]; + NSString *deviceId = [client getDeviceId]; + XCTAssertNotEqual(deviceId, @""); +} + @end diff --git a/Tests/SetupTests.m b/Tests/SetupTests.m index 3d9fdcf4..d1a85467 100644 --- a/Tests/SetupTests.m +++ b/Tests/SetupTests.m @@ -115,15 +115,12 @@ - (void)testUserPropertiesSet { - (void)testSetDeviceId { AMPDatabaseHelper *dbHelper = [AMPDatabaseHelper getDatabaseHelper]; - NSString *initialDeviceId = [self.amplitude getDeviceId]; - XCTAssertNil(initialDeviceId); // device id not initialized yet [self.amplitude initializeApiKey:apiKey]; [self.amplitude flushQueueWithQueue:self.amplitude.initializerQueue]; [self.amplitude flushQueue]; NSString *generatedDeviceId = [self.amplitude getDeviceId]; XCTAssertNotNil(generatedDeviceId); - XCTAssertNotEqualObjects(initialDeviceId, generatedDeviceId); #if !TARGET_OS_OSX XCTAssertEqual(generatedDeviceId.length, 36); #else From f454d26dbee6bbc317338368e2414a6da3e42e98 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 18:46:46 -0700 Subject: [PATCH 5/7] add another test for getDeviceId prior to initialize --- Tests/AmplitudeTests.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/AmplitudeTests.m b/Tests/AmplitudeTests.m index 1f3db4aa..a5b5b306 100644 --- a/Tests/AmplitudeTests.m +++ b/Tests/AmplitudeTests.m @@ -1705,10 +1705,21 @@ - (void)testOpenURLFiresDeepLinkEvent { XCTAssertEqualObjects([[event objectForKey:@"event_properties"] objectForKey:kAMPEventPropLinkUrl], @"https://test-app.com"); } +- (void)testGetDeviceIdBeforeInit { + NSString *instanceName = @"testGetDeviceIdBeforeInit"; + Amplitude *client = [Amplitude instanceWithName:instanceName]; + NSString *deviceId = [client getDeviceId]; + XCTAssertNotEqual(deviceId, @""); + [client initializeApiKey:@"testGetDeviceIdBeforeInit"]; + NSString *deviceIdAfterInit = [client getDeviceId]; + XCTAssertEqual(deviceId, deviceIdAfterInit); + +} + - (void)testGetDeviceIdAfterInit { NSString *instanceName = @"testGetDeviceIdAfterInit"; Amplitude *client = [Amplitude instanceWithName:instanceName]; - [client initializeApiKey:@"test"]; + [client initializeApiKey:@"testGetDeviceIdAfterInit"]; NSString *deviceId = [client getDeviceId]; XCTAssertNotEqual(deviceId, @""); } From 819bba4145cb957bb415327f01e892c514200f65 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 19:23:49 -0700 Subject: [PATCH 6/7] fix tests --- Tests/AmplitudeTests.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/AmplitudeTests.m b/Tests/AmplitudeTests.m index a5b5b306..44e4e2b2 100644 --- a/Tests/AmplitudeTests.m +++ b/Tests/AmplitudeTests.m @@ -1712,7 +1712,7 @@ - (void)testGetDeviceIdBeforeInit { XCTAssertNotEqual(deviceId, @""); [client initializeApiKey:@"testGetDeviceIdBeforeInit"]; NSString *deviceIdAfterInit = [client getDeviceId]; - XCTAssertEqual(deviceId, deviceIdAfterInit); + XCTAssertEqualObjects(deviceId, deviceIdAfterInit); } @@ -1721,7 +1721,7 @@ - (void)testGetDeviceIdAfterInit { Amplitude *client = [Amplitude instanceWithName:instanceName]; [client initializeApiKey:@"testGetDeviceIdAfterInit"]; NSString *deviceId = [client getDeviceId]; - XCTAssertNotEqual(deviceId, @""); + XCTAssertNotEqualObjects(deviceId, @""); } @end From b1bd536821db2ce28137029e064bc790169d0ad9 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 3 Apr 2024 19:36:45 -0700 Subject: [PATCH 7/7] remove test --- Tests/AmplitudeTests.m | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Tests/AmplitudeTests.m b/Tests/AmplitudeTests.m index 44e4e2b2..48ae32ed 100644 --- a/Tests/AmplitudeTests.m +++ b/Tests/AmplitudeTests.m @@ -1705,17 +1705,6 @@ - (void)testOpenURLFiresDeepLinkEvent { XCTAssertEqualObjects([[event objectForKey:@"event_properties"] objectForKey:kAMPEventPropLinkUrl], @"https://test-app.com"); } -- (void)testGetDeviceIdBeforeInit { - NSString *instanceName = @"testGetDeviceIdBeforeInit"; - Amplitude *client = [Amplitude instanceWithName:instanceName]; - NSString *deviceId = [client getDeviceId]; - XCTAssertNotEqual(deviceId, @""); - [client initializeApiKey:@"testGetDeviceIdBeforeInit"]; - NSString *deviceIdAfterInit = [client getDeviceId]; - XCTAssertEqualObjects(deviceId, deviceIdAfterInit); - -} - - (void)testGetDeviceIdAfterInit { NSString *instanceName = @"testGetDeviceIdAfterInit"; Amplitude *client = [Amplitude instanceWithName:instanceName];