【发布时间】:2021-01-27 11:17:56
【问题描述】:
首先,澄清一下……
在提出这个“重复的问题”以确认我的知识是正确的并得出结论之前,我已经对现有资源(媒体、stackoverflow、苹果开发者论坛等)进行了相当多的搜索和阅读。
- Will iOS launch my app into the background if it was force-quit by the user?
- How to get the push notification payload when force-quit / swipe up to kill the iOS app without tapping on the banner/alert?
- https://medium.com/fenrir-inc/handling-ios-push-notifications-the-not-so-apparent-side-420891ddf10b
- Handling Push Notifications when App is Terminated
- https://developer.apple.com/forums/thread/62005#:~:text=In%20most%20cases%2C%20the%20system,force%20quit%20by%20the%20user。
在我们开始之前,只是以非常精确的方式说明这些术语。这就是我提到时所指的内容
- 前台 - 应用处于活动状态并正在运行,用户基本上正在与应用交互
- 背景 - 用户在交互后点击主页按钮。应用保持在后台,用户可以双击主页按钮并从 App Switcher 中找到应用。
- 退出 - 应用程序实际上在后台,但它已被系统本身终止。
- Kill - 应用不再处于后台,用户双击主页按钮并将应用从 App Switcher 上滑开。
我正在尝试解决的用例
应用在 BACKGROUND、QUIT 和 KILL 状态接收推送通知,然后执行某些后台操作(更新应用程序徽章 + 将通知存储在设备中)
- 作为背景 - 是的,我已经设法通过在 APNS 有效负载中一起发送
content-available = 1来实现这一点。通知横幅出现,后台操作执行! - 对于 QUIT - 是的,我设法通过在 APNS 有效负载中一起发送
content-available = 1来实现这一点。通知横幅出现,后台操作执行! - 对于 KILL - 显示通知横幅,但未触发后台操作。
我的问题
- 无论何时杀死应用程序,都无法在收到通知时唤醒应用程序以执行任何后台操作?
- Whatsapp 等消息传递应用程序如何工作?
- 应用强制退出时,我该如何处理?
-
只有当用户点击通知横幅时,我的应用才能运行这些后台操作(增加徽章计数 + 存储数据)。
-
否则,如果用户选择点击应用图标来打开我的应用。推送的通知在我的应用中根本不存在,包括徽章数量没有增加。
以下是我用 Whatsapp 测试过的内容
背景状态
- 打开 Whatsapp,点击主页按钮(将应用程序保留在后台)
- 在设备中发送短信,出现横幅通知
- 点击应用图标打开应用,应用中有消息。
强制退出状态
- 打开 Whatsapp,双击 Home 键,滑动应用程序
- 在设备中发送短信,出现横幅通知。
- 点击应用图标打开应用,应用中有消息。
强制退出状态 + WiFi 和蜂窝数据已关闭
- 打开 Whatsapp,双击 Home 键,滑动应用程序
- 在设备中发送短信,出现横幅通知
- 关闭 WiFi 和蜂窝数据已关闭。 (确认并尝试通过 Safari 访问网站)
- 点击应用图标打开应用,应用中有消息。
使用 Whatsapp 进行的测试基本上得出结论,可以让您的应用唤醒以执行后台操作(特别是在 FORCE QUIT 状态 + WiFi 和蜂窝数据关闭的情况下)
我能解释的唯一“解释”是,他们使用的是 PushKit 通知框架而不是用户通知框架。
11 月 3 日更新 - 即使在 KILL 状态下,iOS 13 也会唤醒应用程序
显然在 iOS 13 上,就像 @hubsi 在评论中提到的内容以及来自 Apple forum 的一些 cmets。即使应用被用户手动杀死,iOS 13 也会唤醒我的应用。
【问题讨论】:
标签: ios react-native push-notification notifications apple-push-notifications