tra*_*ang 41 push-notification apple-push-notifications ios remote-notifications silent-notification
当我阅读Apple Docs时,他们提到了3种类型的通知:本地,远程和静默.
可以从应用程序本地发送的名称推断本地通知.
但是,其他两种类型的区别是什么?
Hon*_*ney 155
编辑:虽然这个答案完全适用,但iOS 12中的通知有一些补充(而不是更改).我强烈建议观看WWDC 2018:用户通知中的新功能,请参阅此处.
主要变化是:
有太多的设置需要设置才能正常工作.我会尝试剖析它们,让它更容易理解.
总的来说,有几件事情很重要.
content-available
我强烈建议大家观看前7分钟:WWDC 2015:通知中的新功能.从那里,演示者提到有两种主要类型的通知:
它们发生在后台,因此您永远不会看到任何警报/徽章/声音.在你不知道的情况下下载的东西.
iOS 11的bug
看到这里.iOS 11初始版本对于静默通知来说是错误的.确保您有最新版本的测试,否则可能无法正常工作
顾名思义,它与用户有关.也就是说,用户将看到警报/徽章或听到声音.它有两种类型.
本地通知
可以通过3种不同方式触发本地通知:
UNLocationNotificationTrigger
:当您靠近沃尔玛商店时,您会看到提醒.
UNTimeIntervalNotificationTrigger
:例如,您每10分钟看一次警报.
UNCalendarNotificationTrigger
喜欢2017年12月1日下午1点.
远程通知
它们类似于localNotifications,但它们是从服务器触发的,例如WhatsApp消息,其中包含From字段(妈妈)和正文字段(我爱你!).
一些随机笔记:
要接收静默或远程通知,您需要使用以下方式注册令牌:
application.registerForRemoteNotifications()
Run Code Online (Sandbox Code Playgroud)
注册不需要用户许可.这使得静默通知变得无缝.观看WWDC视频的这一刻
默认情况下启用静默通知.用户无需批准您 - 不允许您的应用程序使用它们,您只需开始使用它们而无需向用户请求许可.
为了能够显示徽章/警报/声音,您需要请求用户的许可:
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..
}
}
Run Code Online (Sandbox Code Playgroud)
问题:我是否需要为本地通知请求访问一次,对远程通知请求一次?
号只写上面的代码片段,它会要求访问对两个远程和本地.
现在让我们来看看棘手的部分:D
我是否需要启用某些功能才能接收静音通知?
如果您未启用此功能,您的应用将不会收到令牌.没有令牌,服务器无法识别您.
要启用backgroundModes,你可以把它做要么用你的plist或Xcode的能力.
您可以这样做的原因是:plist更接近您的代码并且是旧的方式,也许它是传统支持.Xcode功能是更简单的新方法.
plist中:
项目0只是一个索引,它不是字典的键(你通常在plist中看到的东西),UIBackgroundModes是一个array
字符串.该字符串必须只来自一个允许值从UIBackgroundModes阵列.
Xcode功能:
检查Remote Notification
在Xcode的背景下模式如下:
如果您不执行上述任何操作,请使用以下方法切换通知:
将终止远程和本地通知
但是,如果您确实从plist或Xcode功能启用后台应用程序刷新,那么即使关闭了应用程序的通知,您仍会收到静默通知!
如果用户想要禁用静默通知,则必须禁用这两个通知,并为您的应用/整个系统禁用"后台应用刷新".要在整个系统中禁用"后台应用刷新",您必须执行以下操作:
我为什么这么说?向您解释静音和推送通知的设置对于用户而言是不同的,并且发送它们的限制是不同的.有关更多信息,请参阅WWDC视频中的此时刻.请看这里(之前的链接已经死了):
默认情况下启用静默通知.
用户无需批准您未授权您的应用使用它们,您只需开始使用它们而无需向用户请求许可.
但是静默通知是后台应用刷新背后的机制.
在任何时候,您都知道用户可以进入设置并禁用它们.
所以你不能依赖它们永远可用.
您不知道用户是否将其关闭,并且您不再收到通知.
这也意味着尽可能地提供静默通知.
这意味着当通知到达用户的设备时,系统将做出一些选择.
它将使用来自设备的不同信号以及用户行为,如电源或一天中的时间来决定何时是发送通知和启动应用的好时机.
它可能会尝试节省电池,或者可能会尝试匹配用户行为,并在用户更有可能使用它时使内容可用.
另见这里.
CAVEAT:即使您禁用应用后台刷新并禁用允许通知,如果您的应用位于FOREGROUND,您仍然可以收到无提示通知.如果您的应用处于后台,则无法投放.
我是否需要启用某些内容才能接收远程通知?
您只需要从Xcode功能启用推送通知:
如果您未启用此功能,您的应用将不会收到令牌.没有令牌,服务器无法识别您.
好奇......你能告诉我我的有效载荷应该是什么样的吗?
我强烈建议您查看Apple§ 文档.很清楚.
谢谢,但你能告诉我重要的部分吗?
嗯......好的,但是你知道这是来自我刚刚说过的链接:
对于无声通知,有两个标准:
aps
字典必须包含content-available
值为的密钥1
.aps
字典中不得包含
alert
,sound
或badge
键.示例有效负载如下所示:
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
Run Code Online (Sandbox Code Playgroud)
acme1,acme2或只是一些自定义数据!但是对于aps
密钥,您必须遵循Apple的结构,否则它将无法正确映射,您将无法正确读取数据.
对于远程通知:
你需要一把alert
钥匙aps
.
举个例子:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Run Code Online (Sandbox Code Playgroud)
还有第三种选择,我将在答案中进一步讨论.
至于固定密钥aps
和alert
字典密钥是什么,请参阅这些Apple文档.
好的,我知道了.什么是content-available
?
非常简单.它只是一个标志,告诉您的应用程序需要唤醒并下载内容,因为我有可供下载的内容!有关详细信息,请参阅此确切时刻.
默认情况下,content-available
不包含该标志,即默认情况下,您发送的通知不会触发application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
或在您的应用中执行某些操作.它只会显示通知.如果您想要唤醒应用程序(在后台执行某些操作),则需要包含content-available
并将其设置为1
.
§:如果您使用的是Firebase,则有效负载结构和密钥可能略有不同.例如,密钥
content-available
被替换为content_available
.有关详细信息,请参阅Firebase文档以及此处.
我知道你告诉我,当我使用静音通知时,我只能将某些东西下载到我的应用程序中,但有没有办法我可以在后台唤醒我的应用程序并下载一些用于远程通知的东西?
是的,但是然后类似于静默通知,您还必须将content-available
标志设置为1,因此它会知道唤醒并下载某些内容.否则,它只会弹出并提示/徽章/声音,但不会下载任何内容.
重要笔记:
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
}
Run Code Online (Sandbox Code Playgroud)
这一刻从WWDC视频中提到了
我对远程通知感到困惑.我想每当我收到通知时,我的应用程序就会在后台变为活动状态并下载内容.你可以解释吗?
例如,此时:
您的iPhone刚收到一个"无发件人"的远程通知.要获得此信息,WhatsApp 不必在后台运行,即您不需要从BackgroundModes启用"远程通知".即使您的应用程序被强制退出或暂停,您仍会收到通知,因为该过程由操作系统管理,而不是WhatsApp应用程序.但是,如果您希望能够将实际消息或其图像/视频下载到WhatsApp(这样,一旦您的用户打开WhatsApp,视频就会坐在那里等待用户),那么您需要将应用程序变为活动状态.为此,您需要content-available : 1
并实施application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
同样,如果您停用某个应用的移动数据,您仍会收到其通知.但是,通过点击该通知,用户将无法为该应用程序发出任何网络请求.他们只能打开应用程序.
或者对于另一个类似的情况,如果您连接的服务器/接入点具有受限制的访问权限,例如WhatsApp,它仍然允许您接收APN通知.但是,通过点击该通知,用户将无法为该应用程序发出任何网络请求.他们只能打开应用程序.
CAVEAT:如果应用程序被用户强行退出,那么当您因上述原因获得通知时,您无法执行任何操作以自动将应用程序退出其终止状态(即使您已content-available
设置为1
).您的任何委托方法都不会被击中.该用户必须打开应用,并且只有那么你的委托方法将达到.
关于可靠性和APN架构的说明: 尽管通知大量用于向应用程序提供实际内容,但它们在某种程度上并非旨在向应用程序提供内容.相反,它们旨在通知用户"嘿,新的东西已经到来(2b消息或50kb小图像,或10mb图像或2GB视频).如果你愿意,打开应用程序.顺便说一句,这是一个它的一小部分(实际的消息本身,如果它可以适合,图像的标题或通知中显示的缩略图,视频的标题或视频中显示的缩略图".更多信息,请参阅iOS APNS"最佳 -努力"回退.为了重复自己,你永远不会下载电子邮件中发送的40mb附件.你只是得到它存在的通知.你发送足够的(附件的缩略图视图),以便用户被告知什么是新的,可以决定是否需要打开应用程序.当我刚接触iOS时,我认为你实际上是通过推送通知发送图像/视频.你没有!
推送通知将使用户知道他们收到了通知(例如,显示通知弹出窗口)。静默通知将更新,但不会通知用户。在任何情况下,您都可以在以静默方式通知时执行操作,就像是推送通知一样。唯一的区别是用户将不会收到带有弹出通知的通知。
区别在于有效负载:
推送通知:
aps {
content-available: 1
alert: {...}
}
Run Code Online (Sandbox Code Playgroud)
静默通知:
aps {
content-available: 0
alert: {...}
}
Run Code Online (Sandbox Code Playgroud)
并且您必须在“ 功能 ”中设置您选择的背景模式。
归档时间: |
|
查看次数: |
24786 次 |
最近记录: |