iOS 7中的无声推送通知不起作用

在WWDC 2013的“What's New with Multitasking”演示文稿中,有一段关于静默推送通知的部分。 这看起来很直接。 根据介绍,如果您发送的APS有效负载只有内容可用设置为1,用户将不会收到通知的通知。

// A. This doesn't work { aps: { content-available: 1 } } 

我的testing表明,这不起作用,因为没有收到推。 但是,如果我包括声音属性,但排除警报属性,它的作品(虽然不再沉默)。

 // B. This works { aps: { content-available: 1, sound: "default" } } 

但是,如果我改变声音属性来播放静音,我可以模仿一个无声的推动。

 // C. This works too. { aps: { content-available: 1, sound: "silence.wav" } } 

有人知道吗:

  1. 如果这个错误?
  2. 如果假定B或C被视为远程通知(而不是无声推送的缺陷,需要声音属性)是正确的? 如果是这样,这意味着它不像速度有限像苹果公司可能会修复。 所以我可能不应该依赖它。
  3. 什么是速率限制(N每X秒等)?

提前致谢。

编辑更多的信息

对于A来说,应用程序的状态并不重要。 通知从未收到。

看起来像B和C只有在将属性和值用引号引起来才行,如下所示。

 {"aps":{"content-available": 1, "sound":"silent.wav"}} 

通知到达应用程序:didReceiveRemoteNotification:fetchCompletionHandler:不pipe状态。

这也适用,并且在到达时不发声:

 { aps = { "content-available" : 1, sound : "" }; } 

编辑

有这个问题的人可能想看看这个链接 。 我一直参与苹果开发者论坛的一个线索,通过所有的应用程序状态,并收到无声的推动,没有收到。

所以我昨天刚刚遇到这个问题,在尝试发送一个声音设置为空string的有效载荷后,仍然在设备上引起振动/声音。 最后,我偶然发现了一个来自Urban Airship的博客文章,build议需要发送:

 { priority: 5 } 

在推送通知,我从来没有见过。 在仔细阅读了苹果的推送通知文档后,我偶然发现了这个页面:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

其中表示优先级应设置为“5”或“10”,并说明:

通知的优先级 提供以下值之一:

10推送消息立即发送。

推送通知必须在设备上触发警报,声音或徽章。 将此优先级用于只包含内容可用密钥的推送是错误的。

5推送消息是在接收到设备电源的时间发送的。

最终,我们能够使用徽章计数(我怀疑你甚至可以对警报执行同样的操作),使用以下格式获得静默推送通知:

  aps = { badge = 7; "content-available" = 1; priority = 5; }; 

我试图设置一个空string作为警报属性,它也工作:

 { aps = { "content-available" = 1; "alert" = ""; }; } 

似乎APNS正在检查是否存在此属性以validation推送有效负载。 有趣的是,他们没有检查实际的内容。 这似乎有点哈克,但…

这适用于我:

 { aps: { content-available: 1 } } 

看看是否在“ Project Capabilities >“ Background Modes选中“ Background fetchcheckbox

我使用该工具–Nuke将我的推送通知发送到我的设备。

看起来像: 在这里输入图像描述

然后,我尝试了这些例子。

他们都是工作!但是你必须设置优先级10!

所以,如果你不使用这个工具,你也注意到了。


例子:

  • 没有警觉,没有声音
 { "aps":{ "content-available":1, } } 

我看到了同样的问题。 如果我使用“content-available”发送推送:1并且没有设置其他属性,则通知将永远不会被接收。 当我添加任何其他属性,它完美的作品。

作为临时解决scheme,我添加了徽章属性,因为除了将徽章添加到图标之外,这不会以任何方式提醒用户。

让我知道你是否find了更好的解决scheme。

优先级应该在二进制stream中设置为一个项目,但不在有效负载JSONstring中。 显然只有最新的type 2格式可以用来设置优先级如下:

 $token = chr(1) . pack('n', 32) . pack('H*', $deviceToken); $payload = chr(2) . pack('n', strlen($json)) . $json; $identifier = chr(3) . pack('n', 4) . pack('N', $notification); $expiration = chr(4) . pack('n', 4) . pack('N', time()+86400); $priority = chr(5) . pack('n', 1) . chr($priority); $frame_data = $token.$payload.$identifier.$expiration.$priority; $frame_length = strlen(bin2hex($frame_data))/2; $msg = chr(2) . pack('N', $frame_length) . $frame_data; 

用于远程通知二进制消息的格式types(第一个字节):

0 – 简单(旧)1 – 增强(旧)2 – 最新更多的参数(新)

哎呀! 另外拉我的头发 – 这不是一个有效载荷的另一个例子,不工作的答案。 didReceiveRemoteNotification方法永远不会被调用,但是如果设备正在hibernate,将显示警报文本。

  {"aps": { "alert":"alert!", "sound":"default", "content-available" : 1}, "content-id":21482, "apt":"1" } 

“apt”是我们用来指示通知types的自定义字段。

设置“声音”0为我工作… 🙂

将优先级设置为5对我来说不起作用,但是对空string设置声音或提醒会导致通知作为高优先级进行处理