Flutter Firebase Messaging iOS端无法接收后端推送(Android正常)
Flutter FCM iOS端无法接收后端主题推送问题解决
核心问题
你后端发送的是纯data类型消息,iOS对这类消息的处理逻辑和Android存在差异:
- Android无论APP处于前台/后台/杀死状态,纯data消息都能触发对应回调或通知
- iOS仅在APP前台运行时,纯data消息会通过
FirebaseMessaging.onMessage回调;后台或APP被杀死时,APNs不会主动展示通知,也不会触发回调,除非消息包含notification字段,或者配置了后台唤醒参数。
解决方案
1. 调整后端Payload结构
给消息添加notification字段(iOS要求标题和内容必填),同时可配置iOS专属参数用于后台处理。修改后的后端代码:
const sendDataNotif = async (token: string, data: object, topic: string) => { try { const headers = { Authorization: 'Bearer ' + token, }; const payload = { message: { topic, data, // 新增notification字段,确保iOS后台能收到通知 notification: { title: "你的通知标题", body: "你的通知内容" }, // 可选:配置iOS后台唤醒,用于处理data消息 apns: { payload: { aps: { content_available: true } } } }, }; return await axios({ method: 'post', url: `https://fcm.googleapis.com/v1/projects/${key.project_id}/messages:send`, data: payload, headers, }); } catch (error: any) { console.log(error.message); } };
2. 确认主题订阅有效性
虽然订阅无报错,但可以在iOS端主动校验已订阅主题:
// 在登录后调用,检查是否真的订阅成功 Future<void> checkSubscribedTopics() async { List<String>? topics = await FirebaseMessaging.instance.getTopics(); print('已订阅主题列表: $topics'); }
3. 升级依赖版本
你使用的firebase_messaging 15.2.5和firebase_core 3.13.0是较旧版本,可能存在iOS适配漏洞,建议升级到最新稳定版,同时保持两个依赖版本兼容。
4. 后台消息处理补充(可选)
如果需要纯data消息在iOS后台触发业务逻辑,还需要:
- 确保Xcode中已开启
Background Modes里的Remote notifications - 消息Payload中添加
content_available: true - 在Flutter中实现顶级静态的
onBackgroundMessage回调函数
内容的提问来源于stack exchange,提问作者Dali Hmida
相关产品推荐
相关产品推荐

