Skip to content

Commit 2609f02

Browse files
authored
Fix Deliver Quietly (#433)
* Fix Deliver Quietly • Our SDK was not detecting the 'deliver quietly' option of iOS 12 in some conditions • This fix adds a notificationTypes check so that our backend does not assume the device has notifications disabled * Update Notification Types Correctly • Since we do not evaluate the raw integer value of notificationTypes anywhere (it is used as a bitmask) this commit changes the way we increment notificationTypes when deliver quietly/provisional settings are enabled. * Add Regression Test • Adds a test to ensure the SDK will correctly detect if 'Deliver Quietly' is enabled
1 parent 0e7923b commit 2609f02

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignalNotificationSettingsIOS10.m

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,13 @@ - (void)getNotificationPermissionState:(void (^)(OSPermissionState *subscription
8080
+ (settings.alertSetting == UNNotificationSettingEnabled ? 4 : 0)
8181
+ (settings.lockScreenSetting == UNNotificationSettingEnabled ? 8 : 0);
8282

83-
if ([OneSignalHelper isIOSVersionGreaterOrEqual:12.0])
84-
if (status.notificationTypes == 0 && settings.authorizationStatus == provisionalStatus)
85-
status.notificationTypes = PROVISIONAL_UNAUTHORIZATIONOPTION;
83+
// check if using provisional notifications
84+
if ([OneSignalHelper isIOSVersionGreaterOrEqual:12.0] && settings.authorizationStatus == provisionalStatus)
85+
status.notificationTypes += PROVISIONAL_UNAUTHORIZATIONOPTION;
86+
87+
// also check if 'deliver quietly' is enabled.
88+
if ([OneSignalHelper isIOSVersionGreaterOrEqual:10.0] && settings.notificationCenterSetting == UNNotificationSettingEnabled)
89+
status.notificationTypes += 16;
8690

8791
self.useCachedStatus = true;
8892
completionHandler(status);

iOS_SDK/OneSignalSDK/UnitTests/Shadows/UNUserNotificationCenterOverrider.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,13 @@ + (void)mockInteralGetNotificationSettingsWithCompletionHandler:(void(^)(id sett
133133
id retSettings = [UNNotificationSettings alloc];
134134
[retSettings setValue:authorizationStatus forKeyPath:@"authorizationStatus"];
135135

136-
if (notifTypesOverride >= 7) {
136+
if (notifTypesOverride >= 7 && notifTypesOverride != 16) {
137137
[retSettings setValue:[NSNumber numberWithInt:UNNotificationSettingEnabled] forKeyPath:@"badgeSetting"];
138138
[retSettings setValue:[NSNumber numberWithInt:UNNotificationSettingEnabled] forKeyPath:@"soundSetting"];
139139
[retSettings setValue:[NSNumber numberWithInt:UNNotificationSettingEnabled] forKeyPath:@"alertSetting"];
140140
[retSettings setValue:[NSNumber numberWithInt:UNNotificationSettingEnabled] forKeyPath:@"lockScreenSetting"];
141+
} else if (notifTypesOverride == 16) {
142+
[retSettings setValue:[NSNumber numberWithInt:UNNotificationSettingEnabled] forKey:@"notificationCenterSetting"];
141143
}
142144

143145
//if (getNotificationSettingsWithCompletionHandlerStackCount > 1)

iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,33 @@ - (void)testTestPermissionChangeObserverWithNativeiOS10PromptCall {
566566
@"<OSSubscriptionStateChanges:\nfrom: <OSPermissionState: hasPrompted: 1, status: Denied, provisional: 0>,\nto: <OSPermissionState: hasPrompted: 1, status: Authorized, provisional: 0>\n>");
567567
}
568568

569+
- (void)testDeliverQuietly {
570+
[OneSignalUNUserNotificationCenter setUseiOS10_2_workaround:false];
571+
572+
[UnitTestCommonMethods setCurrentNotificationPermissionAsUnanswered];
573+
[OneSignal initWithLaunchOptions:nil appId:@"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"
574+
handleNotificationAction:nil
575+
settings:@{kOSSettingsKeyAutoPrompt: @false}];
576+
577+
OSPermissionStateTestObserver* observer = [OSPermissionStateTestObserver new];
578+
[OneSignal addPermissionObserver:observer];
579+
580+
[self backgroundApp];
581+
582+
//answer the prompt to allow notification
583+
[UnitTestCommonMethods answerNotificationPrompt:true];
584+
585+
// user notification center will return only `notificationCenterSetting` enabled
586+
// this mimics enabling 'Deliver Quietly'
587+
[UNUserNotificationCenterOverrider setNotifTypesOverride:(1 << 4)];
588+
[UnitTestCommonMethods runBackgroundThreads];
589+
590+
let permissionState = OneSignal.getPermissionSubscriptionState.permissionStatus;
591+
592+
// OneSignal should detect that deliver quietly is enabled and set the 5th bit to true
593+
XCTAssertTrue((permissionState.notificationTypes >> 4) & 1);
594+
}
595+
569596
- (void)testPermissionChangeObserverWithDecline {
570597
[UnitTestCommonMethods setCurrentNotificationPermissionAsUnanswered];
571598
[OneSignal initWithLaunchOptions:nil appId:@"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"

0 commit comments

Comments
 (0)