在ios10中,公司的一些页面一直抽风式的加载不出来,直接报错证书验证失败,和后台调了一天,也没找到是什么原因,于是在wkwebview上试了下,擦了个擦,竟然没有任何问题,带着无奈以及无奈,只好做了一个兼容7.0的uiwebview和8.0以后的wkwebview的浏览器,其中痛苦过程就不再说了,新的wkwebview还要兼容旧的协议,幸好uiwebview的app web交互协议都是自己实现的,只需要做好wkwebview的协议的兼容性就好。以为就会顺利的,高高兴兴的,愉快的用wkwebview了,然后就上线了,然后就出现了一些崩溃,幸亏只是偶先,一个版本一个版本的修复。
1 打开新的页面 _target = blank 在打开新的页面的时候,需要自己处理怎么处理,如果不对blank便签处理,程序会崩溃
处理方式:
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
2 长按图片存储图片 在wkwebview中,长按图片可以弹出一个是存储还是复制的框,如果不对相应的JS代码做处理,会引起崩溃,可以直接禁用长按功能
//禁止长按弹出选择框
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{
[self.swipeWebView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:^(id object, NSError * error) {
}];
}
3 wkwebview无法主动打开appstore 解决方法如下
- (void)swipewebView:(WKWebView *_Nullable)webView decidePolicyForNavigationAction:(WKNavigationAction *_Nullable)navigationAction decisionHandler:(void (^_Nullable)(WKNavigationActionPolicy))decisionHandler
{
self.homeH5RightShareView.hidden = YES;
if ([navigationAction.request.URL.scheme isEqualToString:@"file"]||[navigationAction.request.URL.scheme isEqualToString:@"tel"]||[navigationAction.request.URL.scheme isEqualToString:@"about"]) {
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
self.origionalAddressStr = navigationAction.request.URL.absoluteString;
lastRuestUrlString = navigationAction.request.URL.absoluteString;
WKNavigationActionPolicy policy =WKNavigationActionPolicyAllow;
if([[navigationAction.request.URL host] isEqualToString:@"itunes.apple.com"] &&
[[UIApplication sharedApplication] openURL:navigationAction.request.URL])
{
policy =WKNavigationActionPolicyCancel;
}
decisionHandler(policy);
}
4 alert弹出 在webview里面,alert() 弹出框不需要进行任何处理,在wkwebview里面 需要在app实现 不然会崩溃
//alert view 弹出
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
{
UIAlertView * alter = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[alter show];
completionHandler();
}