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

基于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中完成解密并生成通知,这样系统只会弹出一次解密后的通知:

  1. 在Xcode中为iOS项目添加Notification Service Extension Target
  2. 在Extension的didReceiveNotificationRequest方法中,从Payload的data字段取出加密消息,用你的E2EE密钥解密
  3. 构造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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:35:16