强制退出应用程序在后台模式下的静默通知

Posted

技术标签:

【中文标题】强制退出应用程序在后台模式下的静默通知【英文标题】:Silent notifications in Background Mode on force-quit apps 【发布时间】:2019-04-04 18:31:18 【问题描述】:

我的问题是:当用户强制退出(滑动)应用程序时,我无法让静默通知工作!

我猜以下是事实:如果应用程序被强制,静默推送(使用content-available:1)不会触发application(_:didReceiveRemoteNotification:fetchCompletionHandler:),也不会触发任何其他方法(它不会启动应用程序) - 用户退出(刷走)!谁能证明这是错的?

我已确定我已启用 后台模式: 远程通知

但如果非静音通知对我不起作用怎么办?我需要无声的,我需要能够在展示之前进行一些检查!如果我想在收到来自远程服务器的通知后检查正确的用户是否登录到我的应用程序怎么办? (因为我不能保证当他退出时他成功让服务器知道这件事,所以我假设服务器不确定)

在我的情况下应该采取什么正确的方法?

类似的事情有很多问题,但涉及的人不多,不知道为什么?我不相信我有这么罕见的情况。也许我解决这类问题的基本方法是错误的?在android平台上似乎完全没有问题!

我使用 FCM 作为发送通知的中心点,所以如果你说 PushKit 可以解决我的问题,那太可惜了 FCM 不支持 VoIP 证书。但是,我想知道,PushKit 真的可以解决这个问题吗?或者苹果只是这样设计的,当用户强制退出一个应用程序时,这意味着这个应用程序必须完全关闭它的远程通知功能?!

我不认为这是Firebase silent notification does not start up a closed ios app 的重复,因为我在这里要问的是,如果您想检查接收通知的用户是否与登录到应用?如果在 iOS 平台上绝对没有解决方案,可以认为是重复的。

【问题讨论】:

Firebase silent notification does not start up a closed iOS app的可能重复 不管这个问题是否重复,最好将您看到的问题链接起来。您可以进行编辑并链接到它们吗? 【参考方案1】:

你问:

或者[已经]Apple 只是这样设计,当用户强制退出应用程序时,这意味着该应用程序必须完全关闭并具有推送远程通知的能力?

是的,它就是这样设计的。 App Programming Guide for iOS: Understanding When Your App Gets Launched into the Background 说:

在大多数情况下,系统不会在用户强制退出后重新启动应用程序。一个例外是位置应用程序,它在 iOS 8 及更高版本中在被用户强制退出后会重新启动。但是,在其他情况下,用户必须明确启动应用程序或重新启动设备,然后系统才能将应用程序自动启动到后台。在设备上启用密码保护时,系统不会在用户首次解锁设备之前在后台启动应用程序。

【讨论】:

感谢您对官方文档的引用,它将帮助我向我的客户证明为什么这样的事情在 iOS 上是不可能的。但是,我只是想看看是否有人会为我的“用户离线注销”案例提出一些想法。【参考方案2】:

不可能。当应用程序处于后台或暂停模式时,您将有 30 秒的时间来做一些事情。但是如果用户手动杀死应用程序 func didReceiveRemoteNotification 将永远不会调用。

更新:

当 iOS 设备收到静默通知时,系统会在后台唤醒您的应用并调用其应用委托的 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 方法。您的应用程序有 30 秒的挂钟时间来执行任何任务并调用提供的完成处理程序。有关详细信息,请参阅处理通知和通知相关操作。

【讨论】:

但是关于静默推送通知和后台任务的问题 IIRC 如果它被暂停,那么它就进入休眠状态,你不能做任何事情。你有 0 秒的时间去做事情。如果它是后台的,那么你有 5 秒的时间直到它调用 AppWillTerminate 或 180 秒,如果你已经注册了一个后台任务。 180 秒后应用程序将被终止

以上是关于强制退出应用程序在后台模式下的静默通知的主要内容,如果未能解决你的问题,请参考以下文章

APNS:如果应用程序被强制退出,则接收静默远程通知

什么是静默推送通知?设备什么时候收到?

使用firebase发送静默推送通知,以便在应用程序被杀死时唤醒它

应用程序处于非活动状态时无法接收静默通知 iOS

静默推送通知不起作用

iOS,先强制退出应用,点击接收通知banner后,应用启动失败