由于项目中使用的一直都是
UIWebView
遇到了性能问题,一遇到新闻详情页面内容超级多的时候就会加载慢,滑动卡顿的情况。无奈只能使用WKWebView
。
需要使用到的是WKScriptMessageHandler
:
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
[configuration.userContentController addScriptMessageHandler:yonglian name:@"scoreList"];
[configuration.userContentController addScriptMessageHandler:yonglian name:@"onImageClicked"];
[configuration.userContentController addScriptMessageHandler:yonglian name:@"userLogin"];
[configuration.userContentController addScriptMessageHandler:yonglian name:@"chatList"];
[configuration.userContentController addScriptMessageHandler:yonglian name:@"chatUser"];
self.urlWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, self.headerView.bottom, self.view.width, self.view.height - self.headerView.bottom) configuration:configuration];
之后在代理方法中实现需要的功能:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"message name %@,message body is %@",message.name,message.body);
if ([message.name isEqualToString:@"onImageClicked"]) {
NSLog(@"message body is %@",message.body);
NSDictionary *messageBody = (NSDictionary*)message.body;
NSString *srcs = messageBody[@"value"];
[self onImage:messageBody[@"index"] clicked:srcs];
}else if ([message.name isEqualToString:@"userLogin"]){
[self user_login];
}else if ([message.name isEqualToString:@"chatList"]){
[self chat_list];
}else if ([message.name isEqualToString:@"chatUser"]){
[self chat_user:message.body];
}else if ([message.name isEqualToString:@"scoreList"]){
[self chat_list];
}
}
当然,在dealloc
中需要去掉messageHandler
:
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self.urlWebView.configuration.userContentController removeScriptMessageHandlerForName:@"onImageClicked"];
[self.urlWebView.configuration.userContentController removeScriptMessageHandlerForName:@"userLogin"];
[self.urlWebView.configuration.userContentController removeScriptMessageHandlerForName:@"chatList"];
[self.urlWebView.configuration.userContentController removeScriptMessageHandlerForName:@"chatUser"];
[self.urlWebView.configuration.userContentController removeScriptMessageHandlerForName:@"scoreList"];
[self.urlWebView reload];
}
需要注意的是,网页代码中如果有_blank
,跳转不会成功,需要实现WKWebView
的代理方法重新加载页面:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
if (!navigationAction.targetFrame.isMainFrame) {
[webView loadRequest:navigationAction.request];
}
return nil;
}