ios11 中的离子静默推送中断?即使 content-available = 1 也会显示空白通知

Posted

技术标签:

【中文标题】ios11 中的离子静默推送中断?即使 content-available = 1 也会显示空白通知【英文标题】:ionic silent pushes broken in ios11? blank notifications displayed even though content-available = 1 【发布时间】:2017-09-25 16:44:49 【问题描述】:

我似乎在 ios11 中遇到了回归。我有一个应用程序每小时接收 silent 推送通知(使用"content-available": 1 推送通知)以刷新自身。它已经工作多年了,没有任何问题。

但是,在 iOS11 更新后,我的用户开始报告他们每小时都看到可见通知,但没有消息 - 例如

我验证了这一点。

iOS10 上的手机。让手机通宵运行 - 没有空白消息。 升级到 iOS11无需重新安装应用 - 空白消息

我给didReceiveRemoteNotification加了一个断点,发现通知在didReceiveRemoteNotification开始运行之前就显示出来了

didReceiveRemoteNotificationuserInfo 参数是


    aps =     
        alert =         
            title = "e-mission-phone";
        ;
        "content-available" = 1;
    ;
    notId = 1506359243823816;
    payload =     
        notId = 1506359243823816;
    ;

所以基本上,iOS11 似乎改变了它确定通知为静默并显示之前隐藏在 iOS10 中的通知的方式。

我找不到任何文档表明这种行为应该已经改变,或者新的有效负载应该是什么样子。有没有其他人看到这个?我正在使用 phonegap-push-plugin 接收通知和 ionic push 发送通知。

【问题讨论】:

【参考方案1】:

回答我自己的问题,希望对其他人有所帮助。这是由于 ionic push 和 APNS 之间的集成问题,以及 iOS10 和 iOS11 之间 APNS 行为的变化。基本上,如果用户没有指定,离子推送会添加一个警报标题,而 iOS10 显然使用content-available: 1 时忽略该标题,但在 iOS11 中不再这样做。

edit #1:我最初认为可以通过降低消息的优先级来解决这个问题,但这并没有帮助。如果没有提供,ionic 真的需要停止设置标题。我已经提交了 ionic 支持票,但我不确定何时会收到回复。

编辑#2:通过大量实验,我可以确认,即使将警报标题设置为"",也无法阻止 ionic 添加警报标题。包括配置消息在内的详细信息位于https://github.com/e-mission/e-mission-phone/issues/290#issuecomment-332049861,但基本上,如果传递给 ionic 的规范有标题,则使用它,否则 ionic 自动添加标题。

【讨论】:

【参考方案2】:

来自Apple push notifications doc:

发送静默通知需要特殊配置 通知的有效负载。如果您的有效负载未配置 正确地,通知可能会显示给用户而不是 在后台传送到您的应用程序。在你的有效载荷中,使 确保满足以下条件:

payload 的 aps 字典必须包含 content-available 键 值为 1。

payload 的 aps 字典不能包含 警报、声音或徽章键。

重要的部分是 payload 的 aps 字典不能包含 alert 键。

这不是新的,以前就是这样,所以可能在 iOS 10 上它忽略了它,现在在 iOS 11 上它显示它。您应该从有效负载中删除警报。

【讨论】:

我在下面回答了我自己的问题。离子推送(这是我使用的推送服务)正在自动添加警报 - 我没有在我的配置中指定它。我已经提交了一个帮助问题,要求他们修复它,但我不确定他们什么时候会回复。 我已经编辑了标题以澄清这只发生在离子推送中

以上是关于ios11 中的离子静默推送中断?即使 content-available = 1 也会显示空白通知的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11.2.6 中未处理静默推送通知

静默推送通知是不是能够唤醒 ios 中处于未运行状态的应用程序?

选择退出用户的静默推送通知

静默通知上的 iOS 后台发布请求

为啥我在 iOS 13 中的应用程序在被用户终止时通过静默推送在后台唤醒

当应用程序在后台时,使用 React Native 的静默 iOS 推送通知