I did some research on lots of stackoverflow issues and websites in trying to figure out how do the iOS push notifications influence AppDelegate
lifecycle methods and when is which method (not) getting triggered. Main focus of the research was on "standard" iOS push notifications (with alert
field) and silent ones (with just content-available
set to 1
) and on AppDelegate's application:didReceiveRemoteNotification
and application:didFinishLaunchingWithOptions
methods.
I don't want to ask lots of questions for different scenarios, but would rather try to write down the statements about different test cases I tried and ask you after that:
Is there any statement that is wrong and if yes, which one and why?
If standard push notification is sent, in the moment of push notification arrival, none of the methods gets triggered, app remains inactive in background. Once push notification has been tapped and app got opened because of it, application:didReceiveRemoteNotification
method got called and application:didFinishLaunchingWithOptions
doesn't get called. I tested this scenario right after putting the app to background and also after an app being in background for more than an hour - same behaviour. I guess that if for some reason iOS decided to kill my app while being in background, this test case becomes like Scenario 2, statement 1 from below, right?
If silent push notification is sent, in the moment of the push notification arrival, application:didReceiveRemoteNotification
method got called and application:didFinishLaunchingWithOptions
doesn't get called.
If standard push notification is sent, in the moment of push notification arrival, none of the methods get triggered, app remains killed. Once push notification has been tapped and app got opened because of it, application:didReceiveRemoteNotification
method got called and application:didFinishLaunchingWithOptions
doesn't get called.
If silent push notification is sent, none of the methods gets triggered since silent push notifications fail to be sent to the app that got killed. After opening an app after notification is sent, application:didFinishLaunchingWithOptions
gets called as part of the normal flow and without any push notification information. application:didReceiveRemoteNotification
doesn't get called.
If you can maybe think of some other real life scenarios that I maybe forgot to mention, I would be really grateful to find out about them and what happens in those cases.
Cheers
Thanks to Sandeep Bhandari for the update and additional scenarios. I forgot to mention in my original question that I was exploring scenarios in which application is arriving to the app that is currently not
in the foreground for whatever reason.
Adding Sandeep's scenarios to the list:
If standard push notification is sent application:didReceiveRemoteNotification
method will get called. application:didFinishLaunchingWithOptions
will not get called.
If silent push notification is sent application:didReceiveRemoteNotification
method will get called. application:didFinishLaunchingWithOptions
will not get called.
If standard push notification is sent application:didReceiveRemoteNotification
method will get called. application:didFinishLaunchingWithOptions
will not get called.
If silent push notification is sent application:didReceiveRemoteNotification
method will get called. application:didFinishLaunchingWithOptions
will not get called.
The app delegate is effectively the root object of your app, and it works in conjunction with UIApplication to manage some interactions with the system. Like the UIApplication object, UIKit creates your app delegate object early in your app's launch cycle so it's always present.
4 Types of Push Notifications Here are four types of push notifications, including mobile, to test in your next campaign. 1. Mobile app push notifications: generated via an app downloaded on a user's mobile device. Displayed in three locations: lock screen, banner and notification center.
An iOS push notification is a message that pops up on an Apple device such as an iPhone. Before receiving push notifications from an app, iOS device users must explicitly give permission. Once a user opts-in, mobile app publishers can send push notifications to the users' mobile devices.
I don't see any issue in the statement you made there, but I believe you missed to iterate over two more scenarios that I can think of.
App is in foreground and receives the push notification : didReceiveRemoteNotification
gets called as soon as APNS gets delievered to iOS and you can handle it by checking application state in didRecieveRemoteNotification
Method.
App being alive in background : I believe you are aware of background modes of iOS. If app is making use of expiration handler, app will be alive even if you put it to background by tapping on home button. Duration the app lives in background depends on various factors (some tutorials say app remains alive for 3 mins which I can't guarantee) Even in this case didReceiveRemoteNotification
gets called as soon as APNS gets delievered to iOS. Only this time app wont be in foreground but yet its alive!!!
From an experience and digging alot on the iOS push notification. App being in foreground or alive in background. both situations triggers same delegate methods. only
didReceiveRemoteNotification
.
The silent push notification have a different handler: (content-available 1 means silent notification)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}
When app is dead. didReceiveRemoteNotification
never called for regular push notification. It must be handled in didFinishLaunchingWithOptions
as following:
// handle notification when app is closed.
let notification = launchOptions?[.remoteNotification]
if notification != nil {
self.application(application, didReceiveRemoteNotification: notification as! [AnyHashable : Any])
}
Additional information:
To test receiving push notification when app is killed. remove from the list that appears when double tapping home button?
The proper way to see the logging and do debugging is by editting the run scheme and selecting Wait for executable to be launched:
Run the app from the xcode. Then send push notification from server and then tap the notification from notification center.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With