Flutter iOS Notification Service Extension未调用 推送图片不显示
问题详情
- 基础推送展示异常:接收远程推送通知时,需通过payload中的imageurl字段加载展示图片,调整payload结构后Android端功能运行正常,但iOS端推送无法正常展示图片。
- 通知扩展触发异常:已接入Notification Service Extension并编写通知内容修改代码,该套配置在原生iOS应用中可正常运行;但在Flutter iOS项目中接入相同配置后功能失效,接收推送时扩展未被调用,仅能收到普通通知,尝试多种排查方案后问题仍未解决。
已完成配置步骤
- 添加通知权限申请相关代码
- 为项目添加Notification Extension
- 采用自动签名管理完成配置文件设置
- 编写通知内容修改的业务代码
- 在推送payload中添加imageURL、mutable-content字段
问题排查与修复方案
按以下优先级逐一校验,可覆盖绝大多数Flutter iOS通知扩展失效场景:
- 校验payload格式合规性
iOS系统对推送字段的位置、类型、命名敏感度远高于Android,必须满足:mutable-content字段必须放在aps节点内部,值必须是数字1,不能传布尔值true,也不能写错成驼峰命名mutableContent- 自定义图片字段要和代码里的取值key完全匹配,已配置的
imageURL和问题描述中的imageurl大小写不一致,会直接导致拿不到图片地址
正确的payload结构参考:
{ "aps": { "alert": {"title": "推送标题", "body": "推送内容"}, "mutable-content": 1, "sound": "default" }, "imageurl": "可直接访问的HTTPS图片直链" } - 校验Extension部署版本配置
新建Notification Service Extension时Xcode默认会给Extension设置最新系统的部署版本,如果测试设备系统版本低于这个值,系统会直接跳过扩展执行,永远不会触发扩展代码。需要把Extension的Deployment Target改成和主项目一致,且低于测试设备的系统版本。 - 校验签名与Bundle ID配置
自动签名很容易出现Extension配置错位的问题:- Extension的Bundle ID必须是主项目Bundle ID加后缀的格式,比如主项目ID是
com.demo.app,Extension ID要设为com.demo.app.notificationservice,不能单独设置无关联的ID - 主项目和Extension必须选择同一个开发团队,确认Xcode签名栏没有红色报错
- Extension的Bundle ID必须是主项目Bundle ID加后缀的格式,比如主项目ID是
- 校验Extension运行内存限制
iOS系统给Notification Service Extension分配的运行内存上限仅24MB,如果下载图片后直接加载未压缩的高清原图,会直接触发系统杀死扩展进程,最终回退展示普通文本通知。需要在扩展代码里把下载完的图片压缩到宽度500px左右的尺寸,再写入沙盒赋值给通知附件。 - 校验测试环境与运行状态
- 通知扩展必须用真机测试,模拟器不支持扩展触发逻辑
- 测试时不要把应用停留在前台,前台状态下推送默认走应用内接收逻辑,不会触发系统通知弹窗和扩展执行,需要把应用切到后台或者彻底杀死进程后再发推送测试。
- 校验Flutter项目Pod配置
打开项目ios/Podfile,确认没有把Extension的依赖错误链接到Runner主Target,避免出现符号冲突导致扩展加载失败。
参考附件
内容的提问来源于stack exchange,提问作者Vijay Subramani
相关产品推荐
相关产品推荐



