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..804bc0f5 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/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"); } diff --git a/CleverTapSDKTests/CTPreferencesTest.m b/CleverTapSDKTests/CTPreferencesTest.m index b40c9975..2621ec60 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