gpt4 book ai didi

ios - 当应用程序被用户强制退出时如何处理推送通知? [iOS]

转载 作者:行者123 更新时间:2023-12-04 08:45:57 27 4
gpt4 key购买 nike

首先,澄清一下......

在提出这个“重复问题”以确认和总结我的知识是正确的之前,我已经对现有资源(媒体、stackoverflow、苹果开发者论坛等)进行了相当多的搜索和阅读。

  1. Will iOS launch my app into the background if it was force-quit by the user?
  2. How to get the push notification payload when force-quit / swipe up to kill the iOS app without tapping on the banner/alert?
  3. https://medium.com/fenrir-inc/handling-ios-push-notifications-the-not-so-apparent-side-420891ddf10b
  4. Handling Push Notifications when App is Terminated
  5. https://developer.apple.com/forums/thread/62005#:~:text=In%20most%20cases%2C%20the%20system,force%20quit%20by%20the%20user .

在我们开始之前,先以非常精确的方式使用术语。这就是我提到的内容

  1. 前台 - 应用处于事件状态并正在运行,用户基本上与应用进行交互
  2. 背景 - 用户在交互后点击主页按钮。应用程序保留在后台,用户可以双击主页按钮并从 App Switcher 找到该应用程序。
  3. 退出 - 应用程序实际上在后台,但它已被系统本身终止。
  4. 终止 - 应用不再处于后台,用户双击主页按钮并将应用从 App Switcher 上滑动。

我正在尝试解决的用例

应用程序在BACKGROUND、QUIT & KILL 状态接收推送通知,然后执行某些后台操作(更新应用角标(Badge) + 将通知存储在设备中)

  1. 对于背景 - 是的,我已经设法通过在 APNS 有效负载中一起发送 content-available = 1 来实现这一点。出现通知横幅,执行后台操作!
  2. 对于 QUIT - 是的,我已经设法通过在 APNS 有效负载中一起发送 content-available = 1 来实现这一点。出现通知横幅,执行后台操作!
  3. 对于 KILL - 出现通知横幅,但未触发后台操作。

我的问题

  1. 当应用程序被杀死时,无法在收到通知时唤醒应用程序以执行任何后台操作?
  2. 它如何适用于 Whatsapp 等即时通讯应用?
  3. 当应用程序被强制退出时,我应该如何处理我的案例?
  • 仅当用户点击通知横幅时,我的应用才会运行这些后台操作(增加角标(Badge)计数 + 存储数据)。

  • 否则,如果用户选择点击应用程序图标来打开我的应用程序。推送的通知根本不会存在于我的应用程序中,包括角标(Badge)计数不会增加。

以下是我用 Whatsapp 测试过的内容

背景状态

  1. 打开 Whatsapp,点按主页按钮(将应用程序保留在后台)
  2. 在设备中发送短信,出现横幅通知
  3. 点击应用图标打开应用,应用中有消息。

强制退出状态

  1. 打开 Whatsapp,双击主页按钮,将应用滑开
  2. 在设备中发送短信,出现横幅通知。
  3. 点击应用图标打开应用,应用中有消息。

强制退出状态 + WiFi 和蜂窝数据关闭

  1. 打开 Whatsapp,双击主页按钮,将应用滑开
  2. 在设备中发送短信,出现横幅通知
  3. 关闭 WiFi 并关闭蜂窝数据。 (确认并尝试通过 Safari 访问网站)
  4. 点击应用图标打开应用,应用中有消息。

使用 Whatsapp 进行的测试,基本上可以得出结论,可以让您的应用程序唤醒以执行后台操作(尤其是在 FORCE QUIT 状态 + WiFi 和蜂窝数据关闭的情况下)

我自己能够解释的唯一“解释”是,他们使用的是 PushKit 通知框架而不是用户通知框架。

11 月 3 日更新 - iOS 13 唤醒处于 KILL 状态的应用

显然在 iOS 13 上,就像@hubsi 在评论中提到的以及来自 Apple forum 的一些评论一样. iOS 13 确实唤醒了我的应用,即使该应用已被用户手动终止。

最佳答案

更新 swift 5.x Plus iOS 14.x

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.deplinkNotification(userInfo: response.notification.request.content.userInfo )
}
}

更新:除了下面提到的内容之外,从 iOS 13 开始,应用程序似乎在终止状态下收到推送通知时才真正启动。我发现为了触发 didReceiveRemoteNotification:fetchCompletionHandler 委托(delegate),应用程序需要在启动时尽快启动 registerForRemoteNotifications (UIApplication) 方法(例如在 didFinishLaunchingWithOptions 中)。在 React Native 的情况下,与下面所述相反,您实际上可以运行 JS 代码。虽然您必须等待 RN 在运行代码之前启动,例如像这样:

    public class func didReceiveRemoteNotification(_ userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
// some RN bridged method/event
}
}

旧答案:

在 iOS 上收到推送通知且应用程序被终止时,有两种方法可以运行代码:

  1. 通过使用 PushKit framework
    注意:Apple 只允许 PushKit 框架用于 VoIP 和 watchOS 应用程序,因此在没有实际要求的情况下使用它,您的应用程序可能无法通过 Apple 的审核
  2. 通过使用 Notification Service Extension
    使用此扩展使您能够在后台运行( headless )代码,包括“丰富”通知,例如带有图片附件

至于 WhatsApp,我很确定他们正在使用 PushKit(他们无论如何都需要它来处理来电)。尽管我认为您在上次测试中描述的内容也可以使用通知服务扩展来实现:
在扩展中,您可以处理推送的通知,包括其有效负载并将数据(例如聊天消息)写入本地应用程序存储(例如通过应用程序组与您的主应用程序共享)。当应用程序打开时,它会从存储中读取该数据(聊天消息在没有数据网络的情况下出现)。

由于问题被标记为“react-native”:请注意,据我所知,不可能在通知服务扩展中调用 RN 桥接 JavaScript 代码。您必须编写 native (Swift/Obj-C) 代码。

关于ios - 当应用程序被用户强制退出时如何处理推送通知? [iOS],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64329778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com