无声推送未在iOS 11上传送到应用程序 [英] Silent pushes not delivered to the app on iOS 11

查看:137
本文介绍了无声推送未在iOS 11上传送到应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到在iOS 11 beta 2上,无论应用程序的状态(后台/前台)如何,静默通知都不会传递到应用程序:didReceiveRemoteNotification:fetchCompletionHandler



我实现了 UIApplicationDelegete 方法应用程序:didReceiveRemoteNotification:fetchCompletionHandler 我发送以下无声推送

  {
aps:{
content-available :1
},
mydata:{
foo:bar
}
}

但是在iOS 11上没有调用委托方法。



它适用于其他版本iOS和文档部分



更新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的票据更新了以下答案:


Apple开发者关系2017年9月6日,下午10:42工程有
提供了有关此问题的以下反馈:



我们能够让示例应用程序运行并测试行为。当我们按照描述测试时,我们
没有看到任何问题。



推送不保证在后台以
运行时到达应用程序,这里的日志表明我们不相信该应用程序是
足以用来启动它。



当条件为
好​​时,我们确实会看到我们不时提供推送。



我们认为行为正确。




更新11.09



我的Apple错误报告已关闭,并标记为 33278611 的副本仍未开启



更新13.09 - iOS 11 GM



感谢kam800的评论(见下文)我做了更多测试并得出了这些观察结果:



iOS 11中似乎有一个新的守护进程 dasd DuetActivitySchedulerDaemon 要么完全丢弃数据推送,要么延迟数据推送:



交付延期



控制台日志

 默认13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon取消:com.apple.pushLaunch.net.tequilaapps.daylight:C03A65< private>! lifecycle com.apple.duetactivityscheduler 
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon删除应用程序的启动请求< private>按活动< private>默认com.apple.duetactivityscheduler
默认12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon推进< private>的开始日期到2015年9月13日星期三12:55:31默认com.apple.duetactivityscheduler
默认13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon活动< private>:< private>的最佳得分0.6144 (有效期至:< private>)得分com.apple.duetactivityscheduler
默认13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon在< private>之间设置计时器(isWaking = 1,activityRequiresWaking = 0)和< private> for< private>默认com.apple.duetactivityscheduler

延迟交付问题




  • 当数据推送传递被推迟并且应用程序启动时,只有在达到交付日期时才会传递数据,这可能是几分钟将来。这完全打败了使用数据推送来保持新应用内容为下次发布做好准备的目的。我再次引用Apple的文档:




无提示通知可以帮助您保持$,从而改善用户体验b $ b你的应用程序是最新的,即使它没有运行。





  • 两次数据推送被发送到暂停的应用程序,它们被iOS 11推迟,而不是直接唤醒应用程序。达到交货时间后,仅交付最后一次数据推送!之前的推送丢失,并且未通过委托方式传递,导致数据丢失。



取消交付



控制台日志

 默认13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name:ApplicationPolicy,policyWeight:50.000,回复:{决定:不得继续,得分:0.00}}
],FinalDecision :不得继续}评分com.apple.duetactivityscheduler

取消发送问题



在这种情况下,数据推送完全丢失,并且在iOS 11上正确传送时从未在iOS 11上传送。



更新19.09 - iOS 11 GM



我还注意到,当应用程序位于前台并且通知未发送到应用程序时,我看到控制台中的以下日志:

 默认值08:28:49.354824 +0200 apsd apsd< private> ;:已启用主题'< private>'onInterface的已收到消息:NonCellular,有效负载'< private>',设备令牌优先级为10:否courier-overized com.apple.apsd 

fault 08:33:18.128209 +0200 dasd Foundation< NSXPCConnection:0x151eee460>来自pid 55的连接:在接收消息的解码过程中捕获异常,丢弃传入消息。
异常:解码参数0时的异常(调用的#2):
异常:键'NS.objects'的值是意外的类'NSNull'。允许的类是'{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'。一般com.apple.foundation.xpc


解决方案

所以发布iOS 11.1 beta 1的笔记说


iOS 11.1 beta 1刚刚发布,他们提到:
通知
已解决的问题
•更频繁地处理无声推送通知。(33278611)


我做了一些测试,它似乎是确实修复了:



暂停状态



当我以暂停模式启动应用程序并发送静音推送时,应用程序返回后台并调用 didReceiveRemoteNotification:fetchCompletionHandler 委托。



前景状态



以同样的方式,当应用程序在前台并发送静默推送时,代理似乎按预期调用。这是随机工作在以前的iOS 11版本中,所以我会在经过更多测试后确认这一点。


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

解决方案

So the release notes of iOS 11.1 beta 1 say

iOS 11.1 beta 1 was just released and they mention: "Notifications Resolved Issues • Silent push notifications are processed more frequently. (33278611)

I did some tests and it seems to be indeed fixed:

Suspended State

When I launch the app in a suspended mode and send a silent push, the app is brought back to background and the didReceiveRemoteNotification:fetchCompletionHandler delegate is called.

Foreground State

In the same way, when the application is in foreground and a silent push is sent, the delegate seems to be called as expected. This was randomly not working in previous iOS 11 versions so I will confirm this after more testing.

这篇关于无声推送未在iOS 11上传送到应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆