UIWebView废弃,迁移WKWebView
WWDC 2018中 ,在安全方面,Session上来就宣布了一件重量级的大事,UIWebView正式被官方宣布废弃,建议开发者迁移适配到WKWebView。
在XCode9中UIWebView还是 NS_CLASS_AVAILABLE_IOS(2_0),而我们从最新的Xcode10再看UIWebView就已经是这个样子了
UIKIT_EXTERN API_DEPRECATED("No longer supported; please adopt WKWebView.", ios(2.0, 12.0)) API_PROHIBITED(tvos, macos)
@interface UIWebView : UIView <NSCoding, UIScrollViewDelegate>
WKWebView从诞生之初相比UIWebView有太多的优势,无论是内存泄露还是网页性能,并且WKWebView可以同时支持macOS与iOS。由于WKWebView的独特设计,网页运行在独立的进程,如果网页遇到Crash,不会影响App的正常运行。
但是WKWebView不支持JSContext,不支持NSURLProtocol,Cookie管理蛋疼等问题确实给让不少开发者不想丢弃UIWebView,但最后通牒来了还是准备着手替换吧。
下面的一些方法均是看了许多大神的博客后总结到一起的,自己并未一一验证,后续发现错误会去纠正。
WKWebView的特点
- 性能高,稳定性好,占用的内存比较小,
- 支持JS交互
- 支持HTML5 新特性
- 可以添加进度条(然并卵,不好用,还是习惯第三方的)。
- 支持内建手势,
- 据说高达60fps的刷新频率(不卡)
初始化WKWebView
一、先导入头文件 #import <WebKit/WebKit.h>
二、WKWebView创建
1 |
|
- WKWebViewConfiguration 用于配置WKWebView的一些属性
- WKPreferences 用于配置WKWebView视图的一些属性
- 加上
<WKNavigationDelegate, WKUIDelegate>
两个代理
三、WKNavigationDelegate代理事件
1 |
|
四、WKUIDelegate代理事件,主要实现与js的交互
1 |
|
五、JS调用OC方法
- 在JS中调用方法为:
window.webkit.messageHandlers.方法名.postMessage(参数);
- 在OC中:
1 |
|
- 在WKScriptMessageHandler中:
1 |
|
在使用上述方法中发现,addScriptMessageHandler:self
中发生了循环引用,造成webview不会被释放掉,故经测试有以下两种解决方案:
1.新建个WeakScriptMessageDelegate类
1 |
|
1 |
|
设置addScriptMessageHandler方法更换为:
1 |
|
2.不在初始化时添加ScriptMessageHandler, 而是和Notificenter/KVC一个思路
1 |
|
六、OC调用JS方法
1 |
|
七、给webview添加请求头
1 |
|
1 |
|
注:在UIWeb里边是直接用的request 但是在这里需要写上navigationAction.出来的request
八、WKWebView加载不受信任的https
解决方法:在plist文件中设置Allow Arbitrary Loads in Web Content 置为 YES,并实现wkwebView下面的代理方法,就可解决
1 |
|
九、监听WKWebView的进度条和标题
1 |
|
1 |
|
1 |
|
十、解决cookie问题
以前UIWebView会自动去NSHTTPCookieStorage中读取cookie,但是WKWebView并不会去读取,因此导致cookie丢失以及一系列问题,解决方式就是在request中手动帮其添加上。
1 |
|
但是这只能解决第一次进入的cookie问题,如果页面内跳转(a标签等)还是取不到cookie,因此还要再加代码。
1 |
|
十一、加载页面后自动关闭的问题
问题描述,我加载一web页面后,进行各种操作,比说我充值,什么的,然后想要在充值提出成功后自顶关闭这个web页面回到上一层或者返回到某一个界面,就用下面的方法,一般判断URL 包含的字符串都是后台给定的,在这里只需要判断就好了!
1 |
|
十二、清除缓存
1 | //清除本地缓存 |
1 |
|
1 |
|
附:demo中使用的返回上一页和关闭浏览器的方法
1 |
|