Swift Firebase远程通知中如何访问AnyHashable类型的shipmentMessage数据
解决Firebase远程通知中shipmentMessage访问问题
问题原因
从你提供的通知数据可以看到,shipmentMessage对应的值是字符串类型,但你的代码错误地将其强转为[AnyHashable:Any]字典类型,导致类型转换失败,最终判断该字段为nil。
修正后的代码
if UIApplication.shared.applicationState == .active { print("ACTIVE< CHECK > SHIPMENT MESSAGE : : : : : : \(String(describing: userInfo["shipmentMessage"]))") // 合并guard判断,简化代码 guard let arrAPS = userInfo["aps"] as? [String: Any], let arrAlert = arrAPS["alert"] as? [String: Any] else { return } // 正确识别shipmentMessage的字符串类型,同时判断内容非空 if let shipmentMessage = userInfo["shipmentMessage"] as? String, !shipmentMessage.isEmpty { print("***********NOT NULL***************") let strTitle = arrAlert["title"] as? String ?? "" let strBody = 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 { print("The shipmentMessage was null or empty") } }
关键优化点
- 类型匹配:将
userInfo["shipmentMessage"]的转换目标改为String,与实际数据类型一致。 - 严谨性:增加
!shipmentMessage.isEmpty判断,确保只有非空的消息才触发弹窗。 - 代码简洁:合并多个
guard语句,减少嵌套层级。
内容的提问来源于stack exchange,提问作者rmr84
相关产品推荐
相关产品推荐

