Flutter聊天应用:后台/终止状态触发system_alert_window弹窗求助
解决方案:Flutter聊天APP实现后台/终止状态下的Truecaller式弹窗
一、用FCM触发弹窗(推荐方案)
AWS Socket在APP后台/终止时极易被系统回收,FCM是更可靠的后台触发方式,具体实现分Android和iOS场景:
Android端实现
- 使用FCM数据消息:推送仅包含
data字段的payload(不含notification字段),确保消息直接传递到APP后台处理器,不会被系统自动展示通知。 - 后台消息处理:配置
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, ); }
- 权限配置:在
AndroidManifest.xml中添加SYSTEM_ALERT_WINDOW、FOREGROUND_SERVICE权限,Android 12+还需添加POST_NOTIFICATIONS权限。
iOS端实现
iOS对后台操作限制严格,分两种场景处理:
- 普通聊天提醒:用FCM数据消息,在
AppDelegate的didReceiveRemoteNotification回调中通过MethodChannel调用Flutter弹窗逻辑,但iOS后台无法直接显示悬浮窗,只能触发本地通知。 - 高优先级弹窗(类似Truecaller来电):使用PushKit VoIP推送,该推送在APP终止/后台时仍能触发,且弹窗优先级高:
- 在Apple开发者后台开启VoIP服务并配置推送证书。
- 集成
pushkit插件,在didReceiveIncomingPushWithPayload回调中触发弹窗。 - 注意:VoIP推送仅允许用于真实通话场景,否则会被Apple审核拒绝,普通聊天场景不建议使用。
二、维持AWS Socket后台连接(仅适用于Android)
iOS后台长期维持Socket会违反Apple后台规则,易被审核拒绝,仅适合Android平台:
- 启动前台服务:使用
flutter_foreground_task插件启动前台服务,通过状态栏持久通知避免被系统杀死:
void startForegroundTask() { FlutterForegroundTask.startService( notificationTitle: '聊天服务运行中', notificationText: '保持消息实时接收', notificationIcon: const NotificationIcon( resType: ResourceType.mipmap, resPrefix: 'ic_launcher', ), ); }
- 在服务中维持Socket:将AWS Socket的初始化、连接逻辑放在前台服务回调中,确保APP后台时Socket持续在线,收到消息后直接调用
system_alert_window显示弹窗。 - 权限配置:在
AndroidManifest.xml中添加FOREGROUND_SERVICE权限,Android 12+需补充POST_NOTIFICATIONS权限。
关键注意事项
- Android 10+后台显示悬浮窗需要用户手动授权“显示悬浮窗”权限,需在APP首次启动时引导用户开启。
- iOS普通聊天场景建议用FCM通知+本地弹窗组合,避免因违规使用VoIP推送导致审核失败。
内容的提问来源于stack exchange,提问作者Samsudeen
相关产品推荐
相关产品推荐

