WKWebView与H5交互坑

由于项目中使用的一直都是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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值