WKWebView与js交互

项目里使用的一直是UIWebView,但是每次打开界面的时候都会内存飙升,心塞!经过两天努力终于把UIWebView替换成了WKWebView,现在内存基本上不会有浮动了,哈哈哈哈哈哈哈!
代码如下:
OC端要改的东西:
1.首先要进行js注入,把web端需要的东西注入到js里,如果web不需要的话,就不用注入了,写在viewDidLoad里

NSString *js = [NSString stringWithFormat:@"var WKApp={initUrl:function(){return'%@'},initVersion:function(){return'%@'},initDeviceId:function(){return'%@'},initHeaderVersion:function(){return'%@'}};",@"http://www.bai.com",@"2.1.0",@"sljdfljsjddjfajsei",@"2.3.0"];
    WKUserScript *userScript = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:true];
    WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    [userContentController addUserScript:userScript];
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.preferences.minimumFontSize = 10;
    configuration.preferences.javaScriptEnabled = YES;
    // 默认是不能通过JS自动打开窗口的,必须通过用户交互才能打开
    configuration.preferences.javaScriptCanOpenWindowsAutomatically = NO;
    configuration.userContentController = userContentController;

2.点击web上的按钮,要调起原生界面,

//添加消息
 [self.config.userContentController addScriptMessageHandler:self name:@"openWebUrl"];//打开一个新界面的消息
//接受消息,在代理里面判断是哪个消息,并做响应处理
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    NSLog(@"web-----%@-----body:%@",message.body,message.body);
    if ([message.name isEqualToString:@"openWebUrl"]) {
        //打开一个新界面
    }
}
//当界面消失的时候,把添加的消息移除
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"openWebUrl"];
}

js端要做的处理
* js是创建了一个新的方法,名字是WKApp,就是oc端的js注入的那个字符串里面的方法,然后oc注入,js获取这些信息,就可以使用了。
* 播放音频没声音,要在配置里关闭。
configuration.mediaPlaybackRequiresUserAction = NO;

发生的错误
1.调试的时候出错,报JavaScript-400(具体忘了是400还是404了),出现这个原因是因为js注入的时候那个字符串不对,字符串是一个方法的整个代码,特别容易出错,一个大括号或者逗号没写都会出现错误,一定要慎重。
2.在多级界面的时候,返回到上一个界面有时候会发生一个错误:Error Domain=NSURLErrorDomain Code=-999 “(null)” ,发生这个错误主要是因为一个请求还没有加载完成,又发起了一个新的请求,修改如下:

    //网页加载失败
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
    NSLog(@"---网页加载失败---%@",error);
    if (error.code == NSURLErrorCancelled) {
        return;
    }    
}

说明
其他的,暂时还没有发现什么问题,会持续更新的~

猜你喜欢

转载自blog.csdn.net/icandyss/article/details/75283881