I noticed that on iOS 11 beta 2, the silent notifications are not delivered to the application:didReceiveRemoteNotification:fetchCompletionHandler
regardless the state of the app (background / foreground).
I implemented the UIApplicationDelegete
method application:didReceiveRemoteNotification:fetchCompletionHandler
and I send the following silent push
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
but the delegate method is not called on iOS 11.
It works fine on other versions of iOS and the documentation section Configuring a Silent Notification does not mention that anything else should be done.
Is this a bug in iOS 11 or did I miss something new in iOS 11?
Please note that I'm not talking about or using the UserNotification
framework which should not be needed for sending silent pushes.
Here is a sample project that illustrates the issue (you'll have to set your own bundle id)
When you lunch the sample project and send a above payload to the app, you can use the macOS console to see that the push is correctly delivered to the device but not to the app.
UPDATE 10.08
It appears that the behaviour is random. Sometimes after restarting the device, the payload is delivered correctly but it stops working after a while.
As you can see on the following screenshot, the push marked as 1 is delievered only to the device and the push 2 (after device restart) is also delivered to the app.
UPDATE 14.08 - iOS 11 Beta 6
Still the same behaviour. Another thing that is supposed to work but does not is the following. When the application's scheme is set to "Wait for executable to be launched", a silent push is supposed to wake up the app and start it in background.
UPDATE 21.08 - iOS 11 Beta 7
Still the same behaviour and not updates from Apple in the bug report.
UPDATE 29.08 - iOS 11 Beta 8
Still the same problem. The steps to reproduce I use now are the following:
- In the Xcode project scheme, select "Wait for executable to be launched"
- Add a breakpoint in the
didReceiveRemoteNotification: fetchCompletionHandler
- Start the app on device
- Send the above silent push
Expected: The app is brought from suspended state to background and the didReceiveRemoteNotification: fetchCompletionHandler
is called
Actual: nothing happens
UPDATE 06.09 - iOS 11 Beta 10
I'm still having the same buggy behaviour. The ticket from Apple was updated with the following answer:
Apple Developer Relations September 6 2017, 10:42 PM Engineering has provided the following feedback regarding this issue:
We were able to get the sample app running and test the behavior. We didn’t see any issues when we tested this as described.
Pushes aren't guaranteed to arrive to the app when it is running in the background, and the logs here indicate we don't believe the app is being used enough to launch it.
We do see us delivering pushes from time to time when conditions are good.
We believe this is behaving correctly.
Update 11.09
My Apple bug report was closed and marked as duplicate of 33278611
which remains open
UPDATE 13.09 - iOS 11 GM
Thanks to kam800's comments (see below) I did more testing and came up with those observations:
There seem to be a new daemon in iOS 11 dasd DuetActivitySchedulerDaemon
that either completely discards the data push or delays the data push delivery:
Delivery postponed
Console Logs
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Postponed delivery issues
- When the data push delivery is postponed and the app is launched, the data push is delivered only when the delivery date is reached which can be several minutes in the future. This defeats completely the purpose of using data pushes to keep the new app's content ready for the next launch. I quote here once again Apple's documentation:
"Silent notifications improve the user experience by helping you keep your app up-to-date, even when it is not running."
- When two data pushes are sent to a suspended app they are postponed by iOS 11 instead of waking up the app directly. When delivery time is reached, only the last data push is delivered! The previous pushes are lost and not delivered via the delegate method resulting in a data loss.
Delivery cancelled
Console Logs
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Cancelled delivery issues
Well in this case, the data push is completely lost and never delivered on iOS 11 while it was delivered correctly on iOS 10.
UPDATE 19.09 - iOS 11 GM
I also noticed that when the application is in the foreground and the notification is not delivered to the app, I see the following logs in the console:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
{ "aps": { "content-available": 1 } }
the breakpoint will actually work in background, but only in background... hope this will help a bit with your testing – InductiondidReceiveRemoteNotification
breakpoint in debug mode anymore. – Smootdasd
and post what does it say when your push is received (in suspended mode) and your breakpoint it hit? – ConjecturalUIApplicationExitsOnSuspend
key in the app's plist, launch the app then press the home button. The app is directly brought to a suspended mode. When you send the silent pushes at this time, they are not delivered as I mentioned in my "UPDATE 13.09 - iOS 11 GM" – Conjecturalwas of unexpected class 'NSNull'
error constantly, after rebooting the device everything worked as expected – Manos"content-available": 1
, and the app is in foreground, the callback will not be fired. – StreetlightUIBackgroundModes
set toremote-notification
in your plist? – Conjectural