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
相关产品推荐
相关产品推荐

