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

iOS端FreshChat与FCM集成问题:onMessageOpenedApp未触发

FreshChat与FCM集成iOS端踩坑:点击带深度链接的推送后onMessageOpenedApp不触发

问题场景

集成FreshChat和Firebase Messaging(FCM)后,发送带深度链接的推送通知时,仅iOS设备出现异常:点击通知后,FCM的onMessageOpenedApp回调完全没触发,Android端正常工作。

问题原因

排查后发现,FreshChat的iOS SDK会拦截推送通知的点击事件,当通知包含深度链接时,FreshChat会优先处理跳转逻辑,直接跳过了FCM的回调触发流程,导致onMessageOpenedApp无法执行。

解决方案

1. 修改iOS端AppDelegate的通知响应方法

在AppDelegate.m或AppDelegate.swift中,调整通知点击的处理逻辑,让FreshChat先处理,再手动触发FCM的消息处理:

Objective-C 示例:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
    // 交给FreshChat处理通知点击
    [[Freshchat sharedInstance] handleRemoteNotificationResponse:response];
    
    // 手动调用FCM的消息处理,触发onMessageOpenedApp
    NSDictionary *userInfo = response.notification.request.content.userInfo;
    if (userInfo[@"gcm.message_id"]) {
        [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
    }
    
    completionHandler();
}

Swift 示例:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    // 处理FreshChat通知
    Freshchat.sharedInstance().handleRemoteNotificationResponse(response)
    
    // 手动触发FCM回调
    let userInfo = response.notification.request.content.userInfo
    if userInfo["gcm.message_id"] != nil {
        Messaging.messaging().appDidReceiveMessage(userInfo)
    }
    
    completionHandler()
}

2. 确保FCM的回调监听正确注册

以Flutter为例,在main函数中同时监听两种状态下的通知点击:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // 处理App完全杀死时的通知点击
  FirebaseMessaging.instance.getInitialMessage().then((message) {
    if (message != null) {
      _handleDeepLink(message.data['deep_link']);
    }
  });

  // 处理App后台时的通知点击
  FirebaseMessaging.onMessageOpenedApp.listen((message) {
    _handleDeepLink(message.data['deep_link']);
  });

  runApp(const MyApp());
}

void _handleDeepLink(String? link) {
  if (link != null) {
    // 这里写你的深度链接跳转逻辑
  }
}

3. 检查深度链接配置

确认iOS端的Universal Links或URL Schemes已正确配置,并且推送通知中传递的深度链接格式符合要求,避免因链接无效导致后续逻辑异常。

总结

这个问题的核心是FreshChat iOS SDK对通知点击事件的拦截优先级高于FCM,通过手动在通知响应方法中调用FCM的消息处理逻辑,就能让onMessageOpenedApp正常触发,同时不影响FreshChat的功能。

内容的提问来源于stack exchange,提问作者StoneyDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:52:36