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来接收无声通知?
- 您必须从您的Xcodefunction启用推送通知 :
如果你不启用这个,那么你的应用程序将不会收到一个令牌。 没有令牌,服务器不能识别你
- 为了能够从后台下载东西,你需要启用:从后台模式的远程通知 。
要启用backgroundModes ,您可以使用plist或Xcodefunction执行此操作 。
你也可以这样做的原因是因为: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
字典必须包含值为1
的content-available
密钥。 - 有效载荷的
aps
字典不得包含alert
,sound
或badge
密钥。
示例有效载荷如下所示:
{ "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 }
还有第三个选项 ,我将会进一步讨论这个答案。
至于知道什么是固定的aps
& alert
字典键看到这些苹果文档
好的,我知道了。 什么是content-available
?
很简单。 这只是一个标志,告诉你的应用程序,你需要唤醒和下载的东西,因为我有内容可供下载! 欲了解更多信息,请参阅此确切时刻
§:如果您使用的是Firebase,那么您的有效负载结构和密钥可能会稍有不同。 例如,
content-available
的关键content-available
被content_available
取代。 有关更多信息,请参阅Firebase 文档以及此处
我知道你告诉我,当我使用无声通知时,我只能将一些东西下载到我的应用程序中,但是我也可以在后台将我的应用程序唤醒并下载远程通知。
是的,但是类似于无声通知,您还必须将content-available
标志设置为1,因此它会知道要唤醒并下载某些内容。 否则,它会popup并提醒/徽章/声音,但不会下载任何东西。
重要的提示:
- 如果您的应用只有静默通知,那么只需从function中启用“推送通知”+“远程通知”,并为每个有效
content-available
设置“content-available
为1
。 - 如果您的应用程序只有远程通知,那么只需启用“推送通知”表单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秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。 如果处理程序未及时调用,您的应用程序将被暂停。
欲了解更多技术细节,你可以通过这个链接:
苹果通知
无声通知