iOS 7中的静默推送通知不起作用

mkw*_*won 86 push-notification ios ios7

在WWDC 2013的"多任务新功能"演示中,有一个关于静音推送通知的部分.看起来很简单.根据演示文稿,如果您将APS有效负载仅发送到内容可用设置为1,则不会通知用户该通知.

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}
Run Code Online (Sandbox Code Playgroud)

我的测试显示,这不起作用,因为没有收到推送.但是,如果我包含声音属性但排除了alert属性,它就会起作用(虽然不再是静音).

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改声音属性以播放静音,我可以模仿静音.

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}
Run Code Online (Sandbox Code Playgroud)

有人知道吗:

  1. 如果这是一个bug?
  2. 如果假设B或C被视为远程通知是正确的(而不是Silent Push需要声音属性的错误)?如果是这样,这意味着它没有像Silent Pushes那样的速率限制...... Apple可能会解决这个问题.所以我可能不应该依赖它.
  3. 速率限制是什么(N每推X秒等)?

提前致谢.

编辑更多信息

对于A,应用程序的状态无关紧要.从未收到通知.

看起来B和C只有在将属性和值括在引号中时才有效,如下所示.

{"aps":{"content-available": 1, "sound":"silent.wav"}}
Run Code Online (Sandbox Code Playgroud)

并且通知到达应用程序:didReceiveRemoteNotification:fetchCompletionHandler:无论状态如何.

CMV*_*MVR 70

这也有效,并且在它到达时不发出声音:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}
Run Code Online (Sandbox Code Playgroud)

编辑

有此问题的人可能想查看此链接.我一直在Apple的开发者论坛上参与一个线程,该论坛遍及所有应用程序状态,并且收到静态推送但未收到.

  • 在iOS7中,即使没有声音/警报键也能很好地工作.内容可用是足够的关键!但是在iOS8中,除了"content-available"之外,即使我们使用非空字符串设置警报键,我们也会有奇怪的行为:1我们只获得带有"alert"字符串的横幅,但"content-available"由于某些原因而忽略 (3认同)

小智 30

所以我昨天遇到了这个问题,在尝试发送声音设置为空字符串的有效载荷后,它仍然在设备上引起振动/声音.最后,我偶然发现了Urban Airship的一篇博文,建议需要发送:

{ priority: 5 }
Run Code Online (Sandbox Code Playgroud)

在推送通知中,我从未见过.仔细阅读Apple的推送通知文档后,我偶然发现了这个页面:

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

表示优先级应设置为"5"或"10",并说明:

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

10推送消息立即发送.

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

5推送消息是在接收它的设备上保存电源的时间发送的.

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

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
Run Code Online (Sandbox Code Playgroud)

  • 优先级未在有效负载中设置.这在二进制通知中设置. (6认同)
  • 应该优先考虑有效载荷吗?IMO在你发送的推送中是separete一个字节. (4认同)

小智 10

我已经尝试将空字符串设置为alert属性,它也有效:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}
Run Code Online (Sandbox Code Playgroud)

似乎APNS正在检查是否存在此属性以验证推送有效负载.有趣的是,他们没有检查实际内容.虽然看起来有点hacky ......


wen*_*ong 5

我使用工具 - Knuff将我的推送通知发送到我的设备.

看起来像: 在此输入图像描述

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

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

因此,如果您不使用该工具,您也会注意到它.


例子:

  • 没有警报,没有声音

{
    "aps":{
        "content-available":1,
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只有提醒

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只有声音

{
    "aps":{
        "content-available":1,
        "sound":""
    }
}
Run Code Online (Sandbox Code Playgroud)