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" } }
有人知道吗:
- 如果这个错误?
- 如果假定B或C被视为远程通知(而不是无声推送的缺陷,需要声音属性)是正确的? 如果是这样,这意味着它不像速度有限像苹果公司可能会修复。 所以我可能不应该依赖它。
- 什么是速率限制(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 }
在推送通知,我从来没有见过。 在仔细阅读了苹果的推送通知文档后,我偶然发现了这个页面:
其中表示优先级应设置为“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 fetch
checkbox
我使用该工具–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设置声音或提醒会导致通知作为高优先级进行处理