88

在 WWDC 2013 的“What's New with Multitasking”演示文稿中,有一个关于静默推送通知的部分。这似乎是直截了当的。根据介绍,如果您仅在 content-available 设置为 1 的情况下发送 APS 有效负载,用户将不会收到通知。

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

我的测试表明这不起作用,因为没有收到推送。但是,如果我包含 sound 属性但排除 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 Pushes 那样受到速率限制……Apple 可能会解决这个问题。所以我可能不应该依赖它。
  3. 速率限制是多少(每 X 秒推送 N 次,等等)?

提前致谢。

编辑更多信息

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

似乎 B 和 C 仅在将属性和值括在引号中时才有效,如下所示。

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

并且无论状态如何,通知都会到达application:didReceiveRemoteNotification:fetchCompletionHandler:

4

11 回答 11

73

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

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

编辑

遇到此问题的人可能想查看此链接。我一直在参与 Apple 开发者论坛上的一个线程,该线程会检查所有应用程序状态以及何时收到和未收到静默推送。

于 2013-10-17T13:23:22.577 回答
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;
    };
于 2014-05-28T16:54:46.840 回答
10

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

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

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

于 2013-11-22T12:27:13.280 回答
6

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

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

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

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

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


例子:

  • 没有警报,没有声音

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

  • 只提醒

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

  • 只有声音

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

于 2016-09-06T11:06:59.430 回答
4

这对我有用:

{ 
  aps: { 
          content-available: 1 
       }
}

看看你是否选中了>Background fetch中的复选框Project CapabilitiesBackground Modes

于 2014-11-03T15:26:23.290 回答
2

我看到了同样的问题。如果我发送带有 "content-available":1 且未设置其他属性的推送,则永远不会收到通知。当我添加任何其他属性时,它可以完美运行。

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

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

于 2013-10-17T10:39:27.453 回答
1

优先级应设置为二进制流中的一项,而不是有效负载 json 字符串中的一项。显然只有最新的 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;

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

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

于 2015-07-23T08:17:04.793 回答
0

啊!还把我的头发拉出来——这与其说是一个答案,不如说是另一个不起作用的有效载荷示例。didReceiveRemoteNotification 方法永远不会被调用,但如果设备处于睡眠状态,则会显示警报文本。

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

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

于 2013-10-24T21:47:04.573 回答
0

将“声音”设置为 0 对我有用... :)

于 2013-11-05T00:54:42.780 回答
0

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

于 2016-02-26T04:41:38.190 回答
0

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

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
于 2018-05-10T05:18:41.263 回答