user9606220
user9606220

Reputation:

swift ios how to access AnyHashable data in swift

How to access any AnyHashable data in swift i have my data below , below is the log when i click the notification . When i click notif and when the data logs i want to print or get it so that i can load it on the view . it is already working and it log when i click the notif what i want is how to get it to load in the view.

what i have done

 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) {

data

[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";
    };
}]

Upvotes: 7

Views: 7542

Answers (3)

Abhirajsinh Thakore
Abhirajsinh Thakore

Reputation: 1822

You can Possibly Try:

Update for 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)
    }
}

Swift 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)
    }
}

Upvotes: 8

user9606220
user9606220

Reputation:

anwer : on how to load notif data when notif is tap

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()
    }

Upvotes: 2

Apurv Soni
Apurv Soni

Reputation: 51

APS data can be checked as below. You can check each keys as below to avoid crashing app if particular key is not available in notification data and handle accordingly.

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)
      } 
   }
}

Upvotes: 0

Related Questions