基于Flutter的端到端加密聊天应用如何实现类WhatsApp通知?
解决方案:Flutter端到端加密聊天应用的iOS推送通知适配
1. 解决双通知问题:拆分FCM/APNs Payload结构
iOS的APNs与Android的FCM处理逻辑存在差异,统一用GCM字段配置会导致系统自动弹出通知,加上你本地解密后触发的通知,就会出现双通知问题。需针对iOS单独配置APNs Payload,避免系统自动生成通知:
调整AWS SNS的推送Payload如下:
const payload = { GCM: JSON.stringify({ data: { encrypted_msg: message, // 明确标记为加密消息 msg_type: "chat" }, android: { priority: "high" } }), APNS: JSON.stringify({ aps: { contentAvailable: true, // 唤醒iOS后台进程 sound: "", // 静音,避免系统自动弹通知 mutableContent: true // 允许Notification Service Extension修改通知内容 }, data: { encrypted_msg: message, msg_type: "chat" } }), APNS_SANDBOX: JSON.stringify({ // 测试环境单独配置 aps: { contentAvailable: true, sound: "", mutableContent: true }, data: { encrypted_msg: message, msg_type: "chat" } }) }; const params = { Message: JSON.stringify(payload), TargetArn: ENDPOINT_ARN, MessageStructure: 'json', };
核心要点:
- iOS通过APNs字段单独配置,移除
alert(title/body)字段,避免系统自动弹出通知 - 开启
mutableContent,允许后续通过Extension解密并替换通知内容 - Android保持GCM的纯data消息,用
high priority确保后台能接收并处理
2. iOS端实现Notification Service Extension解密消息
由于端到端加密要求消息不能在服务器端解密,必须在iOS本地的Notification Service Extension中完成解密并生成通知,这样系统只会弹出一次解密后的通知:
- 在Xcode中为iOS项目添加
Notification Service ExtensionTarget - 在Extension的
didReceiveNotificationRequest方法中,从Payload的data字段取出加密消息,用你的E2EE密钥解密 - 构造
UNMutableNotificationContent对象,设置解密后的title和body,最后调用contentHandler返回处理后的内容
无论应用处于后台还是终止状态,iOS都会唤醒Extension完成解密和通知展示,彻底解决双通知问题。
3. Flutter端的本地通知协同处理
结合firebase_messaging和flutter_local_notifications做针对性处理:
- 应用前台:监听
onMessage事件,从data字段取出加密消息解密,再调用本地通知展示 - 应用后台:iOS端由Extension处理通知展示,Android端通过后台消息处理器解密后触发本地通知(高优先级data消息可唤醒Android后台进程)
4. 关于WhatsApp/Telegram的实现逻辑
它们核心仍依赖推送通知,但针对iOS做了深度适配:
- 用APNs的
contentAvailable唤醒后台,通过Notification Service Extension完成解密和通知生成 - 配合iOS的
Background App Refresh权限维持弱长连接(但iOS系统会限制长连接时长,推送仍是主要触发方式) - 高优先级消息(如语音通话)使用APNs的
critical alert权限,确保即使设备静音也能弹出通知
5. 额外注意事项
- 确保iOS项目开启
Background Modes中的Remote notifications权限 - 区分APNs生产/沙箱环境,AWS SNS的TargetArn需对应正确环境的设备端点
- Android端需正确注册
firebase_messaging的后台消息处理器,确保高优先级消息能被唤醒处理
内容的提问来源于stack exchange,提问作者Rohit Kokate
相关产品推荐
相关产品推荐

