我注意到在iOS 11 beta 2上,application:didReceiveRemoteNotification:fetchCompletionHandler
无论应用程序的状态(背景/前景)如何,静默通知都不会传递到。
我实现了该UIApplicationDelegete
方法,application:didReceiveRemoteNotification:fetchCompletionHandler
并发送以下静默推送
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
但在iOS 11上未调用委托方法。
它在其他版本的iOS上也能正常工作,而文档部分“ 配置静默通知”中并未提及需要执行其他任何操作。
这是iOS 11中的错误,还是我错过了iOS 11中的新功能?
请注意,我并不是在谈论或使用该UserNotification
框架,而该框架不需要发送静默推送。
这是一个说明问题的示例项目(您必须设置自己的bundle id)
当您午餐示例项目并将上述有效负载发送到应用程序时,您可以使用macOS控制台查看推送是否正确传递到设备,而不是正确传递给应用程序。
更新10.08
看来该行为是随机的。有时在重新启动设备后,有效负载会正确交付,但一段时间后它将停止工作。
如下面的屏幕快照所示,标记为1的推送仅发送给设备,推送2(在设备重启后)也传递给应用程序。
更新14.08-iOS 11 Beta 6
仍然是相同的行为。以下是应该起作用但不起作用的另一件事。当应用程序的方案设置为“等待启动可执行文件”时,应该以静默方式唤醒应用程序并在后台启动它。
更新21.08-iOS 11 Beta 7
仍然是相同的行为,并且错误报告中没有来自Apple的更新。
更新29.08-iOS 11 Beta 8
还是一样的问题。现在使用的重现步骤如下:
- 在Xcode项目方案中,选择“等待可执行文件启动”
- 在中添加断点
didReceiveRemoteNotification: fetchCompletionHandler
- 在设备上启动应用
- 发送以上无声推送
预期:该应用程序从暂停状态进入后台,并且didReceiveRemoteNotification: fetchCompletionHandler
被称为
实际:什么也没发生
更新06.09-iOS 11 Beta 10
我仍然有同样的越野车行为。苹果的票证已更新为以下答案:
Apple开发人员关系2017年9月6日,下午10:42工程部已就此问题提供了以下反馈:
我们能够使示例应用程序运行并测试行为。按说明进行测试时,我们没有发现任何问题。
当应用程序在后台运行时,不能保证推送会到达该应用程序,并且此处的日志表明我们认为该应用程序的使用率不足以启动它。
我们确实看到我们在情况良好时不时地进行推送。
我们认为这是正确的行为。
更新11.09
我的Apple错误报告已关闭,并被标记为重复33278611
打开
更新13.09-iOS 11 GM
感谢kam800的评论(见下文),我进行了更多测试,并提出了以下观察结果:
iOS 11 dasd DuetActivitySchedulerDaemon
中似乎有一个新的守护程序,它要么完全丢弃数据推送,要么延迟数据推送交付:
交货推迟
控制台日志
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
交货延迟
- 推迟数据推送交付并启动应用程序时,仅在达到交付日期(可能是未来几分钟)的情况下才交付数据推送。这完全破坏了使用数据推送来保持新应用程序内容为下一次启动做好准备的目的。我在这里再次引用Apple的文档:
“无声通知可以帮助您确保应用程序即使在未运行时也保持最新状态,从而改善了用户体验。”
- 当两次数据推送发送到已暂停的应用程序时,它们会被iOS 11推迟,而不是直接唤醒应用程序。到达交付时间后,仅交付最后的数据推送!先前的推送将丢失,并且不会通过委托方法传递,从而导致数据丢失。
交货已取消
控制台日志
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
取消交货问题
好吧,在这种情况下,数据推送完全丢失,并且在iOS 10上正确交付时也从未在iOS 11上交付过。
更新19.09-iOS 11 GM
我还注意到,当应用程序位于前台并且通知未传递到应用程序时,我在控制台中看到以下日志:
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
"content-available": 1
,并且应用程序处于前台,则不会触发回调。