didReceiveRemoteNotification not working in the background
Implementing didReceiveRemoteNotification
and didReceiveRemoteNotification:fetchCompletionHandler
is the correct way, but you also need to do the following:
Make sure to register for remote notifications, see documentation here:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; return YES;}
Also make sure to edit Info.plist
and check the "Enable Background Modes" and "Remote notifications" check boxes:
Additionally, you need to add "content-available":1
to your push notification payload, otherwise the app won't be woken if it's in the background (see documentation here updated):
For a push notification to trigger a download operation, thenotification’s payload must include the content-available key with itsvalue set to 1. When that key is present, the system wakes the app inthe background (or launches it into the background) and calls the appdelegate’sapplication:didReceiveRemoteNotification:fetchCompletionHandler:method. Your implementation of that method should download therelevant content and integrate it into your app
So payload should at least look like this:
{ aps = { "content-available" : 1, sound : "" };}
- Register for push notification in app delegate.
- Add background mode in app capabilities.
- Add "content-available"="1" while sending the push notification(if you are using firebase replace "content-available"="1" by "content_available"="true" while sending the push notification from server side).
I had the same problem. Notification banner appeared, but -application:didReceiveRemoteNotification:fetchCompletionHandler: method was not called. The solution for me that worked was to add implementation of - application:didReceiveRemoteNotification: method and forward call to -application:didReceiveRemoteNotification:fetchCompletionHandler::
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in }}