美文网首页
WKWebview的学习 - WKNavigationDeleg

WKWebview的学习 - WKNavigationDeleg

作者: Sweet丶 | 来源:发表于2017-10-18 13:58 被阅读93次

/ 关于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];
}
#endif

4. 使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 那些坑

相关文章

网友评论

      本文标题:WKWebview的学习 - WKNavigationDeleg

      本文链接:https://www.haomeiwen.com/subject/sobsuxtx.html