Skip to content

Commit f50fd5e

Browse files
authored
Bug where wrappers always using inAppAlert for notifications (#607)
* Bug where wrappers always using `inAppAlert` for notifications * Bug caused by adding an `initDone` to iOS native * Fixed by creating an `initSettings` method and doing all settings work before `initDone` every time * Broken unit tests fixed now * Added `registeredWithApple` static bool to `clearStatics` * Also needed to add more to `initSettings` method
1 parent 145372a commit f50fd5e

File tree

1 file changed

+70
-67
lines changed

1 file changed

+70
-67
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 70 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ + (void)clearStatics {
426426
requestedProvisionalAuthorization = false;
427427

428428
app_id = nil;
429+
registeredWithApple = false;
429430
_osNotificationSettings = nil;
430431
waitingForApnsResponse = false;
431432
waitingForOneSReg = false;
@@ -530,6 +531,7 @@ + (id)initWithLaunchOptions:(NSDictionary*)launchOptions
530531
}
531532

532533
[OneSignalCacheCleaner cleanCachedUserData];
534+
[OneSignal checkIfApplicationImplementsDeprecatedMethods];
533535

534536
let success = [self initAppId:appId withSettings:settings];
535537
if (!success)
@@ -540,6 +542,9 @@ + (id)initWithLaunchOptions:(NSDictionary*)launchOptions
540542
if (!_didCallDownloadParameters && appId && appId != (id)[NSNull null])
541543
[self downloadIOSParamsWithAppId:appId];
542544

545+
let standardUserDefaults = OneSignalUserDefaults.initStandard;
546+
[self initSettings:settings withStandardUserDefaults:standardUserDefaults];
547+
543548
if (initDone)
544549
return self;
545550
initDone = true;
@@ -552,74 +557,7 @@ + (id)initWithLaunchOptions:(NSDictionary*)launchOptions
552557

553558
if (appId && mShareLocation)
554559
[OneSignalLocation getLocation:false];
555-
556-
let standardUserDefaults = OneSignalUserDefaults.initStandard;
557-
[OneSignal checkIfApplicationImplementsDeprecatedMethods];
558-
559-
if ([OneSignalHelper isIOSVersionGreaterThanOrEqual:@"8.0"])
560-
registeredWithApple = self.currentPermissionState.accepted;
561-
else
562-
registeredWithApple = self.currentSubscriptionState.pushToken || [standardUserDefaults getSavedBoolForKey:OSUD_REGISTERED_WITH_APPLE defaultValue:false];
563-
564-
// Check if disabled in-app launch url if passed a NO
565-
if (settings[kOSSettingsKeyInAppLaunchURL] && [settings[kOSSettingsKeyInAppLaunchURL] isKindOfClass:[NSNumber class]])
566-
[self enableInAppLaunchURL:[settings[kOSSettingsKeyInAppLaunchURL] boolValue]];
567-
else if (![standardUserDefaults keyExists:OSUD_NOTIFICATION_OPEN_LAUNCH_URL]) {
568-
// Only need to default to true if the app doesn't already have this setting saved in NSUserDefaults
569-
[self enableInAppLaunchURL:true];
570-
}
571-
572-
if (settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] && [settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] isKindOfClass:[NSNumber class]]) {
573-
promptBeforeOpeningPushURLs = [settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] boolValue];
574-
[standardUserDefaults saveBoolForKey:OSUD_PROMPT_BEFORE_NOTIFICATION_LAUNCH_URL_OPENS withValue:promptBeforeOpeningPushURLs];
575-
}
576-
else
577-
promptBeforeOpeningPushURLs = [standardUserDefaults getSavedBoolForKey:OSUD_PROMPT_BEFORE_NOTIFICATION_LAUNCH_URL_OPENS defaultValue:false];
578-
579-
usesAutoPrompt = YES;
580-
if (settings[kOSSettingsKeyAutoPrompt] && [settings[kOSSettingsKeyAutoPrompt] isKindOfClass:[NSNumber class]])
581-
usesAutoPrompt = [settings[kOSSettingsKeyAutoPrompt] boolValue];
582-
583-
if (settings[kOSSettingsKeyProvidesAppNotificationSettings] && [settings[kOSSettingsKeyProvidesAppNotificationSettings] isKindOfClass:[NSNumber class]] && [OneSignalHelper isIOSVersionGreaterThanOrEqual:@"12.0"])
584-
providesAppNotificationSettings = [settings[kOSSettingsKeyProvidesAppNotificationSettings] boolValue];
585560

586-
// Register with Apple's APNS server if we registed once before or if auto-prompt hasn't been disabled.
587-
if (usesAutoPrompt || registeredWithApple)
588-
[self registerForPushNotifications];
589-
else {
590-
[self checkProvisionalAuthorizationStatus];
591-
[self registerForAPNsToken];
592-
}
593-
594-
/* Check if in-app setting passed assigned
595-
* LOGIC: Default - InAppAlerts enabled / InFocusDisplayOption InAppAlert.
596-
* Priority for kOSSettingsKeyInFocusDisplayOption.
597-
*/
598-
NSNumber *IAASetting = settings[kOSSettingsKeyInAppAlerts];
599-
let inAppAlertsPassed = IAASetting && (IAASetting.integerValue == 0 || IAASetting.integerValue == 1);
600-
601-
NSNumber *IFDSetting = settings[kOSSettingsKeyInFocusDisplayOption];
602-
let inFocusDisplayPassed = IFDSetting && IFDSetting.integerValue > -1 && IFDSetting.integerValue < 3;
603-
604-
if (inAppAlertsPassed || inFocusDisplayPassed) {
605-
if (!inFocusDisplayPassed)
606-
self.inFocusDisplayType = (OSNotificationDisplayType)IAASetting.integerValue;
607-
else
608-
self.inFocusDisplayType = (OSNotificationDisplayType)IFDSetting.integerValue;
609-
}
610-
611-
if (self.currentSubscriptionState.userId)
612-
[self registerUser];
613-
else {
614-
[self.osNotificationSettings getNotificationPermissionState:^(OSPermissionState *state) {
615-
if (state.answeredPrompt) {
616-
[self registerUser];
617-
} else {
618-
[self registerUserAfterDelay];
619-
}
620-
}];
621-
}
622-
623561
/*
624562
* No need to call the handleNotificationOpened:userInfo as it will be called from one of the following selectors
625563
* - application:didReceiveRemoteNotification:fetchCompletionHandler
@@ -704,6 +642,71 @@ + (bool)initAppId:(NSString*)appId withSettings:(NSDictionary*)settings {
704642
return true;
705643
}
706644

645+
+ (void)initSettings:(NSDictionary*)settings withStandardUserDefaults:(OneSignalUserDefaults*)standardUserDefaults {
646+
if ([OneSignalHelper isIOSVersionGreaterThanOrEqual:@"8.0"])
647+
registeredWithApple = self.currentPermissionState.accepted;
648+
else
649+
registeredWithApple = self.currentSubscriptionState.pushToken || [standardUserDefaults getSavedBoolForKey:OSUD_REGISTERED_WITH_APPLE defaultValue:false];
650+
651+
// Check if disabled in-app launch url if passed a NO
652+
if (settings[kOSSettingsKeyInAppLaunchURL] && [settings[kOSSettingsKeyInAppLaunchURL] isKindOfClass:[NSNumber class]])
653+
[self enableInAppLaunchURL:[settings[kOSSettingsKeyInAppLaunchURL] boolValue]];
654+
else if (![standardUserDefaults keyExists:OSUD_NOTIFICATION_OPEN_LAUNCH_URL]) {
655+
// Only need to default to true if the app doesn't already have this setting saved in NSUserDefaults
656+
[self enableInAppLaunchURL:true];
657+
}
658+
659+
if (settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] && [settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] isKindOfClass:[NSNumber class]]) {
660+
promptBeforeOpeningPushURLs = [settings[kOSSSettingsKeyPromptBeforeOpeningPushURL] boolValue];
661+
[standardUserDefaults saveBoolForKey:OSUD_PROMPT_BEFORE_NOTIFICATION_LAUNCH_URL_OPENS withValue:promptBeforeOpeningPushURLs];
662+
}
663+
else
664+
promptBeforeOpeningPushURLs = [standardUserDefaults getSavedBoolForKey:OSUD_PROMPT_BEFORE_NOTIFICATION_LAUNCH_URL_OPENS defaultValue:false];
665+
666+
usesAutoPrompt = YES;
667+
if (settings[kOSSettingsKeyAutoPrompt] && [settings[kOSSettingsKeyAutoPrompt] isKindOfClass:[NSNumber class]])
668+
usesAutoPrompt = [settings[kOSSettingsKeyAutoPrompt] boolValue];
669+
670+
if (settings[kOSSettingsKeyProvidesAppNotificationSettings] && [settings[kOSSettingsKeyProvidesAppNotificationSettings] isKindOfClass:[NSNumber class]] && [OneSignalHelper isIOSVersionGreaterThanOrEqual:@"12.0"])
671+
providesAppNotificationSettings = [settings[kOSSettingsKeyProvidesAppNotificationSettings] boolValue];
672+
673+
// Register with Apple's APNS server if we registed once before or if auto-prompt hasn't been disabled.
674+
if (usesAutoPrompt || registeredWithApple)
675+
[self registerForPushNotifications];
676+
else {
677+
[self checkProvisionalAuthorizationStatus];
678+
[self registerForAPNsToken];
679+
}
680+
681+
/* Check if in-app setting passed assigned
682+
* LOGIC: Default - InAppAlerts enabled / InFocusDisplayOption InAppAlert.
683+
* Priority for kOSSettingsKeyInFocusDisplayOption.
684+
*/
685+
NSNumber *IAASetting = settings[kOSSettingsKeyInAppAlerts];
686+
let inAppAlertsPassed = IAASetting && (IAASetting.integerValue == 0 || IAASetting.integerValue == 1);
687+
688+
NSNumber *IFDSetting = settings[kOSSettingsKeyInFocusDisplayOption];
689+
let inFocusDisplayPassed = IFDSetting && IFDSetting.integerValue > -1 && IFDSetting.integerValue < 3;
690+
691+
if (inAppAlertsPassed || inFocusDisplayPassed) {
692+
if (!inFocusDisplayPassed)
693+
self.inFocusDisplayType = (OSNotificationDisplayType)IAASetting.integerValue;
694+
else
695+
self.inFocusDisplayType = (OSNotificationDisplayType)IFDSetting.integerValue;
696+
}
697+
698+
if (self.currentSubscriptionState.userId)
699+
[self registerUser];
700+
else {
701+
[self.osNotificationSettings getNotificationPermissionState:^(OSPermissionState *state) {
702+
if (state.answeredPrompt)
703+
[self registerUser];
704+
else
705+
[self registerUserAfterDelay];
706+
}];
707+
}
708+
}
709+
707710
// Checks to see if we should register for APNS' new Provisional authorization
708711
// (also known as Direct to History).
709712
// This behavior is determined by the OneSignal Parameters request

0 commit comments

Comments
 (0)