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
:这个类专门用来配置WKWebView
。WKPreference
:
这个类用来进行相关webView
设置。WKProcessPool
:这个类用来配置进程池,与网页视图的资源共享有关。
WKUserContentController
:这个类主要用来做native
与JavaScript
的交互管理。
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的属性
websiteDataStore
是wkWebView
的存储空间,一般是处理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详解
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)