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

Flutter聊天应用:后台/终止状态触发system_alert_window弹窗求助

解决方案:Flutter聊天APP实现后台/终止状态下的Truecaller式弹窗

一、用FCM触发弹窗(推荐方案)

AWS Socket在APP后台/终止时极易被系统回收,FCM是更可靠的后台触发方式,具体实现分Android和iOS场景:

Android端实现

  1. 使用FCM数据消息:推送仅包含data字段的payload(不含notification字段),确保消息直接传递到APP后台处理器,不会被系统自动展示通知。
  2. 后台消息处理:配置firebase_messaging的onBackgroundMessage回调,在回调内调用system_alert_window显示弹窗:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  
  // 检查悬浮窗权限
  bool hasPermission = await SystemAlertWindow.checkPermissions();
  if (!hasPermission) {
    SystemAlertWindow.requestPermissions();
    return;
  }

  // 构建弹窗参数
  final headText = SystemWindowText(text: message.data['title'], fontSize: 16, textColor: Colors.white);
  final bodyText = SystemWindowText(text: message.data['content'], fontSize: 14, textColor: Colors.grey[300]);
  final windowHeader = SystemWindowHeader(
    title: headText,
    subTitle: bodyText,
    padding: SystemWindowPadding(left: 16, right: 16, top: 12, bottom: 12),
    backgroundColor: Colors.black87,
  );

  // 显示弹窗
  await SystemAlertWindow.showSystemWindow(
    height: 100,
    width: MediaQueryData.fromWindow(WidgetsBinding.instance.window).size.width - 32,
    header: windowHeader,
    gravity: SystemWindowGravity.TOP,
  );
}
  1. 权限配置:在AndroidManifest.xml中添加SYSTEM_ALERT_WINDOW、FOREGROUND_SERVICE权限,Android 12+还需添加POST_NOTIFICATIONS权限。

iOS端实现

iOS对后台操作限制严格,分两种场景处理:

  • 普通聊天提醒:用FCM数据消息,在AppDelegate的didReceiveRemoteNotification回调中通过MethodChannel调用Flutter弹窗逻辑,但iOS后台无法直接显示悬浮窗,只能触发本地通知。
  • 高优先级弹窗(类似Truecaller来电):使用PushKit VoIP推送,该推送在APP终止/后台时仍能触发,且弹窗优先级高:
    1. 在Apple开发者后台开启VoIP服务并配置推送证书。
    2. 集成pushkit插件,在didReceiveIncomingPushWithPayload回调中触发弹窗。
    3. 注意:VoIP推送仅允许用于真实通话场景,否则会被Apple审核拒绝,普通聊天场景不建议使用。

二、维持AWS Socket后台连接(仅适用于Android)

iOS后台长期维持Socket会违反Apple后台规则,易被审核拒绝,仅适合Android平台:

  1. 启动前台服务:使用flutter_foreground_task插件启动前台服务,通过状态栏持久通知避免被系统杀死:
void startForegroundTask() {
  FlutterForegroundTask.startService(
    notificationTitle: '聊天服务运行中',
    notificationText: '保持消息实时接收',
    notificationIcon: const NotificationIcon(
      resType: ResourceType.mipmap,
      resPrefix: 'ic_launcher',
    ),
  );
}
  1. 在服务中维持Socket:将AWS Socket的初始化、连接逻辑放在前台服务回调中,确保APP后台时Socket持续在线,收到消息后直接调用system_alert_window显示弹窗。
  2. 权限配置:在AndroidManifest.xml中添加FOREGROUND_SERVICE权限,Android 12+需补充POST_NOTIFICATIONS权限。

关键注意事项

  • Android 10+后台显示悬浮窗需要用户手动授权“显示悬浮窗”权限,需在APP首次启动时引导用户开启。
  • iOS普通聊天场景建议用FCM通知+本地弹窗组合,避免因违规使用VoIP推送导致审核失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:00:54