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

Flutter移动端用url_launcher打开网页遇SSL握手失败求助

解决Flutter中url_launcher打开链接时的SSL握手失败问题

问题详情

使用url_launcher: ^6.1.5库打开HTTPS链接,启用WebView模式(forceWebView为true)后页面空白无法加载,调试控制台抛出以下错误:

E/chromium(18929): [ERROR:ssl_client_socket_impl.cc(996)] handshake failed; returned -1, SSL error code 1, net_error -200

实现代码如下:

Widget _buildButtonLinks() {
return ElevatedButton(
  onPressed: () async {
    var url = 'https://www.google.com/';
    if (await canLaunchUrlString(url)) {
      await launchUrlString(url); //forceWebView is true now
    } else {
      throw 'Could not launch $url';
    }
  },
  child: Icon(
    Icons.link,
    color: Colors.black,
    size: MediaQuery.of(context).size.width * 0.09114,
  ),
  style: ElevatedButton.styleFrom(
      primary: Color.fromRGBO(213, 218, 227, 1.0),
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(12),
        // <-- Radius
      ),
      minimumSize: Size(MediaQuery.of(context).size.width * 0.8854,
          MediaQuery.of(context).size.height * 0.0629)),
);}

解决方法

  • 验证目标网站SSL证书:通过浏览器访问目标链接,确认证书未过期、域名匹配且由可信机构颁发,排除证书本身的问题。
  • 切换启动模式:若业务允许,放弃WebView模式,改用系统默认浏览器打开链接,规避WebView的SSL验证限制:
    await launchUrlString(
      url,
      mode: LaunchMode.externalApplication,
    );
    
  • 自定义WebView SSL错误处理(仅测试环境):若必须使用WebView,建议替换为flutter_inappwebview库,支持自定义SSL错误处理逻辑,示例代码:
    InAppWebView(
      initialUrlRequest: URLRequest(url: Uri.parse(url)),
      onReceivedSslError: (controller, request, error) async {
        // 测试环境下忽略SSL错误,生产环境禁止此操作
        controller.cancelSslError();
      },
    )
    
  • 检查设备时间:设备系统时间与实际时间偏差过大时,会导致SSL证书有效期验证失败,确保设备时间、时区设置正确。
  • 配置Android网络安全策略:针对Android 9+,在res/xml/network_security_config.xml中添加目标域名的信任配置:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config>
            <domain includeSubdomains="true">www.google.com</domain>
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </domain-config>
    </network-security-config>
    
    然后在AndroidManifest.xml的application标签中引用该配置:
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
    
  • 升级依赖与框架:将url_launcher升级到最新稳定版,同时更新Flutter SDK到最新版本,修复可能存在的兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:36:15