Skip to content

Commit 9f09fa5

Browse files
committed
Fix forwarding didReceiveRemoteNotification
While didReceiveRemoteNotification has been deprecated for a while there may still be some older apps still expecting this to be called and OneSignal should not cause any side effects. Apple's iOS logic is both didReceiveRemoteNotification and didReceiveRemoteNotification:fetchCompletionHandler are defined only the newer API will be called. This means OneSignal must also replicate this logic to prevent side effects. https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623117-application?language=objc Also removed our swizzling on didReceiveRemoteNotification as we no longer support iOS 6. Apple added application:didReceiveRemoteNotification:fetchCompletionHandler: in iOS 7 so we could have dropped this swizzling awhile ago.
1 parent 9c6ea40 commit 9f09fa5

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

iOS_SDK/OneSignalSDK/Source/UIApplicationDelegate+OneSignal.m

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,6 @@ + (void)sizzlePreiOS10MethodsPhase2 {
129129
if ([OneSignalHelper isIOSVersionGreaterThanOrEqual:@"10.0"])
130130
return;
131131

132-
injectToProperClass(@selector(oneSignalReceivedRemoteNotification:userInfo:),
133-
@selector(application:didReceiveRemoteNotification:), delegateSubclasses, [OneSignalAppDelegate class], delegateClass);
134-
135132
injectToProperClass(@selector(oneSignalLocalNotificationOpened:notification:),
136133
@selector(application:didReceiveLocalNotification:), delegateSubclasses, [OneSignalAppDelegate class], delegateClass);
137134
}
@@ -184,17 +181,6 @@ - (void)oneSignalDidRegisterUserNotifications:(UIApplication*)application settin
184181
[self oneSignalDidRegisterUserNotifications:application settings:notificationSettings];
185182
}
186183
#pragma clang diagnostic pop
187-
// Fallback method - Normally this would not fire as oneSignalReceiveRemoteNotification below will fire instead. Was needed for iOS 6 support in the past.
188-
- (void)oneSignalReceivedRemoteNotification:(UIApplication*)application userInfo:(NSDictionary*)userInfo {
189-
[OneSignal onesignalLog:ONE_S_LL_VERBOSE message:@"oneSignalReceivedRemoteNotification:userInfo:"];
190-
191-
if ([OneSignal appId]) {
192-
[OneSignal notificationReceived:userInfo wasOpened:YES];
193-
}
194-
195-
if ([self respondsToSelector:@selector(oneSignalReceivedRemoteNotification:userInfo:)])
196-
[self oneSignalReceivedRemoteNotification:application userInfo:userInfo];
197-
}
198184

199185
// Fires when a notication is opened or recieved while the app is in focus.
200186
// - Also fires when the app is in the background and a notificaiton with content-available=1 is received.
@@ -238,15 +224,35 @@ - (void) oneSignalReceiveRemoteNotification:(UIApplication*)application UserInfo
238224
return;
239225
}
240226

241-
// Make sure not a cold start from tap on notification (OS doesn't call didReceiveRemoteNotification)
242-
if ([self respondsToSelector:@selector(oneSignalReceivedRemoteNotification:userInfo:)]
243-
&& ![[OneSignal valueForKey:@"coldStartFromTapOnNotification"] boolValue])
244-
[self oneSignalReceivedRemoteNotification:application userInfo:userInfo];
227+
[OneSignalAppDelegate
228+
forwardToDepercatedApplication:application
229+
didReceiveRemoteNotification:userInfo];
245230

246231
if (!startedBackgroundJob)
247232
completionHandler(UIBackgroundFetchResultNewData);
248233
}
249234

235+
// Forwards to application:didReceiveRemoteNotification: in the rare case
236+
// that the app happens to use this BUT doesn't use
237+
// UNUserNotificationCenterDelegate OR
238+
// application:didReceiveRemoteNotification:fetchCompletionHandler:
239+
// https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623117-application?language=objc
240+
+(void)forwardToDepercatedApplication:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo {
241+
id<UIApplicationDelegate> originalDelegate = UIApplication.sharedApplication.delegate;
242+
if (![originalDelegate respondsToSelector:@selector(application:didReceiveRemoteNotification:)])
243+
return;
244+
245+
// Make sure we don't forward to this depreated selector on cold start
246+
// from a notification open, since iOS itself doesn't call this either
247+
if ([[OneSignal valueForKey:@"coldStartFromTapOnNotification"] boolValue])
248+
return;
249+
250+
#pragma clang diagnostic push
251+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
252+
[originalDelegate application:application didReceiveRemoteNotification:userInfo];
253+
#pragma clang diagnostic pop
254+
}
255+
250256
#pragma clang diagnostic push
251257
#pragma clang diagnostic ignored "-Wdeprecated"
252258
- (void) oneSignalLocalNotificationOpened:(UIApplication*)application handleActionWithIdentifier:(NSString*)identifier forLocalNotification:(UILocalNotification*)notification completionHandler:(void(^)()) completionHandler {

0 commit comments

Comments
 (0)