Flutter项目webview加载没有HTTPS证书的网页在Android和iOS设备上无法显示的解决方案

news/2024/7/12 3:26:40 标签: flutter, https, ios

一、问题描述

Flutter项目使用谷歌官方webview库 webview_flutter,加载自签名证书、证书失效、无证书等HTTPS网页地址时,在Android或pc浏览器中提示证书失效,在iOS设备上为空白页,为了加载自签名证书的网页,需要饶过iOS上的webview控件HTTPS证书校验。

二、环境

Android Studio版本:2022.1.1 Patch 2

Flutter版本:3.7.12

Dart SDK版本:2.19.6 

依赖库 webview_flutter 版本:4.2.0

Xcode版本:14.3

三、Flutter中解决iOS设备上HTTPS证书校验方案

1、添加webview_flutter版本库依赖

在pubspec.yaml文件中,找到dev_dependencies,然后换行添加依赖库,添加完运行命令【flutter pub get】,下载该库。

dev_dependencies:

  webview_flutter: ^4.2.0

下载完成后在项目结构External Libraries下,可以看到webview_flutter一共下载了三个项目,分别是webview_flutter-4.2.0、webview_flutter_android-3.7.0、webview_flutter_wkwebview-3.4.3,其中webview_flutter_wkwebview-3.4.3为iOS设备上的一个webview组件,后面所要修改源码的也就是这个工程。

https://img-blog.csdnimg.cn/e0e1d0a0cea2402291afa86d277d95c6.png" width="451" />

2、修改源码

在Flutter工程目录结构中找到 External Libraries,依次展开Flutter Plugins——>webview_flutter_wkwebview-3.4.3——>ios.Classes

https://img-blog.csdnimg.cn/b94537013fe8462094a5678e828f6a98.png" width="399" />

然后在ios.Classes目录下,找到FWFNavigationDelegateHostApi.m文件,打开该文件,在 @implementation FWFNavigationDelegate 代码以后换行添加以下方法:

@implementation FWFNavigationDelegate

//复制添加这个方法
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
    
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
        // 在这里进行自定义的身份验证逻辑
        NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
    } else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
    }

    
}

然后保存,再次运行即可。

注:因为该修改方式只是将本地的webview_flutter库源码做修改,要想应用到其他人的项目当中,需要把该 webview_flutter_wkwebview-3.4.3库导出上传到GitHub或者Gitee仓库,然后通过在pubspec.yaml文件中添加依赖库覆盖原webview_flutter库源码的方式,才能正确应用到其他人的项目中。导出方式:点击该库然后鼠标右键,找到 Open in——>Finder,打开即是。

3、覆盖原库

具体流程如下:

在pubspec.yaml文件中,找到 dependency_overrides:节点,然后在其下方换行添加以下内容:

dependency_overrides:
  #注意这里不要顶格,格式务必确认正确,url地址为你自己修改过的源码库地址,
  webview_flutter_wkwebview:
    git:
      url: https://gitee.com/user/webview_flutter_wkwebview-3.4.3.git

然后在项目根目录下,运行【flutter pub get】命令,会提示输入你源码所在仓库的用户名和密码,下载完成后就能看到源码库名称已经变为你自己的仓库名称了。

四、Xcode原生工程解决iOS设备上HTTPS证书校验方案

1、导入WKWebview库

在Xcode项目中,找到General界面,在其下方界面找到【Frameworks,Libraries,and Embedded Content】,点击右侧的加号➕按钮,在弹出的搜索界面,搜索WebKit,然后选中搜索出来的WebKit.framework库,点击下面的Add按钮,WKWebview依赖库添加完成。

https://img-blog.csdnimg.cn/503c6118582442a7a0c3851d3ccd9072.png" width="400" />

 2、添加代码

#import "ViewController.h"
#import <WebKit/WebKit.h>

//1、这里添加WKNavigationDelegate接口,为了实现WKWebView的证书校验方法
@interface ViewController () <WKNavigationDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //添加webview组件
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    CGRect frame = CGRectMake(0, 170, 400, 800);
    WKWebView *webView = [[WKWebView alloc] initWithFrame:frame configuration:configuration];
    [self.view addSubview:webView];


    NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //开始加载网页地址
    [webView loadRequest:request];
    
    //2、将当前类与WKNavigationDelegate接口监听进行绑定
    webView.navigationDelegate = self;
   
}

//3、重写didReceiveAuthenticationChallenge方法
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
    //在该方法当中添加如下代码,
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
        NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
    } else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
    }

}

@end

代码一共分为三步,添加完即可实现饶过HTTPS网页证书校验问题。

五、Android设备上HTTPS证书校验解决方案

1、创建network_security_config.xml文件

在Android Studio中打开Flutter项目下的Android工程,然后在app的目录下,也就是项目的主module模块下,依次打开app——>src——>main——>res目录,在该目录下创建文件xml,然后在xml目录下,创建network_security_config.xml文件,文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

2、引用network_security_config.xml文件

在AndroidManifest.xml文件中,找到application节点,添加android:networkSecurityConfig属性

<application
        android:networkSecurityConfig="@xml/network_security_config"
>

以上为在Android设备饶过HTTPS证书校验方案。


http://www.niftyadmin.cn/n/344247.html

相关文章

windows10安装Qt

一、下载安装包 1、安装包下载路径调整 由于Qt公司的调整&#xff0c;从5.15版本开始原本下载的路径不再提供安装包 Index of /archive/qt 新安装包放在了official_releases里面了 Index of /official_releases/online_installers 2、安装方式调整 从5.9.0开始安装方式开始…

面试只会问八股?你应该好好思考怎样做一场面试

大家好啊&#xff0c;我是技术大捞&#xff0c;今天要给大家聊的话题是&#xff1a;面试。 国内各大平台有关面试教学的内容&#xff0c;我看到了解到的都是以 八股文 和 应付&#xff08;糊弄&#xff09; HR为主&#xff0c;附带公众号吸粉和卖课。 这期呢我不打算讲这些&a…

织梦网做城市分站织梦分站群二级目录织梦城市分站教程

一、安装网站 1、上传到服务器上输入www.xxxx.com/install进行安装(具体安装方法找百度一大堆); 可以参考http://www.hlzcb.com/zhimengxueyuan/zhimenganzhuangshiyong/25830.html 2.安装好后台点击后台系统→数据库备份还原→数据还原,点击下面的开始还原数据; 二、设…

xhs-xs webmsxywx分析

近期又更新了&#xff0c;先是改了x-s生成&#xff0c;然后又加上了a1校验。 后面可能会全参校验&#xff0c;比如再加上gid、deviceId、profileData、x-s-common、smidV2之类。 估计以后不能写xhs了&#xff0c;大家且看且珍惜吧。之前相关的文章都被下架了 危&#xff01;…

SQL教程(四)简单实例学习:时间函数(一)基础入门级

目录 一、&#x1f30e;SQL 简介 1.1 &#x1f4dc;SQL 是什么&#xff1f; 1.2 &#x1f4dc;SQL 能做什么&#xff1f; 1.3 &#x1f4dc;SQL 是一种标准 - 但是... 1.4 &#x1f4dc;在您的网站中使用 SQL 1.4 &#x1f4dc;RDBMS 1.5 &#x1f4dc;请记住... 1.6 &…

Ubuntu22 k8s 1.27.1 安装及集群搭建教学(2023.5.16 k8s 最新版本教学,只看这一篇就够了哦!保姆级教程!不行你来找我!)

Ubuntu22 k8s 1.27.1 安装及集群搭建教学&#xff08;2023.5.16 k8s 最新版&#xff0c;只看这一篇就够了哦&#xff01;保姆级教程&#xff01;&#xff01;不行你来找我&#xff01;&#xff09; 温馨提示请仔细阅读&#xff1a;❤️❤️❤️❤️❤️❤️❤️❤️ 1. 由于新版…

通过cloudflare创建openai api的代理

一、前言 首先你要有一个域名&#xff0c;其次这个域名要托管到cloudfare&#xff0c;所以&#xff1a; 直接在cloudfare购买域名&#xff0c;方便省事!找其他免费域名&#xff0c;再托管到cloudfare&#xff0c;本着一分钱不花的目的&#xff0c;这里提供一个顶级免费公益域…

我读故我在:《文凭社会》读后感

现在正是一年一度的答辩季&#xff0c;朋友圈有各种毕业季的苦尽甘来&#xff0c;也有更多的彷徨无助。就业&#xff0c;似乎越来越卷。 新来的实习生。本硕985&#xff0c;还有海外留学经历。这一届00后真的越来越强大了&#xff0c;让人汗颜。 虽然&#xff0c;每天干的活也不…