简介
在本文中,我想分享我在iOS应用中实施无声推动通知的经验。使用无声推动通知的目的是解决某些服务在长时间闲置时入睡的问题。或者,例如,如果您有Messenger应用程序,并且希望用户能够访问新/更新的内容,而不必等待它下载。无声推动通知使我们能够每21分钟激活一次应用程序(我们拿起的最小值,以便苹果不会授予临时禁令)并在后台运行服务以更新。
无声推动通知
提供更新应用程序内容,进行API调用并执行背景任务的能力。它们是在没有激活屏幕哔哔声或其他可见通知的情况下发送的
(实际上,该应用程序进入了一个活动状态,通常与普通启动没有什么不同。导航将起作用,屏幕将初始化,尽管它们在屏幕上不会可见。也将执行finishlaunchingwithoptions方法)。
无声推动通知在后台唤醒您的应用程序,从而使时间从服务器下载数据并在后台执行任务。
1。设置无声推动通知
首先,您需要为应用程序中的无声推送通知设置支持。这是您需要遵循的步骤的简要概述。
1.1 开发人员门户
访问Apple网站上的开发人员门户网站,并确保启用背景模式和背景获取支持。
1.2 配置概况
确保配置配置文件(链接到您的应用程序ID)包括对背景模式和背景获取的支持。
1.3 启用远程通知
在XCode的项目中,打开文件AppDelegate.swift,然后将以下代码添加到方法application(_:didFinishLaunchingWithOptions:)
:
// Registration to receive notifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
if granted {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
}
1.4 签名和能力
在这里,您需要允许使用推送通知
滚动到底部。并为远程通知的盒子打勾。根据您的需求检查其余的。
2。处理无声推动通知
设置无声推动通知后,您将需要一个处理程序,该处理程序将响应接收此类通知并触发某些服务。这里是添加到您的appdelegate.swift
的示例代码
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// Silent Push Notification processing
if let silentNotification = userInfo["aps"] as? [String: AnyObject],
silentNotification["content-available"] as? Int == 1 {
// Launch of a some service
SomeManager.shared.startUpdatingAnything()
}
// Ending a background operation
completionHandler(.noData)
}
使用完成处理程序
您只有30秒即可执行背景请求,并且应在完成时致电完成。
3。后端
您应该告诉后端开发人员的所有内容
3.1 您必须告诉后端要发送哪个身体,您可以自行决定添加其他字段。
为了使通知保持沉默,您必须指定内容可用:1。
您可以阅读更多有关它的信息。
3.2 如果您想在没有后端的情况下检查您的通知。您将需要一个模拟后端检查的应用程序。
我使用了PushNotifications。
(您可以跳过这一点,直接转到3.2.1)
更新!在我发表本文的那天,苹果介绍了一种新工具以推送通知ð
3.2.1 Push Notifications Console
新的推送通知控制台可以轻松通过Apple Push Notification Service(APN)向Apple设备发送测试通知。您可以访问可提供有关交付过程的见解并利用工具生成和验证令牌的日志。取自Apple的官方website。
取自苹果的官方website
您不需要P8文件即可进行推送通知控制台。您只需登录到您的帐户并开始测试。使用推送通知记录也非常方便。
3.3 注册令牌
注册令牌需要发送远程通知。
为了将通知发送到远程设备,您的应用程序必须收到APN(Apple Push Notification Service)用来向特定设备传递通知的注册令牌。注册令牌是与设备和您的应用相关的唯一标识符。启动您的应用程序时,它会与APN进行通信以接收注册令牌,然后可以将其发送到您的服务器。您的服务器使用此令牌将通知发送到相关设备。
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data) {
let pushToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
self.yourPushNotificationsService.pushTokenDidReceived(pushNotificationToken: pushToken)
}
一旦您拥有特定用户的注册令牌,您可以通过服务器,第三方服务(PushNotifications)或Firebase Cloud Messaging将通知发送到其远程设备。
以下图显示了接收令牌和发送通知的过程。
资料来源:https://betterprogramming.pub
3.4 下载.p8文件 b。如果您首次设置推送通知,则以下说明适合您: 4。在物理设备上安装应用程序 设置>(向下滚动)>您的应用程序>背景应用刷新(启用) 5。问题和解决方案 5.1 苹果的限制 5.2 错误处理 5.3 优化电池使用 注意以下几点非常重要: 5.4 无声推动在低功率模式下不起作用。 5.5 静音 - 孔系统的处理取决于几个因素: 可用的免费内存数量:关闭应用程序时,系统会创建所使用的内存的快照,并将点分配给无声推动处理速度。如果您的应用程序正在训练机器学习模型或使用超过400 MB的内存,则系统可能会拒绝处理推送通知。因此,建议您在切换到背景模式时尝试最大程度地减少资源使用情况并释放内存。 电池充电水平。 推送通知的频率:系统可以每20分钟处理一次无声推动通知。 一天中的时间:系统可以根据一天中的时间改变其对处理推送通知的态度。 电话充电状态:如果设备负责,则系统可能更容易处理无声。 应用程序崩溃:如果您的应用程序崩溃,则系统可能无法处理静音 - 可能会分配罚款点。 结论 分享您对文章的想法。您的评论将帮助我扩展这项研究,并提供有关本文主题的其他材料。这将使它更有用。 我想将我的第一篇技术文章献给导师。我想在我是初级开发人员时对您的耐心,礼貌和一致性表示衷心的感谢。
安装应用程序时,请确保检查是否具有背景应用程序刷新启用
在实施无声推动通知的过程中,我遇到了一些可能对您有用的问题。
苹果对发送静默推送通知的频率有严格的限制。如果连续发送了几次无声推动通知,他们可能会停止到达用户。为了避免此问题,我使用后端计时器来确保每21分钟每21分钟发送一次无声推动通知。
处理无声推动通知时处理可能的错误很重要。例如,如果某些服务已经有效,则应忽略新的无声推动通知,以免连续运行服务并不必要地使用资源。
运行一些服务可以消耗大量的电池电量。为了最大程度地减少这一点,我已经设置了每次无声推送通知后服务将运行的时间的限制。
因此,当您将手机负责并在第二天早晨进行第一次无声推动时,系统将逐渐增加处理推送通知并随着时间的推移减少罚款点的可能性。
应用程序中使用无声推动通知已解决了某些服务长时间后入睡的问题。收到无声推送通知后,每21分钟启动服务一次,可更新应用程序中的数据,提供更好的体验和可用性。
保持出色的工作!