WKWebView 入坑指南
程序员文章站
2022-05-12 12:02:16
...
WKWebView 入坑指南
因项目JS交互需要,同时因为支持的系统开始从iOS 8 之后,所以就打算使用WKWebView
替换掉项目中的UIWebView
。本篇文章会持续更新在使用过程总碰到的问题。
坑一:在使用测试环境时,因为有时后台返回url并不规范,url不包含
scheme
时如果调用[self.webView loadRequest:request]
,app就会直接闪退,直接提示exc bad access
,没有任何错误的堆栈显示。而在UIWebView
中如果未指定scheme
则是自动在url前添加file://
。在访问失败后调用webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
代理回调中返回error
。
如:访问url
如果为www.baidu.com
时,WKWebView
会直接闪退。而UIWebView
则调用访问失败的代理。url
如果为https://www.baidu.com
。两者则都正常。-
坑二:在控制器直接调用
[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"xxx"]
进行JS交互时,造成循环引用无法释放控制器(self).打破循环引用的方法有两种:中间代理:创建一个中间代理对象转发
@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler> @property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate; - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate; @end @implementation WeakScriptMessageDelegate - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate { self = [super init]; if (self) { _scriptDelegate = scriptDelegate; } return self; } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message]; } @end
使用时: WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"xxx"];
手动释放,在视图控制器
Appear
时添加,Disappear
时移除。- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; WKUserContentController *controller = self.webView.configuration.userContentController; [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"xxx"]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; WKUserContentController *controller = self.webView.configuration.userContentController; [controller removeScriptMessageHandlerForName:@"xxx"]; }
上一篇: 智算之道2020第一场比赛A题
下一篇: 移动web知识总结(超详细)附带思维导图