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


87

在WWDC 2013的“多任务处理的新增功能”演示中,有一个有关无提示推送通知的部分。看起来很简单。根据演示,如果您仅将内容可用设置为1发送APS有效负载,则不会通知用户该通知。

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

我的测试表明,此操作不起作用,因为未收到任何推送。但是,如果我包括声音属性但不包括警报属性,则它可以工作(尽管不再静音)。

// 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的错误)是否正确?如果是这样,则意味着它的速度不受“无声推送”的限制……Apple可能会修复。因此,我可能不应该依赖它。
  3. 速率限制是多少(每X秒按下N次,等等)?

提前致谢。

编辑更多信息

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

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

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

通知到达application:didReceiveRemoteNotification:fetchCompletionHandler:无论状态如何。


在任何应用程序状态下都无法使用吗?对我而言,只要应用程序在前台运行(“ didReceiveRemoteNotification被调用”),“ A ”就可以工作。但是,当应用程序未运行时,不会收到通知(当我尝试“ B ”时,我只是听到声音了)。当您使用“ B ”或“ C ”时,您的应用是否会在后台唤醒(didReceiveRemoteNotification)?
DerBernie

我看到了类似的行为,我想这可能是因为我已经尝试了一段时间,而我一开始却没有正确设置应用程序,因此Apple可能在我正确设置之前就节制了我。
nickthedude

4
杜德(Dude)...我希望我能给你10票
迈克尔·威尔斯

查看是否Background fetch选中了Project Capabilities>中的复选框,Background Modes因为第一个选项应该起作用。静默推送不需要声音属性,application:didReceiveRemoteNotification:fetchCompletionHandler:即使应用程序在后台/前台运行或未运行,它也总是会进入。
IgniteCoders 2014年

Answers:


73

这也起作用,并且到达时不会播放声音:

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

编辑

有此问题的人可能想查看此链接。我一直在参加Apple开发人员论坛上的一个线程,该线程遍历所有应用程序状态以及何时接收到静默推送以及何时不接收静默推送。


感谢您的链接。ADC的论坛上有多个主题对此进行讨论。底线:有一个错误-设备重启后-苹果代表已经确认的错误应该在更新中修复(最终)。
SG1 2013年

3
在iOS7中,即使没有声音/警报键,它也能很好地工作。内容足够是关键!但是在iOS8中,即使我们除了使用“ content-available”以外还使用非空字符串设置警报键,我们的行为也确实很奇怪:1我们仅获得带有“ alert”字符串的横幅,但是出于某些原因,“ content-available”被忽略了
malex

无论是否添加声音,我都可以成功从通知启动应用程序。也许设置声音,警报或标志(是否为空)会将默认通知优先级提高到10,从而提高其可靠性。请参阅Apple关于pans优先级的说法:developer.apple.com/library/ios/documentation/…默认优先级为10(高),但是仅使用内容可用键将其用于推送通知是错误的。因此,如果仅设置了内容可用键,则可能将默认值设置为5。
–emem

1
在iOS10上不起作用。我必须推动一些声音。
斯托尼

为我在iOS10上工作。但现在不上iOS11工作
斯拉夫

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;
    };

好的答案,戴夫!优先级为5,而“对于仅包含内容可用键的推送,使用此优先级[10]是错误的”。developer.apple.com/library/ios/documentation/...
rjobidon

4
有效载荷中应优先考虑吗?IMO是您发送的推送中单独的一个字节。
Foriger 2014年

6
有效负载中未设置优先级。这在二进制通知中设置。
桑迪D.15年

10

我尝试将一个空字符串设置为alert属性,它也起作用:

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

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


alert=""有效负载中的此解决方案也对我有效iOS 9.0sound=""相反,它没有工作。
loretoparisi 2015年

5

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

看起来像: 在此处输入图片说明

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

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

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


例子:

  • 没有警报,没有声音

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

  • 仅警报

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

  • 只有声音

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


4

这对我有用:

{ 
  aps: { 
          content-available: 1 
       }
}

查看您是否Background fetchProject Capabilities>中选中了复选框Background Modes


2

我看到了同样的问题。如果我发送的内容为“ content-available”:1且未设置其他属性,则永远不会收到通知。当我添加任何其他属性时,它可以完美工作。

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

让我知道您是否找到了更好的解决方案。


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-最新,带有更多参数(新)


0

啊!还拉扯我的头发-这不是一个有效的有效负载的另一个例子,不是一个答案。尽管设备处于睡眠状态,但不会显示didReceiveRemoteNotification方法,但会显示警报文本。

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

“ apt”是一个自定义字段,用于指示通知类型。


2
如果应用程序在后台运行,并且删除了“ alert”属性,则应在application:didReceiveRemoteNotification:
fetchCompletionHandler中

@mkwon,如果我想在BG +调用中查看警报(常规推送),请调用application:didReceiveRemoteNotification:fetchCompletionHand‌ler:?Tnx
DaNLtR


0

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


0

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

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.