Reputation: 877
My app performs silent background fetch via push notifications. Everything is working fine, and push notifications sent from our server trigger silent background fetches as expected, when the user has opened the app within the last 60 minutes or a push notification has been sent within 60 minutes - even if the device is locked.
However, when the user doesn't open the app for 2-3 hours or when a push notification hasn't been sent in 2-3 hours, the app isn't receiving the push notification. I have been logging app activity, and I've confirmed that:
didReceiveRemoteNotification:fetchCompletionHandler:
is not being called on the app delegate.
A few more facts:
My understanding is that iOS should continue to wake the app up in the background and enable it to process the background fetch from the push notification - even after hours of inactivity (as long as the device is awake and has an internet connection).
I'm wondering if anyone else has experienced this, and if so, if you've found a workaround.
Thanks in advance!
Upvotes: 19
Views: 2542
Reputation: 21
go through
Targets > Capabilities > Background Modes
Turn on Background Modes
Upvotes: 1
Reputation: 76
Try this in your info.plist it worked for me.
This will awake your app to receive notification in background mode.
Upvotes: 0
Reputation: 1
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
Upvotes: 0
Reputation: 19926
There is no work-around as such. You can try PushKit
(iOS VOIP push notifications), which are more reliable but iOS8 only or VOIP persistent socket, which is available from iOS7 (much more difficult).
Apple does not guarantee immediate delivery for background / fetch push notifications (containing: content-available=1
).
Those notifications were designed to give app a chance
to update its content in between runs, not to be 'immediate
' nor reliable.
iOS will decide when to deliver this notifications based on undocumented, energy related conditions.
In other words - your app will be notified, only when iOS decides, it does not affect the battery. From my observations, it depends on many things, like:
I even noticed the difference between app running in debug session (by Xcode, connected by cable) - notifications were always delivered, and when I started app from Springboard / in release mode (different energy conditions) - then it started misbehaving.
Upvotes: 0