Swift didReceiveRemoteNotification userInfo 无法获得价值

Posted

技术标签:

【中文标题】Swift didReceiveRemoteNotification userInfo 无法获得价值【英文标题】:Swift didReceiveRemoteNotification userInfo can't get value 【发布时间】:2015-07-04 18:20:25 【问题描述】:

我使用推送通知,并且有这个功能:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
    if let msg = userInfo["msg"] as? NSObject 
        println(msg)
    
    GCMService.sharedInstance().appDidReceiveMessage(userInfo);
    NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil,
        userInfo: userInfo)

这会打印我:

"model":"que","data":"id":101,"vehicle":"license_plate":"test","taxi":"id":1,"logo":"/media/logos/mega_CxRn739.png.75x75_q85_crop.png","name":"Mega","city":"Novi Pazar","country":"Srbija","label":"A01"

// prettify:

    "model": "que",
    "data": 
        "id": 101,
        "vehicle": 
            "license_plate": "test",
            "taxi": 
                "id": 1,
                "logo": "/media/logos/mega_CxRn739.png.75x75_q85_crop.png",
                "name": "Mega",
                "city": "Novi Pazar",
                "country": "Srbija"
            ,
            "label": "A01"
        
    

现在当我使用时:

if let msg = userInfo["msg"] as? NSObject 
    println(msg["model"])
    println(msg["data"])

我无法构建:

'NSObject' does not have a member named 'subscript'

我怎样才能让它工作?在此之后我需要获得所有属性,但不能做第一步。

图片:

修复

if let msg = userInfo["msg"] as? String 
    if let data = msg.dataUsingEncoding(NSUTF8StringEncoding) 
        if let jsonObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: nil) 
            var data = JSON(jsonObject!)
            println(data["data"])
        
    

如果有人对此修复有任何建议,请告诉我.. 谢谢。

【问题讨论】:

嗯……也许将msg 转换为NSDictionary 并使用valueForKey: 来获取内容? 什么也没发生,还是一样:( 控制台什么也没输出?甚至没有时间戳?试试println("This should work: \(msg.whatever())")?你确定代码正在执行吗? 是的,我在打印userInfo时收到消息,它是json.. 不确定你的意思。您能否使用在同一代码块中打印 msg 及其内容的实际输出来更新您的问题? 【参考方案1】:
if let msg = userInfo["msg"] as? String 
    if let data = msg.dataUsingEncoding(NSUTF8StringEncoding) 
        if let jsonObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: nil) 
            var data = JSON(jsonObject!)
            println(data["data"])
        
    

如果有人对此修复有任何建议,请告诉我.. 谢谢。

【讨论】:

【参考方案2】:

payload 中的相关对象是字典,因此请将 msg 的值转换为更具体的值

if let msg = userInfo["msg"] as? [String:AnyObject] 
    println(msg["model"])
    println(msg["data"])

编辑:

msg 的对象可能只是一个 JSON 字符串。 试试这个:

if let msg = userInfo["msg"] as? String 
   println("yeah, it's a string")
   if let data = msg.dataUsingEncoding(NSUTF8StringEncoding) 
      if let jsonObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: nil) 
        println(jsonObject["model"])
        println(jsonObject["data"])
      
   

【讨论】:

现在我没有收到错误,但没有打印任何内容。为什么? 奇怪,转换为 [String:AnyObject] 在我的一个使用 APNS 的项目中有效。尝试显式转换as! 而不是as?,然后编译器错误消息可能会告诉您预期的类型 它更改为as?:Forced downcast in conditional binding produces non-optional type '[String : AnyObject]'; use 'as?' to perform a conditional downcast,顺便说一句,这是GoogleCloudMessages,如果有任何更改的话.. 接下来尝试as?NSDictionary 作为类型(无括号)并在块中插入println("I'm here") 行以查看测试是否完全通过 一样 :( 我不知道为什么 :/

以上是关于Swift didReceiveRemoteNotification userInfo 无法获得价值的主要内容,如果未能解决你的问题,请参考以下文章

应用程序收到通知,但在第一个会话中未调用 UIApplicationDelegate 方法

swift [Swift Notes]在学习Swift #Swift的同时收集笔记

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift