Flutter WebView与URL Launcher iOS端外部链接跳转异常问题
Flutter WebView iOS端外部链接无法跳出应用问题修复方案
根因分析
- 当前使用的
startsWith域名匹配逻辑存在漏洞,当出现协议差异(http/https混用)、域名带www前缀和配置不一致、重定向跳转等场景时,匹配会失效,导致本该跳出的链接被判定为内部域名 - iOS端
url_launcher默认没有配置http/https的访问白名单,canLaunch方法会直接返回false,导致跳转逻辑不执行 launch方法默认在iOS端会使用内置SafariVC打开链接,不会跳出应用到系统Safari
修复步骤
1. 配置iOS端链接访问白名单
打开项目ios/Runner/Info.plist文件,新增如下配置:
<key>LSApplicationQueriesSchemes</key> <array> <string>http</string> <string>https</string> </array>
2. 替换域名匹配逻辑
修改WebView的navigationDelegate判断规则,改为直接对比根域名,避免前缀、协议差异导致的匹配失效:
navigationDelegate: (NavigationRequest request) { final appHost = Uri.parse(context.read(flavorConfigProvider).state.appURL).host.replaceAll('www.', ''); final requestHost = Uri.parse(request.url).host.replaceAll('www.', ''); if (requestHost == appHost) { return NavigationDecision.navigate; } _launchURL(request.url); return NavigationDecision.prevent; },
3. 调整launch方法参数,强制iOS端跳系统Safari
修改_launchURL方法,新增强制跳转外部的参数:
_launchURL(String url) async { if (await canLaunch(url)) { await launch( url, forceSafariVC: false, // iOS端禁用内置Safari控制器,强制跳系统Safari forceWebView: false, // 禁止在应用内WebView打开 ); } else { throw 'Could not launch $url'; } }
验证
重新编译iOS安装包后测试,内部域名链接保持在应用内WebView加载,外部链接直接跳转系统Safari打开,和Android端行为一致。
内容的提问来源于stack exchange,提问作者Tom Galland
相关产品推荐
相关产品推荐

