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的同时收集笔记