JS调用OC
通过wkwebview的WKScriptMessageHandler协议, 注入api方式
iOS 添加监听
[_wkWebView.configuration.userContentController addScriptMessageHandler:self name:name];
实现协议中的方法(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
message有name和body,name就是约定好的事件名称,body就是传入的参数
js调用
window.webkit.messageHandlers.name.postMessage(action, token);
当然vcdisappear后,记得移除监听
[_wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"jsToOc"];
利用WebView-协议拦截
//! JS调用OC入口
function jsToOc(action, params) {
var url = "jsToOc://" + action + "?" + params;
window.location.href = url;
}
这个靠拦截url,再判断url协议来实现调用
#pragma mark - WKNavigationDelegate
//! WKWeView在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if ([navigationAction.request.URL.scheme caseInsensitiveCompare:@"jsToOc"] == NSOrderedSame) {
[WKWebViewInterceptController showAlertWithTitle:navigationAction.request.URL.host message:navigationAction.request.URL.query cancelHandler:nil];
decisionHandler(WKNavigationActionPolicyCancel);
}
else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
利用JavaScriptCore框架
//! 导入JavaScriptCore框架头文件 #import <JavaScriptCore/JavaScriptCore.h> #pragma mark - UIWebViewDelegate
//! UIWebView在每次加载请求完成后会调用此方法
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//! 获取JS代码的执行环境/上下文/作用域
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//! 监听JS代码里面的jsToOc方法(执行效果上可以理解成重写了JS的jsToOc方法)
context[@"jsToOc"] = ^(NSString *action, NSString *params) {
dispatch_async(dispatch_get_main_queue(), ^{
// dosomething in native
});
};
}
iOS 调用js, 直接调用js的方法并传参
NSString *jsString = [NSString stringWithFormat:@"ocToJs('loginSucceed', 'oc_tokenString')"];
[self.webView stringByEvaluatingJavaScriptFromString:jsString]