Swift5开发iOS应用使用Firebase推送如何解析提取italian_msg作为通知正文
解决方案
核心逻辑说明
你收到的推送aps.alert.body字段是JSON格式字符串,需要先将其转为字典后提取italian_msg字段,再替换通知正文展示即可。
代码修改
1. 前台收到推送时的解析(willPresent方法)
这里同时提供原生Swift解析和SwiftyJSON解析两种实现,你可以根据项目已有的依赖选择:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo Messaging.messaging().appDidReceiveMessage(userInfo) // 层级解析,全部用可选绑定避免崩溃 guard let aps = userInfo["aps"] as? [String: Any], let alert = aps["alert"] as? [String: Any], let originTitle = alert["title"] as? String, let bodyString = alert["body"] as? String, let bodyData = bodyString.data(using: .utf8) else { // 解析失败走原有展示逻辑 completionHandler([.alert, .sound]) return } var italianMsg = "" // ---------- 二选一解析方式 ---------- // 方式1:原生Swift解析(无需第三方依赖) do { guard let bodyDict = try JSONSerialization.jsonObject(with: bodyData) as? [String: Any], let msg = bodyDict["italian_msg"] as? String else { completionHandler([.alert, .sound]) return } italianMsg = msg } catch { print("推送body解析失败: \(error)") completionHandler([.alert, .sound]) return } // 方式2:SwiftyJSON解析(项目已集成SwiftyJSON时使用) /* let bodyJSON = JSON(bodyData) guard let msg = bodyJSON["italian_msg"].string else { completionHandler([.alert, .sound]) return } italianMsg = msg */ // ---------- 解析方式结束 ---------- // 构建自定义通知替换原有推送展示 let content = UNMutableNotificationContent() content.title = originTitle content.body = italianMsg content.sound = .default let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) UNUserNotificationCenter.current().add(request) // 禁止原有推送展示,仅展示自定义内容 completionHandler([]) }
2. 用户点击推送时的解析(didReceive方法)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo guard let info = userInfo as? [String: AnyObject], let aps = info["aps"] as? [String: Any], let alert = aps["alert"] as? [String: Any], let bodyString = alert["body"] as? String, let bodyData = bodyString.data(using: .utf8), let bodyDict = try? JSONSerialization.jsonObject(with: bodyData) as? [String: Any], let status = bodyDict["status"] as? String else { completionHandler() return } // 把解析到的业务状态传入处理方法 hanleNotification(info: info, strStatus: status, strFrom: "Back") completionHandler() }
后台推送展示优化说明
如果需要App在后台时系统弹出的推送也展示italian_msg,需要新增Notification Service Extension,在扩展中做和上面一致的解析逻辑,修改推送的body内容后再交给系统展示即可。
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

