IOS中有哪些不同类型的通知?怎么正确配置它们?

本教程将介绍IOS中有哪些不同类型的通知?如何正确配置它们?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

IOS中有哪些不同类型的通知?怎么正确配置它们? 教程 第1张

问题描述

当我阅读Apple Docs时,他们提到三种类型的通知:本地通知、远程通知和静默通知。

本地通知可以从应用在本地发送的其名称推断出来。

但是,其他两种类型之间有什么不同?

推荐答案

编辑:此答案完全适用,但iOS12中的通知有一些(未更改)。我强烈建议您观看WWDC 2018: What’s New in User Notifications并阅读this amazing and must read article。

主要更改为:

    分组通知和摘要格式

    临时通知即未经用户许可直接在通知中心显示通知

    忽略‘请勿打扰’或‘静音’的重要通知

    能够与扩展中的通知交互

    完全重置或更新操作的能力

    能够从手机通知中心深入到应用的通知设置


重要说明:不确定是从什么时候开始的,但从Apple文档开始,"静默通知"已重命名为"后台通知"

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

总的来说,有几件事很重要。

    和通知的总体差异

    不同类型的通知

    怎么从您的服务器配置远程通知,即

    怎么从项目的后台模式启用推送通知和远程通知

    怎么向和通知和APN体系结构的APN注册令牌

    怎么请求通知权限

    从设备启用‘后台应用刷新’和‘通知’

    什么是content-available

    了解在接收远程通知时,iOS是您的应用的上游

    当应用程序已被用户终止时,操作系统收到通知时会发生什么情况

    可靠性和APNS架构说明


我强烈建议大家观看WWDC 2015: What's new in Notifications的前7分钟。从那里,演示者提到有两种主要类型的通知:

无提示通知

它们发生在后台,因此您看不到任何警报/徽章/声音。在您不知情的情况下下载内容有关。也就是说,用户将看到警报/徽章或听到声音。它有两种类型。

本地通知

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

    UNLocationNotificationTrigger
    当您靠近沃尔玛商店时,您会看到警告。

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

    UNCalendarNotificationTrigger,如2017年12月1日下午1:00

远程通知

它们类似于本地通知,但它们是从服务器触发的,例如,具有发件人字段(妈妈)和正文字段(我爱您!)的WhatsApp消息。

令牌注册和APNS架构:

若要接收静默或远程通知,您需要使用:

注册令牌

application.registerForRemoteNotifications() 

?注册不需要用户权限。这使得静默通知变得无缝。请参见this moment of the WWDC video

默认情况下启用静默通知。用户不需要
要批准您的--不允许您的应用程序使用它们,
而且您可以开始使用它们,而不需要询问用户
权限。

From WWDC

记住APN通过APN而不是您的服务器传送给您的用户。因此,您的iOS代码必须将此令牌发送到您的服务器。因此服务器可以将给定的设备令牌与用户相关联。当您想要推送到某个用户时,您的服务器只会告诉APN将有效负载发送到特定令牌。重要的是要了解您的服务器和APN是两码事

流程如下:

1

1

    服务器/提供程序向APN发送负载

    APN向给定帐户的所有目标设备发送通知。例如,您的iPhone和Mac都可以接收电子邮件/消息通知。

    然后,您的iPhone/Mac会将该消息传递给应用程序。APN不会直接向您的应用程序发送消息。它会将其发送到设备。然后iOS将其发送到您的应用程序。

有关详细信息,请参阅文档APNs Overview和Sending Notification Requests to APNs


若要能够显示徽章/警报/声音,您需要向用户请求:

UNUserNotificationCenter.current().requestAuthorization(options: [.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..
 }
}

问题:我是否需要为本地通知请求一次访问权限,为远程通知请求一次访问权限?

没有。只需编写上面的代码段,它将请求访问下载内容,您需要启用:远程通知从后台模式。

若要启用backgroundModes,您可以使用plist或Xcode功能。

Xcode功能:

查看后台模式下Xcode中的Remote Notification如下:

如果您不执行上述任何操作,则使用以下命令关闭通知:

将终止远程通知


如果您确实从PLIST或Xcode功能启用了后台应用刷新,则即使关闭了该应用的通知,您仍将收到静默通知!

如果用户想要禁用静默通知,他必须禁用这两个通知,并在整个系统中禁用您的应用程序的后台应用程序刷新。
若要在整个系统中禁用"后台应用刷新",您必须执行以下操作:

我为什么要说这些?向您解释一下,静默通知和推送通知的对于用户来说是不同的,发送的限制也是不同的。有关详细信息,请参阅WWDC视频中的this moment。请参见here instead(上一链接失效):

默认情况下启用静默通知。

用户不需要批准您的不授予权限
您的应用程序可以使用它们,您无需询问即可开始使用它们
权限的用户。

但是静默通知是后台应用程序背后的机制
刷新。

在您知道的任何时候,用户都可以进入设置并禁用
他们。

所以您不能依赖它们始终可用。

您不知道用户是否关闭了它们,并且您无法获得
不再是通知。

这也意味着以最好的方式提供静默通知
努力。

这意味着当通知到达用户设备时,
系统将做出一些选择。

它将使用来自设备和用户的不同信号
行为,比如权力或一天中的时间来决定什么时候是好的
是时候传递通知并启动您的应用程序了。

它可能会尝试节省电池,也可能会尝试匹配用户行为
并在用户更有可能使用内容时使其可用。

另请参阅here。

警告:即使您禁用应用后台刷新和禁用允许通知,如果您的应用处于前台,您仍可以收到静默通知。如果你的应用程序在后台,它将不会被传送。


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

您只需从Xcode功能启用推送通知:

如果您不启用此功能,您的应用程序将不会收到令牌。如果没有令牌,服务器就无法识别您。


APNS负载结构

好奇.您能告诉我我的负载应该是什么样子吗?

我强烈建议您查看Apple§documentation。非常清楚,也可以看到Sending Notification Requests to APNs。基本上,平台对APN进行HTTP/2调用并发送所需的有效负载。发送正确的标头非常重要,否则您的通知将不会传送到设备!

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

嗯..。好的,但您要知道这是来自我刚才说的链接:

对于静默通知,只有一个条件:

    负载的aps字典必须包含content-available
    1

    根据docs您可以发送其他字段

如果有与后台配套的用户可见更新
更新后,您可以在APS中设置警报键、声音键或徽章键
字典(视情况而定)。

示例负载如下所示:

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

acme1、acme2或一些自定义数据!但是对于aps键,您必须遵循Apple的结构,否则它将无法正确映射,请问无法正确读取数据。

注意:我尚未对此进行验证,但另一名工程师提到,如果您启用了临时通知,则要确保发送静默通知,您必须包括一个正文为空的警告字段。例如:

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

对于用户通知:

您的aps内需要alert密钥。

举例:

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

还有一个第三个选项我将在答案下面进一步讨论。

关于固定的apsalert字典键是什么,请参阅Apple docs。

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

非常简单。它只是一个标志,告诉您的应用程序您需要唤醒并下载一些内容,因为我有可供下载的内容!有关详细信息,请参阅此exact moment。

默认情况下不包含content-available标志,即默认情况下,您发送的触发application(_:didReceiveRemoteNotification:fetchCompletionHandler:)或在您的应用程序中执行某些操作。它只会显示通知。如果您要唤醒应用程序(在后台执行某些操作),则需要包含content-available并将其设置为1

§:如果您使用的是Firebase,您的负载结构和密钥可能会略有不同。例如,键content-available替换为content_available。有关详细信息,请参阅Firebase documentation和here。


我知道您告诉我,我只能在使用静默通知时才能将某些内容下载到我的应用中,但是否有办法也可以在后台唤醒我的应用并下载用于远程通知的内容?

可以,但是与静默通知类似,您还必须将content-available标志设置为1,以便它知道唤醒并下载某些内容。否则,它只会弹出并发出警告/徽章/声音,但不会下载任何内容。

重要说明:

    如果您的应用只有静默通知,只需从"功能"中启用"推送通知&+"远程通知&qot;,并将每个负载的content-available设置为1

    如果您的应用只有远程通知,只需启用"推送通知&从功能。content-available无事可做。

    但是,如果您希望通知显示警报/徽章/声音并在后台下载某些内容,则必须同时启用"远程通知和"推送通知并将content-available设置为1

(第三个选项)

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

This moment来自WWDC视频提到?

引用苹果工程师的话:

现在,您可以在用户远程通知中设置相同
可用内容您在静默通知中设置的标志,并且
允许您的应用程序有一些时间下载内容或更新
它想要显示的内容,以便当用户点击时
在通知上,您的内容可用。用户看到的是
确实如此。这是在用户内部设置静默通知的一种方式
像摘要一样的通知。


通知和IOS应用程序生命周期

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

例如此时:

    您的iPhone刚刚收到一条远程通知,正文为"no sender"。要接收此消息,WhatsApp**不必**在后台运行,也就是说,您不需要从Backround Modes启用"远程通知&。即使您的应用程序被强制退出或挂起,您仍会收到通知,因为进程由操作系统管理,而不是由WhatsApp应用程序管理。然而,如果您希望能够将实际的消息或其图像/视频下载到WhatsApp(这样一旦您的用户打开WhatsApp,视频就会坐在那里等待用户),那么您的应用程序就需要变得活跃起来。为此,您需要content-available : 1并实现application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

    同样,如果您禁用应用程序的蜂窝数据,您仍会收到其通知。但是,通过点击该通知,用户将无法对该应用程序发出任何。他们将只能该应用。

    或者对于另一个类似的场景,如果您连接的服务器/接入点限制了对WhatsApp的访问,它仍然允许您接收APNS通知。但是,通过点击该通知,用户将无法对该应用程序发出任何。他们将只能该应用。

警告:如果应用程序是被用户强制退出的,那么尽管您确实收到了上述原因的通知,但您无法执行任何操作来自动使应用程序脱离终止状态(即使请问content-available设置为1)。您的委托方法都不会被击中。必须打开应用程序,然后才能访问您的委托方法。


可靠性和APNS架构说明:

虽然通知大量用于向应用程序传递实际内容,但它们在某种程度上并不是为内容而设计的。相反,它们旨在用户有新的东西到达(2b消息或50KB的小图像,或10MB的图像或2 GB的视频)。如果你愿意,可以打开这个应用程序。顺便提一下,这里是其中的一小部分(实际消息本身如果它可以容纳、通知中显示的图像标题或缩略图、视频&报价;中显示的视频标题或缩略图)。有关详细信息,请参阅iOS APNs "best-effort" fallback。重复一遍,您永远不会下载电子邮件中发送的40MB附件。你只需要得到它存在的通知。您只需发送足够的内容(附件的缩略图),就可以通知用户最新信息,并决定他们是否需要打开应用程序获取更多信息。我刚接触iOS的时候,我以为你真的是通过推送通知来发送图片/视频的。你没有!

特别是在无提示通知的情况下:

当设备收到后台通知时,系统可能会保持
并延迟通知的传递,这可能会导致
以下副作用:

    当系统收到新的后台通知时,它会丢弃旧的通知,而只保留最新的通知。

    如果强制退出或终止应用程序,系统将丢弃保留的通知。

    如果用户启动应用程序,系统会立即发送挂起的通知。
    将后台更新推送到您的应用docs

    APNS每天发送有限数量的静默通知-带有Content-Available密钥的通知。此外,如果设备已超出当天的功率预算,则在功率预算重置(每天发生一次)之前不会再次发送静默通知。当从Xcode测试您的应用程序时,这些限制被禁用。请参阅将后台更新推送到您的应用。

Troubleshooting tips for handling errors returned from ANPs

即使对于远程用户通知,用户也可能不在Internet上,这可能会导致内容过期,或者如果您发送的通知太多或太快,APN可能会扼杀您。再次查看此处

长话短说APN和操作系统是王,你在它下面。因此,您不能依赖它来遵守您的每一个命令。话虽如此,但你可以看到大多数即时通讯应用都成功地利用了它,因此它是超级可靠的。

附录怎么生成推送通知证书,.p12.pem以及怎么全部测试?

看看这个terrific answer。它的截图数量是我见过的最多的。

好了关于IOS中有哪些不同类型的通知?怎么正确配置它们?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。