iOS中的远程通知和安静通知有什么区别?

当我阅读Apple Docs时 ,他们提到了3种types的通知:本地,远程和无声。

本地通知可以从应用程序本地发送的名称中推断出来。

但是,其他两种types有什么不同呢?

非常感谢。

有太多的设置需要设置正确的工作。 我会试着剖析它们,使它更容易理解。

我build议大家观看前7分钟: WWDC 2015:通知中有什么新内容 。 主持人从那里提到有两种主要types的通知:

无声通知

他们发生在后台,从来没有看到任何警报/徽章/声音。 事情得到下载,你不知道他们。

iOS11的错误

看到这里 。 iOS 11的初始版本是无声通知的bug。 确保你有最新版本的testing,否则可能无法正常工作


用户通知

正如名字所说,它与用户有关 。 这是用户将看到一个警告/徽章或听到一个声音。 它有两种types。

本地通知

本地通知可以通过三种不同的方式触发

  • UNLocationNotificationTrigger :当您靠近沃尔玛商店时,您会看到提醒。

  • UNTimeIntervalNotificationTrigger :例如,您每10分钟就会看到一个警报。

  • UNCalendarNotificationTrigger 2017年12月1日下午1:00。

远程通知

它们与本地通知类似,但它们是从服务器触发的,例如具有From字段(Mom)和Body字段(我爱你!)的Whatsapp消息。

一些随机的笔记:

要接收静默或远程通知,您需要使用以下命令注册令牌:

 application.registerForRemoteNotifications() // This does NOT require user permission. 

为了能够显示徽章/警报/声音,您需要向用户请求许可

 UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in guard error == nil else { //Display Error.. Handle Error.. etc.. return } if granted { //Do stuff here.. //Register for RemoteNotifications. Your Remote Notifications can display alerts now :) application.registerForRemoteNotifications() } else { //Handle user denying permissions.. } } 

问题:我需要请求访问一次本地通知和一次远程通知?

不要只写上面的代码片段,它会请求访问远程和本地

现在让我们来看看棘手的部分:D


我是否需要启用某些function来接收无声通知?

  1. 您必须从您的Xcodefunction启用推送通知在这里输入图像说明

如果你不启用这个,那么你的应用程序将不会收到一个令牌。 没有令牌,服务器不能识别你

  1. 为了能够从后台下载东西,你需要启用:从后台模式的远程通知

要启用backgroundModes ,您可以使用plistXcodefunction执行此操作

你也可以这样做的原因是因为:plist更接近你的代码,是旧的方式,也许是为了遗留的支持。 Xcodefunction是更新的简单方法

plist中:

在这里输入图像说明

item 0只是一个索引 ,它不是字典的键(你通常在plist中看到的东西),UIBackgroundModes是一个stringarray string只能来自UIBackgroundModes数组的可接受值

Xcodefunction:

在后台模式下检查Xcode中Remote Notification如下:

在这里输入图像说明

如果您没有执行上述任何操作,请使用以下方式切换通知:

在这里输入图像说明

将杀死远程和本地通知


但是,如果您启用后台应用程序从plist或Xcodefunction刷新,那么即使closures应用程序的通知,您仍然会收到无声的通知!

如果用户想禁用静默通知,他将不得不禁用这两个通知,并禁用您的应用程序/整个系统的“后台应用程序刷新”要禁用整个系统的“后台应用程序刷新”,你必须这样做:

在这里输入图像说明

我为什么要这么说? 向您解释沉默和推送通知的设置对于用户是不同的,并且发送它们的限制是不同的。 欲了解更多,请参阅WWDCvideo中的这一刻 。 另见这里

CAVEAT:即使您禁用应用程序后台刷新和禁用允许通知,如果您的应用程序处于FOREGROUND状态,仍然可以收到无声通知。 如果你的应用程序在后台,他们将不会被交付。


我是否需要启用某些function才能接收远程通知?

您只需从您的Xcodefunction启用推送通知

在这里输入图像说明

如果你不启用这个,那么你的应用程序将不会收到一个令牌。 没有令牌,服务器不能识别你


好奇…你能告诉我,我的有效载荷应该是什么样子?

我强烈build议您参阅Apple§ 文档 。 这很清楚。

谢谢,但你能告诉我重要的部分吗?

呃…好的,但是,只是你知道这是从我刚刚说的链接:

对于无声通知 ,有两个标准:

  • 有效载荷的aps字典必须包含值为1content-available密钥。
  • 有效载荷的aps 字典不得包含alertsoundbadge密钥。

示例有效载荷如下所示:

 { "aps" : { "content-available" : 1 }, "acme1" : "bar", "acme2" : 42 } 

acme1,acme2或只是一些自定义数据! 但是对于aps键,你必须遵循苹果的结构,否则它将不能正确映射 ,你将无法正确读取数据。

对于远程通知

你需要在你的aps里面有一个alert

举个例子:

 { "aps" : { "alert" : "You got your emails.", "badge" : 9, "sound" : "bingbong.aiff" }, "acme1" : "bar", "acme2" : 42 } 

还有第三个选项 ,我将会进一步讨论这个答案。

至于知道什么是固定的apsalert字典键看到这些苹果文档

好的,我知道了。 什么是content-available

很简单。 这只是一个标志,告诉你的应用程序,你需要唤醒和下载的东西,因为我有内容可供下载! 欲了解更多信息,请参阅此确切时刻

§:如果您使用的是Firebase,那么您的有效负载结构和密钥可能会稍有不同。 例如, content-available的关键content-availablecontent_available取代。 有关更多信息,请参阅Firebase 文档以及此处


我知道你告诉我,当我使用无声通知时,我只能将一些东西下载到我的应用程序中,但是我也可以在后台将我的应用程序唤醒并下载远程通知。

是的,但是类似于无声通知,您还必须将content-available标志设置为1,因此它会知道要唤醒并下载某些内容。 否则,它会popup并提醒/徽章/声音,但不会下载任何东西。

重要的提示:

  • 如果您的应用只有静默通知,那么只需从function中启用“推送通知”+“远程通知”,并为每个有效content-available设置“ content-available1
  • 如果您的应用程序只有远程通知,那么只需启用“推送通知”表单function即可。 content-available无关。
  • 但是,如果您希望通知触发显示警报/徽章/声音,并在后台下载某些内容,则必须同时启用“远程通知”和“推送通知”+将content-available设置为1

(第三选项)

 { "aps" : { "content-available" : 1 "alert" : "You got your emails.", "badge" : 9, "sound" : "bingbong.aiff" }, "acme1" : "bar", "acme2" : 42 } 

WWDC上的这段video提到了👆


我对远程通知感到困惑…我想,每当我收到通知…我的应用程序在后台变得活跃,下载的东西…你能解释一下吗?

例如在这个时候:

在这里输入图像说明

您的iPhone刚收到一个“没有发件人”的远程通知。 要接收此… WhatsApp 不必在后台运行,即您不需要从BackgroundModes启用“远程通知”。 即使您的应用程序被强制退出或暂停,您仍然会收到通知。 因为该进程是由操作系统pipe理的,而不是Whatsapp应用程序 。 但是,如果您想要将实际的消息或其图像/video下载到WhatsApp(这样,一旦用户打开WhatsApp,video将在那里等待用户),那么你需要你的应用程序变得活跃。 要做到这一点,你需要content-available : 1和实现application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

CAVEAT:如果应用程序被用户强制退出,您仍然会收到通知(通过您的操作系统),但无法做任何事情来使应用程序退出其终止状态。 没有你的委托方法会被击中。)


有关更多详细信息,请参阅Apple文档 , RayWenderlich , iOS 10教程和WWDC 2016video

推送通知将让用户知道他们收到通知(例如显示通知popup窗口)。 无声通知将更新,但用户不会收到通知。 在任何情况下,您都可以在通知无声时执行操作,就像是推送通知一样。 唯一的区别是用户不会收到popup通知的通知。

推送通知: 在这里输入图像说明

随着无声的通知: 在这里输入图像说明

不同之处在于有效载荷:

推送通知:

  aps { content-available: 1 alert: {...} } 

无声通知:

  aps { content-available: 0 alert: {...} } 

你必须在Capabilities中设置你select的背景模式。

无声推送通知到达设备,用户不知道任何有关通知,但他的应用程序获取通知,应用程序将被给予一段时间下载新的内容,并呈现给用户,无论应用程序的状态(即运行或不运行)

只有当您的应用程序正在运行时才会调用远程推送通知方法 如果应用程序被暂停或未运行,那么在调用方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 此方法用于向用户显示更新的内容。当调用此方法时,您的应用程序有多达30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。 如果处理程序未及时调用,您的应用程序将被暂停。

欲了解更多技术细节,你可以通过这个链接:

苹果通知

无声通知