You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:45:06