From a7ba5959061e1bc087d71a0633c1aad4462c2bd5 Mon Sep 17 00:00:00 2001 From: Aishwarya Nanna Date: Tue, 18 Jun 2024 13:06:29 +0530 Subject: [PATCH 1/6] - Migrate NSUserDefaults from standard to suite instance for CT - Migrate existing CT data from standard to suite instance on 1st launch - Update and Add Unit Tests for implementation --- CleverTapSDK/CTPreferences.h | 2 ++ CleverTapSDK/CTPreferences.m | 39 +++++++++++++++++---- CleverTapSDK/CleverTap.m | 1 + CleverTapSDKTests/CTPreferencesTest.m | 49 +++++++++++++++++++++------ 4 files changed, 74 insertions(+), 17 deletions(-) diff --git a/CleverTapSDK/CTPreferences.h b/CleverTapSDK/CTPreferences.h index cab14306..01c40062 100644 --- a/CleverTapSDK/CTPreferences.h +++ b/CleverTapSDK/CTPreferences.h @@ -27,4 +27,6 @@ + (NSString *_Nonnull)filePathfromFileName:(NSString *_Nonnull)filename; ++ (void) migrateCTUserDefaultsData; + @end diff --git a/CleverTapSDK/CTPreferences.m b/CleverTapSDK/CTPreferences.m index 72edd22a..a420c3a2 100644 --- a/CleverTapSDK/CTPreferences.m +++ b/CleverTapSDK/CTPreferences.m @@ -2,12 +2,14 @@ #import "CTConstants.h" #define PREF_PREFIX @"WizRocket" +#define SUITE_NAME @"Clevertap" @implementation CTPreferences + (long)getIntForKey:(NSString *)key withResetValue:(long)resetValue { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; id value = [defaults objectForKey:key]; if ([value isKindOfClass:[NSNumber class]]) { return ((long) [value longLongValue]); @@ -20,14 +22,16 @@ + (long)getIntForKey:(NSString *)key withResetValue:(long)resetValue { + (void)putInt:(long)resetValue forKey:(NSString *)key { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; [defaults setObject:@(resetValue) forKey:key]; [defaults synchronize]; } + (NSString *_Nullable)getStringForKey:(NSString *_Nonnull)key withResetValue:(NSString *_Nullable)resetValue { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; id value = [defaults objectForKey:key]; if ([value isKindOfClass:[NSString class]]) { return value; @@ -42,27 +46,31 @@ + (NSString *_Nullable)getStringForKey:(NSString *_Nonnull)key withResetValue:(N + (void)putString:(NSString *)resetValue forKey:(NSString *)key { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; [defaults setObject:resetValue forKey:key]; [defaults synchronize]; } + (id)getObjectForKey:(NSString *)key { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; return [defaults objectForKey:key]; } + (void)putObject:(id)object forKey:(NSString *)key { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; [defaults setObject:object forKey:key]; [defaults synchronize]; } + (void)removeObjectForKey:(NSString *)key { key = [NSString stringWithFormat:@"%@%@", PREF_PREFIX, key]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; [defaults removeObjectForKey:key]; [defaults synchronize]; } @@ -191,4 +199,21 @@ + (NSString * _Nonnull)storageKeyWithSuffix: (NSString * _Nonnull)suffix config: return [NSString stringWithFormat:@"%@:%@", config.accountId, suffix]; } ++ (void)migrateCTUserDefaultsData{ + NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *standardDefaultsDict = [standardDefaults dictionaryRepresentation]; + NSUserDefaults *ctDefaults = [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]; + + for (NSString *key in standardDefaultsDict) { + if ([key containsString:PREF_PREFIX]){ + id value = standardDefaultsDict[key]; + [ctDefaults setObject:value forKey:key]; + [standardDefaults removeObjectForKey:key]; + } + } + + [standardDefaults synchronize]; + [ctDefaults synchronize]; +} + @end diff --git a/CleverTapSDK/CleverTap.m b/CleverTapSDK/CleverTap.m index cf86d25f..18f88690 100644 --- a/CleverTapSDK/CleverTap.m +++ b/CleverTapSDK/CleverTap.m @@ -336,6 +336,7 @@ + (nullable instancetype)autoIntegrateWithCleverTapID:(NSString *)cleverTapID { + (nullable instancetype)_autoIntegrateWithCleverTapID:(NSString *)cleverTapID { CleverTapLogStaticInfo("%@: Auto Integration enabled", self); + [CTPreferences migrateCTUserDefaultsData]; isAutoIntegrated = YES; [CTSwizzleManager swizzleAppDelegate]; CleverTap *instance = cleverTapID ? [CleverTap sharedInstanceWithCleverTapID:cleverTapID] : [CleverTap sharedInstance]; diff --git a/CleverTapSDKTests/CTPreferencesTest.m b/CleverTapSDKTests/CTPreferencesTest.m index b40c9975..fa0623e2 100644 --- a/CleverTapSDKTests/CTPreferencesTest.m +++ b/CleverTapSDKTests/CTPreferencesTest.m @@ -17,12 +17,12 @@ @interface CTPreferencesTest : XCTestCase @implementation CTPreferencesTest - (void)setUp { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@(2333333333333333333) forKey:@"WizRocketlongValueForTesting"]; } - (void)tearDown { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults removeObjectForKey:@"WizRocketlongValueForTesting"]; } @@ -51,7 +51,7 @@ -(void)test_putInt_withInvalidKey { } - (void)test_getStringForKey_withValidKey { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; NSString *stringValue = [CTPreferences getStringForKey:@"stringValueForTesting" withResetValue:@"testResetStringValue"]; @@ -60,7 +60,7 @@ - (void)test_getStringForKey_withValidKey { } - (void)test_getStringForKey_withInvalidKey { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; NSString *stringValue = [CTPreferences getStringForKey:@"invalidTestKey" withResetValue:@"testResetStringValue"]; @@ -83,18 +83,18 @@ -(void)test_putString_withInvalidKey { } - (void)test_getObjectForKey_withValidKey { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; - + id idValue = [CTPreferences getObjectForKey:@"stringValueForTesting"]; XCTAssertEqualObjects(idValue, @"stringValueForTesting"); } - (void)test_getObjectForKey_withInvalidKey { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; - + id idValue = [CTPreferences getObjectForKey:@"invalidTestStringKey"]; XCTAssertNil(idValue); @@ -112,13 +112,42 @@ -(void)test_putObject_withInvalidKey { } -(void)test_removeObjectForKey { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; [defaults setObject:@"objectValueForTesting" forKey:@"WizRocketobjectValueForTesting"]; - + [CTPreferences removeObjectForKey:@"objectValueForTesting"]; id checkValue = [CTPreferences getObjectForKey:@"WizRocketobjectValueForTesting"]; XCTAssertNil(checkValue); } + +-(void)test_migrateCTUserDefaultsData { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSUserDefaults *ctDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + + // Set test data + [defaults setObject:@"TestValue1" forKey:@"WizRocket_TestKey1"]; + [defaults setObject:@"TestValue2" forKey:@"WizRocket_TestKey2"]; + [defaults setObject:@"OtherValue" forKey:@"OtherKey"]; + [defaults synchronize]; + + // Call the method to migrate data + [CTPreferences migrateCTUserDefaultsData]; + + // Verify that data with PREF_PREFIX is migrated to CleverTap user defaults + XCTAssertEqualObjects([ctDefaults objectForKey:@"WizRocket_TestKey1"], @"TestValue1"); + XCTAssertEqualObjects([ctDefaults objectForKey:@"WizRocket_TestKey2"], @"TestValue2"); + + // Verify that data without PREF_PREFIX is not migrated + XCTAssertNil([ctDefaults objectForKey:@"OtherKey"]); + + // Verify that data with PREF_PREFIX is removed from standard user defaults + XCTAssertNil([defaults objectForKey:@"WizRocket_TestKey1"]); + XCTAssertNil([defaults objectForKey:@"WizRocket_TestKey2"]); + + // Verify that data without PREF_PREFIX is not removed from standard user defaults + XCTAssertEqualObjects([defaults objectForKey:@"OtherKey"], @"OtherValue"); +} + @end From 2c188dc1c4a808b98f67f1173b5da0961635600a Mon Sep 17 00:00:00 2001 From: Aishwarya Nanna Date: Tue, 18 Jun 2024 13:23:30 +0530 Subject: [PATCH 2/6] - Selected Team for CT targets to resolve Test case failure --- CleverTapSDK.xcodeproj/project.pbxproj | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CleverTapSDK.xcodeproj/project.pbxproj b/CleverTapSDK.xcodeproj/project.pbxproj index 583bc56f..fe047222 100644 --- a/CleverTapSDK.xcodeproj/project.pbxproj +++ b/CleverTapSDK.xcodeproj/project.pbxproj @@ -2491,10 +2491,11 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=appletvos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2525,10 +2526,11 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=appletvos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2870,10 +2872,11 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2916,10 +2919,11 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; From 4b1118f41afd6856ac389ba8d1ab286b1dcfb10b Mon Sep 17 00:00:00 2001 From: Aishwarya Nanna Date: Tue, 18 Jun 2024 13:28:50 +0530 Subject: [PATCH 3/6] Revert "- Selected Team for CT targets to resolve Test case failure" This reverts commit 2c188dc1c4a808b98f67f1173b5da0961635600a. --- CleverTapSDK.xcodeproj/project.pbxproj | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/CleverTapSDK.xcodeproj/project.pbxproj b/CleverTapSDK.xcodeproj/project.pbxproj index fe047222..583bc56f 100644 --- a/CleverTapSDK.xcodeproj/project.pbxproj +++ b/CleverTapSDK.xcodeproj/project.pbxproj @@ -2491,11 +2491,10 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=appletvos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2526,11 +2525,10 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=appletvos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2872,11 +2870,10 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2919,11 +2916,10 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A5J34NR598; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; From e3b4c27713dd3486f188bebc7d9a19aced972975 Mon Sep 17 00:00:00 2001 From: Aishwarya Nanna Date: Tue, 18 Jun 2024 14:54:45 +0530 Subject: [PATCH 4/6] - Update Suite name to "CleverTap" --- CleverTapSDK/CTPreferences.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CleverTapSDK/CTPreferences.m b/CleverTapSDK/CTPreferences.m index a420c3a2..804bc0f5 100644 --- a/CleverTapSDK/CTPreferences.m +++ b/CleverTapSDK/CTPreferences.m @@ -2,7 +2,7 @@ #import "CTConstants.h" #define PREF_PREFIX @"WizRocket" -#define SUITE_NAME @"Clevertap" +#define SUITE_NAME @"CleverTap" @implementation CTPreferences From 52022805a7c153f9a76edaf59863c8d51d9b1dd7 Mon Sep 17 00:00:00 2001 From: Aishwarya Nanna Date: Wed, 26 Jun 2024 15:52:02 +0530 Subject: [PATCH 5/6] - Updated SuiteName in test cases - Updated migration calling place --- CleverTapSDK/CleverTap.m | 2 +- CleverTapSDKTests/CTPreferencesTest.m | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CleverTapSDK/CleverTap.m b/CleverTapSDK/CleverTap.m index 18f88690..ae825069 100644 --- a/CleverTapSDK/CleverTap.m +++ b/CleverTapSDK/CleverTap.m @@ -336,7 +336,6 @@ + (nullable instancetype)autoIntegrateWithCleverTapID:(NSString *)cleverTapID { + (nullable instancetype)_autoIntegrateWithCleverTapID:(NSString *)cleverTapID { CleverTapLogStaticInfo("%@: Auto Integration enabled", self); - [CTPreferences migrateCTUserDefaultsData]; isAutoIntegrated = YES; [CTSwizzleManager swizzleAppDelegate]; CleverTap *instance = cleverTapID ? [CleverTap sharedInstanceWithCleverTapID:cleverTapID] : [CleverTap sharedInstance]; @@ -446,6 +445,7 @@ + (instancetype)_instanceWithConfig:(CleverTapInstanceConfig *)config andCleverT - (instancetype)initWithConfig:(CleverTapInstanceConfig*)config andCleverTapID:(NSString *)cleverTapID { self = [super init]; if (self) { + [CTPreferences migrateCTUserDefaultsData]; _config = [config copy]; if (_config.analyticsOnly) { CleverTapLogDebug(_config.logLevel, @"%@ is configured as analytics only!", self); diff --git a/CleverTapSDKTests/CTPreferencesTest.m b/CleverTapSDKTests/CTPreferencesTest.m index fa0623e2..2621ec60 100644 --- a/CleverTapSDKTests/CTPreferencesTest.m +++ b/CleverTapSDKTests/CTPreferencesTest.m @@ -17,12 +17,12 @@ @interface CTPreferencesTest : XCTestCase @implementation CTPreferencesTest - (void)setUp { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@(2333333333333333333) forKey:@"WizRocketlongValueForTesting"]; } - (void)tearDown { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults removeObjectForKey:@"WizRocketlongValueForTesting"]; } @@ -51,7 +51,7 @@ -(void)test_putInt_withInvalidKey { } - (void)test_getStringForKey_withValidKey { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; NSString *stringValue = [CTPreferences getStringForKey:@"stringValueForTesting" withResetValue:@"testResetStringValue"]; @@ -60,7 +60,7 @@ - (void)test_getStringForKey_withValidKey { } - (void)test_getStringForKey_withInvalidKey { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; NSString *stringValue = [CTPreferences getStringForKey:@"invalidTestKey" withResetValue:@"testResetStringValue"]; @@ -83,7 +83,7 @@ -(void)test_putString_withInvalidKey { } - (void)test_getObjectForKey_withValidKey { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; id idValue = [CTPreferences getObjectForKey:@"stringValueForTesting"]; @@ -92,7 +92,7 @@ - (void)test_getObjectForKey_withValidKey { } - (void)test_getObjectForKey_withInvalidKey { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@"stringValueForTesting" forKey:@"WizRocketstringValueForTesting"]; id idValue = [CTPreferences getObjectForKey:@"invalidTestStringKey"]; @@ -112,7 +112,7 @@ -(void)test_putObject_withInvalidKey { } -(void)test_removeObjectForKey { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; [defaults setObject:@"objectValueForTesting" forKey:@"WizRocketobjectValueForTesting"]; [CTPreferences removeObjectForKey:@"objectValueForTesting"]; @@ -124,7 +124,7 @@ -(void)test_removeObjectForKey { -(void)test_migrateCTUserDefaultsData { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSUserDefaults *ctDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"Clevertap"]; + NSUserDefaults *ctDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"CleverTap"]; // Set test data [defaults setObject:@"TestValue1" forKey:@"WizRocket_TestKey1"]; From 219fa3f88bef96e8dd7ca02692c78985135739bb Mon Sep 17 00:00:00 2001 From: Akash Malhotra <> Date: Wed, 24 Jul 2024 12:11:49 +0530 Subject: [PATCH 6/6] updated migrate call location --- CleverTapSDK/CleverTap.m | 1 - CleverTapSDK/CleverTapInstanceConfig.m | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CleverTapSDK/CleverTap.m b/CleverTapSDK/CleverTap.m index ae825069..cf86d25f 100644 --- a/CleverTapSDK/CleverTap.m +++ b/CleverTapSDK/CleverTap.m @@ -445,7 +445,6 @@ + (instancetype)_instanceWithConfig:(CleverTapInstanceConfig *)config andCleverT - (instancetype)initWithConfig:(CleverTapInstanceConfig*)config andCleverTapID:(NSString *)cleverTapID { self = [super init]; if (self) { - [CTPreferences migrateCTUserDefaultsData]; _config = [config copy]; if (_config.analyticsOnly) { CleverTapLogDebug(_config.logLevel, @"%@ is configured as analytics only!", self); diff --git a/CleverTapSDK/CleverTapInstanceConfig.m b/CleverTapSDK/CleverTapInstanceConfig.m index 8a3144b5..9e23d818 100644 --- a/CleverTapSDK/CleverTapInstanceConfig.m +++ b/CleverTapSDK/CleverTapInstanceConfig.m @@ -3,8 +3,10 @@ #import "CTPlistInfo.h" #import "CTConstants.h" #import "CTAES.h" +#import "CTPreferences.h" @implementation CleverTapInstanceConfig +static BOOL userDefaultsMigrated; - (void)encodeWithCoder:(NSCoder *)coder { @@ -216,6 +218,11 @@ - (void) setupPlistData:(BOOL)isDefault { - (void) checkIfAvailableAccountId:(NSString *)accountId accountToken:(NSString *)accountToken { + // MIGRATE USER DEFAULTS HERE BECAUSE CONFIGS ARE CREATED BEFORE CT INSTANCES + if (!userDefaultsMigrated) { + [CTPreferences migrateCTUserDefaultsData]; + userDefaultsMigrated = YES; + } if (accountId.length <= 0) { CleverTapLogStaticInfo("CleverTap accountId is empty"); }