Flutter Android端使用inappwebview自定义标签时主Activity断网问题
Flutter主Activity在inappwebview自定义标签浮层打开时丢失网络连接的问题解决
问题描述
当第二个Activity打开基于flutter_inappwebview包的自定义标签浮层时,主Activity出现网络连接丢失,Firestore抛出以下错误:
W/Firestore( 8958): (25.1.0) [WatchStream]: (a5b7c53) Stream closed with status:Status{code=UNAVAILABLE, description=Unable to resolve host firestore.googleapis.com}
仅在浮层打开时出现该问题,关闭浮层后网络立即恢复。相关环境信息:
- Flutter版本:3.24.3
- Android SDK版本:35.0.0
- 测试设备:Galaxy A35 5G、Android-arm64模拟器
- 使用依赖包:flutter_inappwebview 6.1.4
已确认其他场景网络正常,AndroidManifest已添加INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
原因分析
- Android 14+进程网络优先级限制:API 34及以上版本对应用进程的网络访问管控更严格,自定义标签浮层(WebView进程)启动时,系统可能降低主Activity进程的网络优先级,导致主进程DNS解析或网络请求被阻塞。
- 自定义标签进程隔离冲突:默认情况下,Custom Tabs可能使用独立进程运行,与主进程抢占网络连接池资源,打断Firestore的长连接。
- Firestore长连接资源抢占:Firestore的WatchStream是长连接,WebView启动时会占用大量网络资源,导致长连接被强制断开,且无法在浮层运行期间重新建立。
解决方案
方案1:强制自定义标签与主进程同运行
修改flutter_inappwebview的Custom Tabs配置,避免进程隔离导致的资源竞争:
CustomTabsOptions customTabsOptions = CustomTabsOptions( intentExtraOptions: { "android.support.customtabs.extra.KEEP_ALIVE": true, "android.intent.extra.PROCESS_NAME": "你的应用包名", }, ); // 打开自定义标签时传入配置 InAppBrowser.openWithSystemBrowser( url: Uri.parse("目标URL"), options: InAppBrowserClassOptions( customTabs: customTabsOptions, ), );
方案2:补充网络相关配置
在AndroidManifest.xml中添加权限和网络安全配置,确保主进程网络访问不受限:
<!-- 补充网络状态权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <application ... android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/network_security_config"> ... </application>
在res/xml/network_security_config.xml中配置信任Firestore域名:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">firestore.googleapis.com</domain> </domain-config> </network-security-config>
方案3:优化Firestore重连机制
配置Firestore自动重试策略,并监听网络状态手动触发重连:
// 初始化Firestore时设置重试参数 FirebaseFirestore.instance.settings = Settings( persistenceEnabled: true, retryDelay: const Duration(seconds: 2), maxAttempts: 5, ); // 监听网络变化,恢复时重置Firestore连接 Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { if (result != ConnectivityResult.none) { FirebaseFirestore.instance.clearPersistence(); FirebaseFirestore.instance.settings = Settings(persistenceEnabled: true); } });
方案4:升级flutter_inappwebview版本
当前使用的6.1.4版本可能存在Android 14+适配缺陷,尝试升级到最新稳定版,官方大概率已修复进程间网络冲突问题。
内容的提问来源于stack exchange,提问作者Malou
相关产品推荐
相关产品推荐

