iOS开发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;
}
}

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

 

人已赞赏
iOS文章

ios开发自动计算UITableViewCell的高度

2020-5-5 21:03:10

iOS文章

iOS xib关联不到文件里

2020-5-5 22:18:08

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索