我注意到,在 iOS 11 beta 2上,无论应用程序的状态如何(背景/前景) ,静默通知都不会发送到 application:didReceiveRemoteNotification:fetchCompletionHandler
。
我实现了 UIApplicationDelegete
方法 application:didReceiveRemoteNotification:fetchCompletionHandler
,并发送以下静默推送
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
但是在 iOS11上没有调用委托方法。
它在其他版本的 iOS 上运行良好,文档部分 配置静默通知没有提到应该做任何其他事情。
这是 iOS11中的一个 bug 还是我在 iOS11中遗漏了什么新的东西?
请注意,我不是在谈论或使用 UserNotification
框架,这不应该是发送无声推。
下面的 样本项目说明了这个问题(您必须设置您自己的 bundle id)
当您使示例项目进入午餐状态并向应用程序发送上述有效负载时,您可以使用 macOS 控制台查看推送是否正确地传递到设备,而不是传递到应用程序。
看来这种行为是随机的。有时在重新启动设备之后,有效载荷被正确地传递,但是过了一会儿就停止工作了。
正如你在下面的屏幕截图中看到的,标记为1的按下只传递给设备,而推2(在设备重启后)也传递给应用程序。
还是老样子。另一件应该有效但是没有效果的事情是下面的。当应用程序的方案被设置为“等待可执行程序启动”时,一个静默的推动应该会唤醒应用程序并在后台启动它。
仍然是同样的行为,而且在 bug 报告中没有苹果的更新。
仍然是同样的问题。我现在使用的复制步骤如下:
didReceiveRemoteNotification: fetchCompletionHandler
中添加断点期望 : 应用程序从暂停状态到后台,调用 didReceiveRemoteNotification: fetchCompletionHandler
实际 : 什么都没有发生
我仍然有同样的错误行为。苹果的罚单更新了以下答案:
Apple Developer Relations September 62017,10:42 PM 2017年9月6日,10:42 PM 就这一问题提供了以下反馈意见:
我们能够让示例应用程序运行并测试行为 当我们按照描述进行测试时,没有发现任何问题。
当应用程序运行时,推送并不能保证到达应用程序 背景,这里的日志显示我们不相信这个应用 足以发射它。
我们确实看到我们时不时地在条件允许的情况下施加压力 很好。
我们相信这是正确的行为。
我的苹果错误报告被关闭,并标记为复制的 33278611
仍然打开
感谢 kam800的评论(见下文) ,我做了更多的测试,得出了这些观察结果:
IOS11dasd 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
延期交货问题
”静音通知通过帮助您保持 你的应用程序是最新的,即使它不运行。”
控制台日志
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
取消交付问题
在这种情况下,数据推送完全丢失,而且在 iOS10上正确传送的数据从未在 iOS11上传送过。
我还注意到,当应用程序出现在前台,并且通知没有发送到应用程序时,我在控制台中看到以下日志:
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