繁体   English   中英

swift ios 如何快速访问 AnyHashable 数据

[英]swift ios how to access AnyHashable data in swift

如何快速访问任何 AnyHashable 数据我在下面有我的数据,下面是我单击通知时的日志。 当我单击 notif 和数据记录时,我想打印或获取它,以便我可以将其加载到视图中。 它已经在工作,当我点击通知时它会记录,如果我想要的是如何让它在视图中加载。

我做了什么

 guard
            let aps = userInfo[AnyHashable("aps")] as? NSDictionary,
            let alert = aps["alert"] as? NSDictionary,
            let body = alert["body"] as? String,
            let title = alert["title"] as? String
            else {
                return
        }

        print("Title: \(title) \nBody:\(body)")

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

数据

[AnyHashable("aps"): {
    alert =     {
        body = "yuuu - 5.00";
        title = "New Chore!";
    };
    "content-available" = 1;
}, AnyHashable("data"): {
    chore =     {
        desc = huu;
        name = yuuu;
        pk = 125;
        reward = "5.00";
        sched = "2018-04-12T09:52:13+08:00";
    };
    "notification_id" = 16;
    pusher =     {
        publishId = "pubid-01ff965a-20af-4a58-9901-89782043d832";
    };
}]

您可以尝试:

Swift 5+ 的更新:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    guard let arrAPS = userInfo["aps"] as? [String: Any] else { return }
    if application.applicationState == .active{
        guard let arrAlert = arrAPS["alert"] as? [String:Any] else { return }

        let strTitle:String = arrAlert["title"] as? String ?? ""
        let strBody:String = arrAlert["body"] as? String ?? ""

        let alert = UIAlertController(title: strTitle, message: strBody, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .default) { action in
            print("OK Action")
        })
        self.window?.rootViewController?.present(alert, animated: true)
    } else {
        guard let arrNotification = arrAPS["notification"] as? [String:Any] else { return }
        guard let arrAlert = arrNotification["alert"] as? [String:Any] else { return }

        let strTitle:String = arrAlert["title"] as? String ?? ""
        print("Title --", strTitle)
        let strBody:String = arrAlert["body"] as? String ?? ""
        print("Body --", strBody)
    }
}

斯威夫特 2+:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {

    guard let dictAPS = userInfo["aps"] as? NSDictionary else { return }

    if application.applicationState == .active{
        let title = dictAPS.value(forKeyPath: "alert.title")
        let body = dictAPS.value(forKeyPath: "alert.body")
        let alert = UIAlertController(title: "\(title!)", message: "\(String(describing: body))", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .default) { action in
                   })
        self.window?.rootViewController?.present(alert, animated: true)
    }else{
        guard let dictNoti = dictAPS.value(forKey: "notification") as? NSDictionary else { return }
        let title = dictNoti.value(forKeyPath: "alert.title")
        print(title)
        let body = dictNoti.value(forKeyPath: "alert.body")
        print(body)
    }
}

回答:关于如何在点击通知时加载通知数据

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

        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        if let messageID = userInfo["gcmMessageIDKey"] {
            print("Message ID: \(messageID)")
        }
        switch response.actionIdentifier {
        case "action1":
            print("Action First Tapped")
        case "action2":
            print("Action Second Tapped")
        default:
            break
        }

        // Print full message.
        print(userInfo)
        Messaging.messaging().appDidReceiveMessage(userInfo)
        completionHandler()
    }

APS 数据可以检查如下。 如果通知数据中的特定键不可用,您可以按如下方式检查每个键以避免应用程序崩溃并进行相应处理。

if (userInfo["aps"] as? [String:Any]) != nil {
   if let data = userInfo["data"] as? String{
      if let desc = userInfo["desc"] as? String {
          //Access variable desc here...
          print(desc)
      } 
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM