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

时间:2013-10-08 05:26:31

标签: ios push-notification ios7

在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"
       }
}

有谁知道:

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

    使用更多信息进行修改

    对于A,应用程序的状态无关紧要。通知永远不会收到。

    如果将属性和值括在引号中,B和C似乎只能起作用,如下所示。

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

    通知到达应用程序:didReceiveRemoteNotification:fetchCompletionHandler:,无论状态如何。

11 个答案:

答案 0 :(得分:69)

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

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

修改

遇到此问题的人可能需要查看this link。我一直在参与Apple开发者论坛上的一个主题,该主题遍及所有应用程序状态,并且收到静默推送但未收到。

答案 1 :(得分:30)

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

{ priority: 5 }
推送通知中的

,我从未见过。在仔细阅读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;
    };

答案 2 :(得分:10)

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

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

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

答案 3 :(得分:5)

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

看起来像: enter image description here

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

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

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

的示例:

  • 没有警报,没有声音



{
    "aps":{
        "content-available":1,
    }
}




  • 仅提醒



{
    "aps":{
        "content-available":1,
        "alert":""
    }
}




  • 只有声音



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




答案 4 :(得分:4)

这对我有用:

{ 
  aps: { 
          content-available: 1 
       }
}

看看您是否在Background fetch>中选中Project Capabilities复选框Background Modes

答案 5 :(得分:2)

我遇到了同样的问题。如果我发送带有“content-available”的推送:1并且没有设置其他属性,则永远不会收到通知。当我添加任何其他属性时,它可以很好地工作。

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

如果您找到了更好的解决方案,请告诉我。

答案 6 :(得分: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 - 最新参数(新)

答案 7 :(得分:0)

哎呀!还拉我的头发 - 这不是一个有效载荷的另一个例子的答案。永远不会调用didReceiveRemoteNotification方法,但如果设备处于休眠状态,则会显示警报文本。

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

“apt”是我们用于指示通知类型的自定义字段。

答案 8 :(得分:0)

将'sound'设为0对我有用...... :)

答案 9 :(得分:0)

将优先级设置为5对我来说不起作用,但将声音或警报设置为空字符串确实会将通知作为高优先级处理

答案 10 :(得分:0)

我们遇到了相同的问题,没有发送通知。在我们的例子中,我们使用静音推送来更新徽章编号。当我们为警报(正文和标题)和声音设置空字符串时它会工作,但如果任何键不存在则失败。这是有效的,没有声音或警报更新徽章(在didReceiveRemoteNotification中记录生成的userInfo字典)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}