/ 关于WKNavigationDelegate的理解网上有很多,全面学习WKNavigationDelegate之后,在此列举自己开发时使用WKWebview的不足之处
1.决定webview是否加载新的请求的代理方法,在这里可以增加网络判断的处理和拦截请求的操作(如果未实现这个方法,在加载非链接的url会导致崩溃)
- (void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;2. 在自建网络协议的情况下,服务器会请求认证,这个时候就会调用下面的方法
- (void)webView:(WKWebView*)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDispositiondisposition,NSURLCredential*_Nullablecredential))completionHandler;3. 在iOS 9以上系统,当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用的代理方法,在该函数里执行[webView reload](这个时候 webView.URL 取值尚不为 nil)解决白屏问题。在一些高内存消耗的页面可能会频繁刷新当前页面,H5侧也要做相应的适配操作。在使用这个方法时需条件编译
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
- (void)webViewWebContentProcessDidTerminate:(WKWebView*)webView
{
[webView reload];
}
#endif4. 使WKWebView支持打电话、跳转App Store功能的方法
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL*URL = navigationAction.request.URL;
UIApplication*app = [UIApplicationsharedApplication];
if([URL.schemeisEqualToString:@"tel"] && [appcanOpenURL:URL]) {// 1、使支持打电话
[appopenURL:URL];
// 一定要加上这句,否则会打开新页面
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
if([URL.absoluteStringcontainsString:@"itunes.apple.com"] && [appcanOpenURL:URL]) {// 2、跳转appstore
[appopenURL:URL];
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}推荐一个对WKWebview解读比较深的博客
WKWebView 那些坑
网友评论