直接运行代码以响应接收到 APNS 消息

Posted

技术标签:

【中文标题】直接运行代码以响应接收到 APNS 消息【英文标题】:Running code directly in response to recieving an APNS message 【发布时间】:2019-11-08 09:02:34 【问题描述】:

我们有一个 ios 应用程序,我们通过 FCM 向其发送通知。

理想情况下,我们希望能够让应用程序直接从通知中运行一些代码。

如果我们发送数据类型通知并且应用程序在前台,这似乎是可行的。

但是 - 如果 a) 应用程序在后台 b) 应用程序已终止。有什么方法可以自动启动应用程序,或者在应用程序终止时让应用程序自行备份。

谢谢

【问题讨论】:

【参考方案1】:

应用在前台

在 AppDelegate 中实现 didReceiveRemoteNotification 委托方法来处理通知并在应用处于前台时运行您想要的代码。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) 
    //write your code here when app is in foreground

应用在后台

当应用程序处于后台并且用户收到推送通知时,如果用户点击通知,didReceiveRemoteNotification 将被调用,但如果用户点击应用程序图标,则不会调用此方法,在此如果您必须与您的服务器通信,或者您可以使用之前的值检查徽章编号(您可以将其存储在 NSUserDefaults 中)并运行您想要的代码。

应用已终止

当应用程序被终止时,didReceiveRemoteNotification方法不会被调用, 但是您可以在 appdelegate 的 didFinishWithLaunchOptions 方法中检查 launchOptions 以了解应用程序是否已通过通知启动,并相应地执行您的任务。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool 

    if launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] != nil 
     // Do your task here
    


【讨论】:

感谢 Prakash 的明确回答。我想探索的是我是否可以在后台模式下执行代码——而不必等待用户与通知进行交互。在我的问题中,我提到了使用“数据”消息(而不是通知),因此这些消息在发出通知方面无论如何都不会涉及用户。例如,是否可以在使用 info.plist 中的一种背景模式的代码中处理 APNS 消息,如果可以,哪一种最适合响应 FCM/APNS 消息? 只要在 info.plist 中为“远程通知”选择了“启用后台模式”,非通知(即仅数据)FCM/APNS 事件确实执行触发 didReceiveRemoteNotification 事件。 所以我可以让代码在后台执行的唯一方法是发送静默通知。但是,静默通知的优先级低于警报通知,无论如何,根据苹果文档,不能保证一定会交付。所以这里的底线问题是如何在发送警报通知后在后台执行代码?这甚至可能吗?

以上是关于直接运行代码以响应接收到 APNS 消息的主要内容,如果未能解决你的问题,请参考以下文章

无法接收生产 apns 的推送消息

APNS:如果应用程序未运行,是不是接收非静默通知?

当应用程序未运行时,如何通过低功耗蓝牙接收消息?

将消息发送到套接字端口并使用Spring Integration接收响应

苹果推送流程

当 iOS 设备被锁定并且我没有立即响应时接收远程通知