【问题标题】:Silent Push Notification in iOS 7 does not workiOS 7 中的静默推送通知不起作用
【发布时间】:2013-10-14 21:44:27
【问题描述】:

在 WWDC 2013 的“多任务处理的新功能”演示文稿中,有一个关于静默推送通知的部分。这似乎是直截了当的。根据介绍,如果您仅在 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:

【问题讨论】:

  • 在任何应用状态下都不起作用吗?对我来说,只要应用程序在前台运行(调用了didReceiveRemoteNotification),“A”就可以工作。但是当应用程序没有运行时,应用程序没有收到通知(我只是听到声音,当我尝试“B”时)。当您使用“B”或“C”时,您的应用是否会在后台被唤醒 (didReceiveRemoteNotification)?
  • 我看到了类似的行为,我想这可能是因为我已经尝试了一段时间,而且我一开始没有正确设置应用程序,所以 Apple 之前可能已经限制了我我的设置正确。
  • 老兄......我希望我能给你 10 票
  • 看看你是否选中了Project Capabilities 中的Background fetch 复选框> Background Modes,因为第一个选项应该可以工作。无声推送不需要声音属性,即使应用程序在后台/前台运行或未运行,也始终到达application:didReceiveRemoteNotification:fetchCompletionHandler:
  • 现在是 2021 年,我一直在开发我的应用程序并打算使用静默推送通知,但是直到我偶然发现了这篇文章才能够收到它。这很奇怪,但有效载荷中的关键“声音”起作用了。感谢您将其放入社区。我希望有人在某个时候提出合理的解释。荣誉。

标签: ios push-notification ios7


【解决方案1】:

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

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

编辑

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

【讨论】:

  • 感谢您的链接。 ADC 论坛上有多个线程在讨论这个问题。底线:有一个错误 - 设备重启后 - Apple 代表承认应该在更新中修复(最终)。
  • 在 iOS7 中,即使没有声音/警报键,它也能很好地工作。 content-avalable 是足够的关键!但是在 iOS8 中,即使我们设置了除“content-available”之外的非空字符串的警报键,我们也有非常奇怪的行为:1 我们只得到带有“alert”字符串的横幅,但“content-available”由于某些原因被忽略
  • 我已经成功地从通知启动应用程序,无论是否添加声音。也许,设置声音、警报或徽章(是否为空)会将默认通知优先级提高到 10,从而提高其可靠性。查看 Apple 对 pans-priority 的评价:developer.apple.com/library/ios/documentation/… 默认优先级为 10(高),但仅使用 content-available 键将其用于推送通知是错误的。因此,如果仅设置了 content-available 键,则默认值可能设置为 5。
  • 不适用于 iOS10。我必须推动某些东西“发声”。
  • 编辑中苹果开发者论坛线程的链接似乎已失效。我知道这已经很久了,但是有没有人有更新的链接(或该线程的标题)?
【解决方案2】:

所以我昨天刚遇到这个问题,在尝试发送声音设置为空字符串的有效负载后,它仍然在设备上引起振动/声音。最后,我偶然发现了 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;
    };

【讨论】:

  • 很好的回答戴夫!允许优先级为 5,而“将此优先级 [10] 用于仅包含内容可用密钥的推送是错误的”。 developer.apple.com/library/ios/documentation/…
  • 是否应该优先包含在有效载荷中? IMO 它在您发送的推送中是单独的一个字节。
  • 负载中没有设置优先级。这在二进制通知中设置。
【解决方案3】:

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

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

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

【讨论】:

  • 这个有效载荷中带有alert="" 的解决方案也适用于iOS 9.0sound="" 不起作用。
【解决方案4】:

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

看起来像:

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

它们都是工作!但您必须将优先级设置为 10!

所以如果你不使用这个工具,你也要注意它。


例子:

  • 没有警报,没有声音

{
    "aps":{
        "content-available":1,
    }
}
  • 仅提醒

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}
  • 只有声音

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

【讨论】:

    【解决方案5】:

    这对我有用:

    { 
      aps: { 
              content-available: 1 
           }
    }
    

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        优先级应该设置为二进制流中的一项,而不是有效负载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 - 具有更多参数的最新版本(新)

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

          • 如果应用程序在后台,并且如果您删除了 'alert' 属性,您应该会在 application:didReceiveRemoteNotification:fetchCompletionHandler: 中收到回调:
          • @mkwon 如果我想在 BG + 调用应用程序中查看警报(定期推送):didReceiveRemoteNotification:fetchCompletionHand‌​ler: ? Tnx
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-14
                • 2018-12-05
                • 1970-01-01
                • 2014-02-27
                • 1970-01-01
                相关资源
                最近更新 更多