close
当前位置: 物联网在线 > 技术文库 > ios >

使用WKWebView遇见的那些坑

iOS8之后出了WKWebView,据说加载速度和内存占用情况都甩UIWebView好几条街,鉴于我们公司的项目用到挺多的webView,于是简单的调研下决定用WKWebView替换UIWebView。WKWebView的使用方法不多少,相信网上所有的都比我讲得好,简单说下我在使用过程中遇到的坑,以及“复杂”的心路历程,相信不少人应该也遇到过这种情况

1.三个相关代理WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler。

我学习新东西的习惯是直接看头文件和露出来的接口,简单看下注释,然后直接用,为此多走了不少弯路

WKNavigationDelegate,只提一个方法,

//相当于UIWebView的shouldStartLoadWithRequest,其中decisionHandler一定要实现,否则不执行 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

WKUIDelegate

支持alert弹出框,confirm选择框,TextInput输入框,如果不实现此代理中相应的方法,直接点击是没有特别反应的,要特别注意。

//alert弹出 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler; //confirm选择框 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler; //text Input输入框 - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;

WKScriptMessageHandler

这是JS调用native的代理。native调用JS与UIWebView大同小异,在此不多说。

UIWebView中,JS调用native的方法还是比较好理解的,采用JSContext的形式

JSContext *jsContext = (JSContext *)[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; jsContext[@"jsCallApp"] = self.jsCallApp;

注意WKScriptMessageHandler是WKUserContentController要遵循的协议,附上初始化方法

NSString * name = @"jsCallApp"; WKUserContentController *userContentController = [[WKUserContentController alloc] init]; //遵循协议 [userContentController addScriptMessageHandler:self name:name]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; _webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration]; _webView.UIDelegate = self; _webView.navigationDelegate = self; //加载的本地html文件,便于修改 NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]; NSURL *url = [NSURL fileURLWithPath:path]; [_webView loadFileURL:url allowingReadAccessToURL:url]; [self.view addSubview:_webView];

实现协议方法:注意此方法是request的

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { NSString *methods = [NSString stringWithFormat:@"%@:", message.body]; SEL selector = NSSelectorFromString(methods); if ([self respondsToSelector:selector]) { } else { NSLog(@"未实行方法:%@", methods); } }

JS端必须配合来写,前端必须用

window.webkit.messageHandlers.jsCallApp.postMessage(null);

来唤起app的方法,其中jsCallApp是对应的name,postMessage中传参数。

对于更新过很多版本的app来说,考虑实际情况,如果有这种复杂的js与app之间互相调用的话,前端必须考虑判断版本号,判断安卓还是iOS,或者安卓跟着做相应的修改,总之还是挺复杂的,如果速度还过得去,也不崩溃的话建议别修改了,如果你的前端和安卓好说话,修改也行。如果不涉及交互,那还是非常建议替换的

还有一个问题就是,对于html动画特别多的页面,WKWebView有时候比UIWebView还卡顿,至今未解决,也不知道是什么原因,欢迎知道的大神留言指导。


(责任编辑:ioter)

用户喜欢...

iOS监控:资源使用

应用性能的衡量标准有很多,从用户的角度来看,卡顿是最明显的表现,但这不意味看起来不卡顿的应用就不存在性能问题。从开发角度来看,衡量一段代码或者说算法的标准包括空间复杂度...


iOS高可控性日历基础组件-SKCalendarView的使用和实现思路的分享

SKCalendarView是一个高可控性的日历基础组件,为了提高应用的自由度,默认只提供了日历部分的视图封装,但不涵盖切换月份按钮、年月分显示等非关键性控件,但请不要担心,SKCalendarView为...


快速入门指南:使用 UIViewPropertyAnimator 做动画

iOS 10 带来了一堆非常有意思的新特性,例如 UIViewPropertyAnimator 。这是一个能够改善动画处理方式的新类。 它彻底改变了我们所习惯的工作流,为动画逻辑添加了一个更为精细的控制手段。...


iOS开源-轻量级 JSON 转 Model 框架,使用链式编程,无侵入

SuperKVC is a light-weight injection framework to convert JSON to Model. SuperKVC has its own config DSL which provides a chainable way of describing your injection config concise and readable. SuperKVC supports iOS and macOS. Samples are at the Su...


iOS 使用输入框的inputAccessoryView属性实现键盘上添加视图

在开发应用程序时会经常用到输入消息并发送消息的功能,比如今日头条或者UC头条这些软件底部都会有,如何想向这些应用一样点击UITextField或者UITextView就可以弹出键盘并在键盘上也能加上...


iOS开源:Tkeyboard - 通过蓝牙,使用 Mac 的键盘输入内容到 iPhone 设备中

在咖啡馆耗费了数个周末之后,终于将这个灵光一闪的点子变成了一个实实在在可以运行的 app。同时意味着年初制定的第一个小目标达成,完成了 2017年的第一个独立 app。 在app上架的同时,...


使用NSURLSession或者AFN发送HTTPS请求

HTTPS是基于HTTP的, 它与HTTP不同之处在于HTTP层和TCP层中间多了一个 安全套接字层 HTTPS模型 HTTPS和HTTP的主要区别 HTTPS协议需要到CA(证书发布机构)申请证书 HTTP是明文传输, HTTPS则是具有SSL加密传...


如何优雅地使用 KVO

KVO 作为 iOS 中一种强大并且有效的机制,为 iOS 开发者们提供了很多的便利;我们可以使用 KVO 来检测对象属性的变化、快速做出响应,这能够为我们在开发强交互、响应式应用以及实现视图...


iOS AVPlayer 的使用实践

前两天在网上看到一篇博客,介绍AVPlayer的使用,但是只简单介绍了一下单个的本地文件如何播放,心血来潮,就想着做一个类似于播放器的东西,能够实现播放网络歌曲,循环播放多首音乐...


今天开始学逆向:反汇编的利器 IDA 和 Hopper 的基本使用

近期实战了一次 IDA + Hopper 逆向破解。讲真,第一次体验了一回把别人“衣服”扒光了的快感~简直 High 翻~所以,特此,利用 AlipayWallet 总结分享一下 IDA 和 Hopper 的基本使用。希望对大家有...