WKWebview里JS交互的问题

关于webview的与JS交互这里比较全,感谢作者的整理。
https://github.com/Haley-Wong/JS_OC

最近也在做JS这一块,用到的是WebViewJavascriptBridge框架,但是我们的需求是网页加载结束之后马上就从app这边获取数据传给h5,这个时候就碰到了一个概率性的问题,因为jsb是第一次执行的时候要先建立bridge,要先往h5里面注入他自己的一段js代码,通过stringByEvaluatingJavaScriptFromString来注入,这个方法是同步执行的,可能这段代码还没执行完成,h5那边就调用WebViewJavascriptBridge.callHandler,找不到callHandler方法,抛异常,界面卡主无法操作。

后面git上看到Haley-Wong的JS交互总结,发现WKWebview就有系统原生的JS交互,WKUserContentController,他是管理JS交互操作执行。具体例子可以去看Haley-Wong同学写的。

js->oc:window.webkit.messageHandlers.Location.postMessage(null);
Location是OC这边定义的MessageHandler,postMessage里面是参数,
这里一个问题,如果是没有传参数给oc的话,这里面要写null,不然oc不会有回调。

oc->js:

NSString *jsStr = [NSString stringWithFormat:@"getDataReturn('%@')",@"新不行啊"];
        
[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
            NSLog(@"%@----%@",result, error)
        }];

jsStr 里面是h5那边定义的方法+参数,

js->oc获取数据:
就是先js->oc告诉app他要获取数据再oc->js,就是上面两个步骤结合,他不像jsp那样子,js执行调用oc之后之后直接有回调回去。

这边有一个问题:
我在调用WKWebview的evaluateJavaScript的时候老是报错:Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=79, WKJavaScriptExceptionMessage=ReferenceError: Can't find variable: $, WKJavaScriptExceptionSourceURL=****, NSLocalizedDescription=A JavaScript exception occurred, WKJavaScriptExceptionColumnNumber=18},

这里面的问题原因是:evaluateJavaScript去调用h5中的方法之后,这个function要执行完成之后才会回调的app这边,如果这个function中报错了,回调到app这边就会一直报错。所以建议function中的东西可以先延迟执行。还有function需要写在最外层,不然也会报错。限制太多。

你可能感兴趣的:(WKWebview里JS交互的问题)