WKWebView的使用

WKWebView的使用,第1张

WKWebView加载网页(简单使用) 方式一:请求在线网页
    NSString *urlStr = @"https://www.baidu.com";
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
需要自定义header缓存策略的情况,加上这些,不需要就不加
	//缓存策略 这个可以不要
    NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy;
    //加载方式修改
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:cachePolicy timeoutInterval:0];
    //如果需要做自定义header,可以采用NSMutableURLRequest,然后设置
    NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc]init];
    [mutableRequest addValue:@"" forHTTPHeaderField:@""];
方式二:请求沙盒页面 注意 file:/// 是三个斜杆
    NSURL *fileURL = [NSURL fileURLWithPath:@"路径"];
    NSURLRequest *filerequest = [NSURLRequest requestWithURL:fileURL cachePolicy:cachePolicy timeoutInterval:0];
    //发起请求 allowingReadAccessToURL权限申请
    [self.webView loadFileURL:filerequest.URL allowingReadAccessToURL:[filerequest.URL URLByDeletingLastPathComponent]];
方式三:加载源代码
    [self.webView loadHTMLString:@"htmlstr" baseURL:nil];

缓存策略介绍

    typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
    {
        NSURLRequestUseProtocolCachePolicy = 0,       //默认方法 1.304对比缓存,请求快且轻 2.强缓存 200 from memory cache/from disk cache

        NSURLRequestReloadIgnoringLocalCacheData = 1,            //忽略本地缓存,直接从后台取数据,本地加载推荐方法,把缓存空间用在真正需要的页面
        NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,   //忽略本地缓存,代理和其他中介的缓存,直接从后台取数据
        NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

        NSURLRequestReturnCacheDataElseLoad = 2,      //优先从本地拿数据,且忽略请求生命时长和过期时间,如果本地没有则请求源数据
        NSURLRequestReturnCacheDataDontLoad = 3,      //只从本地拿数据,离线模式

        NSURLRequestReloadRevalidatingCacheData = 5,  //从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载
    };
WKWebView的框架

WebKit框架中最核心的类应该属于WKWebView了,这个类专门用来渲染网页视图,其他类和协议都将基于它和服务于它。
WKWebView:网页的渲染与展示,通过WKWebViewConfiguration可以进行自定义配置。
WKWebViewConfiguration:这个类专门用来配置WKWebViewWKPreference:
这个类用来进行相关webView设置。 WKProcessPool:这个类用来配置进程池,与网页视图的资源共享有关。
WKUserContentController:这个类主要用来做nativeJavaScript的交互管理。
WKUserScript:用于进行JavaScript注入。
WKScriptMessageHandler:这个类专门用来处理JavaScript调用native的方法。
WKNavigationDelegate:网页跳转间的导航管理协议,这个协议可以监听网页的活动。
WKNavigationAction:网页某个活动的示例化对象。
WKUIDelegate:用于交互处理JavaScript中的一些d出框。
WKBackForwardList:堆栈管理的网页列表。 WKBackForwardListItem:每个网页节点对象。

	WKWebViewConfiguration* webViewConfig = [[WKWebViewConfiguration alloc] init];
    WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:webViewConfig];
WKWebView的属性UIDelegate
	wkWebView.UIDelegate = self;
wkWebView.UIDelegate的代理
/   *  web界面中有d出警告框时调用
     *
     *  @param webView           实现该代理的webview
     *  @param message           警告框中的内容
     *  @param completionHandler 警告框消失调用
     */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
/** 输入框 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;
/** 确认框 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
/** 创建一个新的webView,可以解决点击内部链接没有反应问题 */
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
WKWebView的属性navigationDelegate
    //wkWebView.navigationDelegate 监听WKWebView整个生命周期的代理方法
    wkWebView.navigationDelegate = self;
WKWebView.navigationDelegate的代理
//生命周期方法(WKNavigationDelegate)
//1.请求前决定是否要跳转,用户点击链接网页时,调用
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    //可以做一个截断
    //允许
    decisionHandler(WKNavigationActionPolicyAllow);
    //不允许
    decisionHandler(WKNavigationActionPolicyCancel);
}

//2.页面开始请求
//正式开始请求前的回调,无法拦截,可以在这里注入自己的js
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation

//3.收到响应后决定是否跳转
//收到数据可以加以判断,决定最终是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler

//4.加载完成
//回调该函数未必代表成功,访问页面出错,返回500,400等非200的statusCode,也会回调
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
 
//5.加载失败
//比如地址非法,DNS解析地址问题,本地网络问题,还没请求到服务器时的错误,返回都是这里
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
//请求过程中页面错误,服务器收到请求,开始返回数据给客户端的过程中出现传输错误
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error

//6.安全验证/证书验证
//对访问的网站做证书验证,决定是否拦截,实际过程涉及第三方合作,基本采用放过+URL白名单的方式做控制
//需要对证书做强校验,可以采用AFNetwork的认证方式做比对
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
WKWebViewConfiguration的属性 websiteDataStorewkWebView的存储空间,一般是处理cookie,缓存等浏览器相关的临时存储
    webViewConfig.websiteDataStore
allowsInlineMediaPlayback建议设置YES,允许内嵌视频播放器
    webViewConfig.allowsInlineMediaPlayback = YES;

processPool处理池,打开一个WebView可以指定从什么池子里打开,一般默认或者指定一个单例WKProcessPool就行,这样可以保存cookie

applicationNameForUserAgent,可以指定userAgent中的application的名字,如果要修改整个UA,需要采用全局设置

自动播放视频

    webViewConfig.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeAll;
preferences WKPreferences的配置
	//WKPreferences的属性 javaScriptEnabled 是否支持js,不支持html加载时直接忽略js的加载
    webViewConfig.preferences.javaScriptEnabled = NO;
    //KVC设置 allowFileAccessFromFileURLs 是否允许读取file路径
    [webViewConfig.preferences setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];
Cookie适配

占个茅坑

JS和OC交互
    // 创建配置
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    // 创建UserContentController(提供JavaScript向webView发送消息的方法)
    WKUserContentController* userContent = [[WKUserContentController alloc] init];
    // 添加消息处理,注意:self指代的对象需要遵守WKScriptMessageHandler协议,结束时需要移除
    [userContent addScriptMessageHandler:self name:@"NativeMethod"];
    // 将UserConttentController设置到配置文件
    config.userContentController = userContent;
    // 高端的自定义配置创建WKWebView
    WKWebView *webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds configuration:config];
    // 设置访问的URL
    NSURL *url = [NSURL URLWithString:@"https://developer.apple.com/reference/webkit"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];
    [self.view addSubview:webView];
    
	//记得移除
	[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"NativeMethod"];
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  // 判断是否是调用原生的
   if ([@"NativeMethod" isEqualToString:message.name]) {
     // 判断message的内容,然后做相应的 *** 作
      if ([@"close" isEqualToString:message.body]) {
		
      }
   }
}
参考资料

简书:OC: WKWebView详解
知乎:WKWebView使用攻略
腾讯云:WKWebView详解

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/996672.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存