[英]Silent Push Notification in iOS 7 does not work
在WWDC 2013的“多任务新功能”演示中,有一个关于静音推送通知的部分。 看起来很简单。 根据演示文稿,如果您将APS有效负载仅发送到内容可用设置为1,则不会通知用户该通知。
// A. This doesn't work
{
aps: {
content-available: 1
}
}
我的测试显示,这不起作用,因为没有收到推送。 但是,如果我包含声音属性但排除了alert属性,它就会起作用(虽然不再是静音)。
// B. This works
{
aps: {
content-available: 1,
sound: "default"
}
}
但是,如果我更改声音属性以播放静音,我可以模仿静音。
// C. This works too.
{
aps: {
content-available: 1,
sound: "silence.wav"
}
}
有人知道吗:
提前致谢。
编辑更多信息
对于A,应用程序的状态无关紧要。 从未收到通知。
看起来B和C只有在将属性和值括在引号中时才有效,如下所示。
{"aps":{"content-available": 1, "sound":"silent.wav"}}
并且通知到达应用程序:didReceiveRemoteNotification:fetchCompletionHandler:无论状态如何。
这也有效,并且在它到达时不发出声音:
{
aps = {
"content-available" : 1,
sound : ""
};
}
编辑
有此问题的人可能想查看此链接 。 我一直在Apple的开发者论坛上参与一个线程,该论坛遍及所有应用程序状态,并且在收到静态推送但未收到时。
所以我昨天遇到了这个问题,在尝试发送声音设置为空字符串的有效载荷后,它仍然在设备上引起振动/声音。 最后,我偶然发现了Urban Airship的一篇博文,建议需要发送:
{ priority: 5 }
在推送通知中,我从未见过。 仔细阅读Apple的推送通知文档后,我偶然发现了这个页面:
表示优先级应设置为“5”或“10”,并说明:
通知的优先级。 提供以下值之一:
10推送消息立即发送。
推送通知必须在设备上触发警报,声音或徽章。 将此优先级用于仅包含内容可用密钥的推送是错误的。
5推送消息是在接收它的设备上保存电源的时间发送的。
最终,我们能够使用以下格式获得使用徽章计数的静音推送通知(我怀疑您甚至可以使用警报执行相同操作):
aps = {
badge = 7;
"content-available" = 1;
priority = 5;
};
我已经尝试将空字符串设置为alert属性,它也有效:
{
aps = {
"content-available" = 1;
"alert" = "";
};
}
似乎APNS正在检查是否存在此属性以验证推送有效负载。 有趣的是,他们没有检查实际内容。 虽然看起来有点hacky ......
我使用工具 - Knuff将我的推送通知发送到我的设备。
然后,我尝试了这些例子。
他们都工作!但你必须设置优先级10!
因此,如果您不使用该工具,您也会注意到它。
{ "aps":{ "content-available":1, } }
{ "aps":{ "content-available":1, "alert":"" } }
{ "aps":{ "content-available":1, "sound":"" } }
这对我有用:
{
aps: {
content-available: 1
}
}
查看是否在“ Project Capabilities
>“ Background Modes
选中“ Background fetch
复选框
我看到了同样的问题。 如果我发送带有“content-available”的推送:1并且没有设置其他属性,则永远不会收到通知。 当我添加任何其他属性时,它完美地工作。
作为临时工作,我正在添加徽章属性,因为除了将徽章添加到图标之外,这不会以任何方式提醒用户。
如果您找到了更好的解决方案,请告诉我。
优先级应设置为二进制流中的一个项目,但不应设置在有效负载json字符串中。 显然,只有最新的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;
远程通知二进制消息的格式类型(第一个字节):
0 - 简单(旧)1 - 增强(旧)2 - 最新参数(新)
哎呀! 还拉我的头发 - 这不是一个有效载荷的另一个例子的答案。 永远不会调用didReceiveRemoteNotification方法,但如果设备处于休眠状态,则会显示警报文本。
{"aps":
{ "alert":"alert!",
"sound":"default",
"content-available" : 1},
"content-id":21482,
"apt":"1"
}
“apt”是我们用来指示通知类型的自定义字段。
将'sound'设置为0对我有用... :)
将优先级设置为5对我来说不起作用,但将声音或警报设置为空字符串确实会将通知作为高优先级处理
我们遇到了同样的问题,没有发送通知。 在我们的例子中,我们使用静音推送来更新徽章编号。 当我们为警报(正文和标题)和声音设置空字符串时它会工作,但如果任何键不存在则失败。 这是有效的,没有声音或警报更新徽章(didReceiveRemoteNotification中生成的userInfo字典的日志)
{
aps = {
alert = {
body = "";
title = "";
};
badge = 103;
"content-available" = 1;
sound = "";
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.