如果应用程序被强制退出,则处理 IOS 远程通知

Posted

技术标签:

【中文标题】如果应用程序被强制退出,则处理 IOS 远程通知【英文标题】:Handle IOS remote notifications if the app is forced quit 【发布时间】:2018-09-24 04:16:58 【问题描述】:

我像下面显示的代码 sn-p 一样处理远程通知,但是当用户强制应用程序时,我无法启动应用程序并重定向到特定页面。

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) 


        let userInfo = response.notification.request.content.userInfo
        let page = userInfo["page"] as! String


        if page == "message"
            NotificationCenter.default.post(name: Notification.Name(rawValue: "Messages"), object: nil) 

我从这里的某个地方读到,在 appdelegate didfinishlaunchingwithoptions 我们可以添加一行:

    if let remoteNotification = launchOptions?[.remoteNotification] as?  [AnyHashable : Any]  

但我不知道如何从这本词典中提取消息信息

更新了我的通知响应:

 4 elements
  ▿ 0 : 2 elements
    ▿ key : AnyHashable("aps")
      - value : "aps"
    ▿ value : 2 elements
      ▿ 0 : 2 elements
        - key : alert
        ▿ value : 2 elements
          ▿ 0 : 2 elements
            - key : title
            - value : New Message
          ▿ 1 : 2 elements
            - key : body
            - value : You have a new message from John 
      ▿ 1 : 2 elements
        - key : sound
        - value : default
  ▿ 1 : 2 elements
    ▿ key : AnyHashable("gcm.message_id")
      - value : "gcm.message_id"
    - value : 0:
 ▿ 2 : 2 elements
    ▿ key : AnyHashable("google.c.a.e")
      - value : "google.c.a.e"
    - value : 1
  ▿ 3 : 2 elements
    ▿ key : AnyHashable("page")
      - value : "page"
    - value : message

【问题讨论】:

【参考方案1】:

只需要像这样获取“页面”

if let remoteNotification = launchOptions?[.remoteNotification] as?  [AnyHashable : Any] 
            if let page = remoteNotification["page"] as? String 
                if page == "message" 

                
            
        

注意 - 如果这不起作用,请显示您在应用中收到的通知响应

【讨论】:

我可以看看控制台打印的 JSON 格式吗? 兄弟我想我可以从通知中获取消息数据,但是我认为我不能用特定的变量值来笑特定的屏幕,有什么办法吗? 您的意思是启动(应用程序终止时重新启动应用程序?)应用程序。如果是,则根据苹果指南是不可能的。您可能需要拥有 Voip 服务(PushKit),但这也不会直接让您打开应用程序【参考方案2】:

您需要从 didfinishlaunchingwithoptions 委托方法访问 launchOptions 字典,然后访问您的通知负载,如下所示。尝试首先记录 userInfo 字典以查看其内容,然后访问您的通知负载。

var userInfo = launchOptions["UIApplicationLaunchOptionsRemoteNotificationKey"] as? [AnyHashable:任何] var apsInfo = userInfo?["aps"] as? [AnyHashable : 任意]

【讨论】:

apsinfo是否等于userNotificationCenter中的response.notification.request.content.userInfo? 不,不一样。从 launchOptions 字典访问页面键。 它给了我错误“无法使用 'String' 类型的索引为 '[UIApplicationLaunchOptionsKey : Any]' 类型的值下标” 如果让 notificationPayload = launchOptions? [UIApplicationLaunchOptionsKey.remoteNotification] 作为? NSDictionary 试试上面那一行。

以上是关于如果应用程序被强制退出,则处理 IOS 远程通知的主要内容,如果未能解决你的问题,请参考以下文章

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

当应用程序被用户强制退出时处理推送通知iOS(替代方案?)

iOS应用程序被杀死时处理程序不能显示远程通知吗?

iOS的通知:如何WhatsApp的接收通知,并强制关闭,即使他们以后的过程?

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

iOS:如果之前启用,则禁用远程通知