Skip to content

Commit 7240697

Browse files
committed
Confirmed deliveries fix for apps that upgrade
* Fixed confirm deliveries for those who have installed the app on an older SDK and upgrade to this one. - Fixed issue where we did not always save shared NSUserDefaults. - This also allows those who did not always have App Groups to get the values saved. * Added test for adding missing shared keys * NSUserDefaultsOverrider now supports suiteNames
1 parent ca80e37 commit 7240697

File tree

3 files changed

+74
-16
lines changed

3 files changed

+74
-16
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,15 +666,19 @@ + (bool)initAppId:(NSString*)appId withSettings:(NSDictionary*)settings {
666666
initDone = false;
667667
let sharedUserDefaults = OneSignalUserDefaults.initShared;
668668

669-
// Save app_id to both standard and shared NSUserDefaults
670669
[standardUserDefaults saveStringForKey:NSUD_APP_ID withValue:app_id];
671-
[sharedUserDefaults saveStringForKey:NSUD_APP_ID withValue:app_id];
672670

673671
// Remove player_id from both standard and shared NSUserDefaults
674672
[standardUserDefaults removeValueForKey:USERID];
675673
[sharedUserDefaults removeValueForKey:USERID];
676674
}
677675

676+
// Always save app_id and player_id as it will not be present on shared if:
677+
// - Updating from an older SDK
678+
// - Updating to an app that didn't have App Groups setup before
679+
[OneSignalUserDefaults.initShared saveStringForKey:NSUD_APP_ID withValue:app_id];
680+
[OneSignalUserDefaults.initShared saveStringForKey:USERID withValue:self.currentSubscriptionState.userId];
681+
678682
// Invalid app ids reaching here will cause failure
679683
if (!app_id || ![[NSUUID alloc] initWithUUIDString:app_id]) {
680684
onesignal_Log(ONE_S_LL_FATAL, @"OneSignal AppId format is invalid.\nExample: 'b2f7f966-d8cc-11e4-bed1-df8f05be55ba'\n");

iOS_SDK/OneSignalSDK/UnitTests/Shadows/NSUserDefaultsOverrider.m

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,19 @@
3030

3131
static NSMutableDictionary* defaultsDictionary;
3232

33-
@implementation NSUserDefaultsOverrider
33+
@implementation NSUserDefaultsOverrider {
34+
NSString *suiteName;
35+
}
36+
3437
+ (void)load {
35-
defaultsDictionary = [[NSMutableDictionary alloc] init];
38+
defaultsDictionary = [NSMutableDictionary new];
39+
40+
// Adding helpers to NSUserDefaults to be used internally
41+
injectToProperClass(@selector(getObjectForKey:), @selector(getObjectForKey:), @[], [NSUserDefaultsOverrider class], [NSUserDefaults class]);
42+
injectToProperClass(@selector(setObjectForKey:withValue:), @selector(setObjectForKey:withValue:), @[], [NSUserDefaultsOverrider class], [NSUserDefaults class]);
43+
44+
// initWithSuiteName overrider
45+
injectToProperClass(@selector(overrideInitWithSuiteName:), @selector(initWithSuiteName:), @[], [NSUserDefaultsOverrider class], [NSUserDefaults class]);
3646

3747
// Sets
3848
injectToProperClass(@selector(overrideSetObject:forKey:), @selector(setObject:forKey:), @[], [NSUserDefaultsOverrider class], [NSUserDefaults class]);
@@ -50,59 +60,83 @@ + (void)load {
5060
}
5161

5262
+ (void)clearInternalDictionary {
53-
defaultsDictionary = [[NSMutableDictionary alloc] init];
63+
defaultsDictionary = [NSMutableDictionary new];
64+
}
65+
66+
- (nullable instancetype)overrideInitWithSuiteName:(nullable NSString *)suitename {
67+
suiteName = suitename;
68+
return [self overrideInitWithSuiteName:suitename];
69+
}
70+
71+
- (void)setObjectForKey:(NSString*)key withValue:(id)value {
72+
if (!suiteName)
73+
suiteName = @"default";
74+
75+
if (!defaultsDictionary[suiteName])
76+
defaultsDictionary[suiteName] = [NSMutableDictionary new];
77+
78+
defaultsDictionary[suiteName][key] = value;
5479
}
5580

5681
// Sets
5782
-(void)overrideSetObject:(id)value forKey:(NSString*)key {
58-
defaultsDictionary[key] = value;
83+
[self setObjectForKey:key withValue:value];
5984
}
6085

6186
-(void)overrideSetString:(NSString*)value forKey:(NSString*)key {
62-
defaultsDictionary[key] = value;
87+
[self setObjectForKey:key withValue:value];
6388
}
6489

6590
- (void)overrideSetDouble:(double)value forKey:(NSString*)key {
66-
defaultsDictionary[key] = [NSNumber numberWithDouble:value];
91+
[self setObjectForKey:key withValue:[NSNumber numberWithDouble:value]];
6792
}
6893

6994
- (void)overrideSetBool:(BOOL)value forKey:(NSString*)key {
70-
defaultsDictionary[key] = [NSNumber numberWithBool:value];
95+
[self setObjectForKey:key withValue:[NSNumber numberWithBool:value]];
7196
}
7297

7398
- (void)overrideSetInteger:(NSInteger)value forKey:(NSString*)key {
74-
defaultsDictionary[key] = [NSNumber numberWithInteger:value];
99+
[self setObjectForKey:key withValue:[NSNumber numberWithInteger:value]];
100+
}
101+
102+
- (id)getObjectForKey:(NSString*)key {
103+
if (!suiteName)
104+
suiteName = @"default";
105+
106+
if (!defaultsDictionary[suiteName])
107+
defaultsDictionary[suiteName] = [NSMutableDictionary new];
108+
109+
return defaultsDictionary[suiteName][key];
75110
}
76111

77112
// Gets
78113
- (nullable id)overrideObjectForKey:(NSString*)key {
79114
if ([key isEqualToString:@"XCTIDEConnectionTimeout"])
80115
return [NSNumber numberWithInt:60];
81116

82-
return defaultsDictionary[key];
117+
return [self getObjectForKey:key];
83118
}
84119

85120
- (NSString*)overrideStringForKey:(NSString*)key {
86-
return defaultsDictionary[key];
121+
return [self getObjectForKey:key];
87122
}
88123

89124
- (NSInteger)overrideIntegerForKey:(NSString*)key {
90125
if ([key isEqualToString:@"XCTIDEConnectionTimeout"])
91126
return 60.0;
92127

93-
return [defaultsDictionary[key] integerValue];
128+
return [[self getObjectForKey:key] integerValue];
94129
}
95130

96131
- (double)overrideDoubleForKey:(NSString*)key {
97132
if ([key isEqualToString:@"XCTIDEConnectionTimeout"])
98133
return 60.0;
99134

100-
return [defaultsDictionary[key] doubleValue];
135+
return [[self getObjectForKey:key] doubleValue];
101136
}
102137

103138
- (BOOL)overrideBoolForKey:(NSString*)key {
104-
return [defaultsDictionary[key] boolValue];
139+
return [[self getObjectForKey:key] boolValue];
105140
}
106141

107142
@end
108-

iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#import "OneSignalNotificationSettingsIOS10.h"
4646
#import "OSPermission.h"
4747
#import "OSNotificationPayload+Internal.h"
48+
#import "OneSignalUserDefaults.h"
4849

4950
#import "TestHelperFunctions.h"
5051
#import "UnitTestAppDelegate.h"
@@ -1819,6 +1820,25 @@ - (void) testDidReceiveNotificationExtensionRequestDontOverrideCateogory {
18191820
XCTAssertEqualObjects(content.attachments[0].URL.scheme, @"file");
18201821
}
18211822

1823+
1824+
- (void)testAddingSharedKeysIfMissing {
1825+
// 1. Init SDK as normal
1826+
[UnitTestCommonMethods initOneSignalAndThreadWait];
1827+
1828+
// 2. Remove shared keys to simulate the state of coming from a pre-2.12.1 version
1829+
[OneSignalUserDefaults.initShared removeValueForKey:NSUD_APP_ID];
1830+
[OneSignalUserDefaults.initShared removeValueForKey:USERID];
1831+
1832+
// 3. Restart app
1833+
[UnitTestCommonMethods backgroundApp];
1834+
[UnitTestCommonMethods clearStateForAppRestart:self];
1835+
[UnitTestCommonMethods initOneSignalAndThreadWait];
1836+
1837+
// 4. Ensure values are present again
1838+
XCTAssertNotNil([OneSignalUserDefaults.initShared getSavedSetForKey:NSUD_APP_ID defaultValue:nil]);
1839+
XCTAssertNotNil([OneSignalUserDefaults.initShared getSavedSetForKey:USERID defaultValue:nil]);
1840+
}
1841+
18221842
// iOS 10 - Notification Service Extension test - local file
18231843
- (void) testDidReceiveNotificationExtensionRequestLocalFile {
18241844
id userInfo = @{@"aps": @{

0 commit comments

Comments
 (0)