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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:00