1. js 与 oc 间调用
使用 JavaScriptCore.framework
#import <JavaScriptCore/JavaScriptCore.h>
1.1. oc 调 js
1.1.1. UIWebView
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
只能在主线程执行
1.1.2. WKWebview
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
1.1.3. UIWebView JavaScriptCore
WKWebView 不支持通过如下的KVC的方式创建JSContext
evaluateScript
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *textJS = @"showAlert('这里是JS中alert弹出的message')";
[context evaluateScript:textJS];
callWithArguments
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
[context[@"payResult"] callWithArguments:@[@"支付弹窗"]];
1.2. js 调 oc
1.2.1. UIWebView
1.2.2. WKWebview
1.2.3. UIWebView JavaScriptCore
// 获取webView上的js
JSContext *contest = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
contest[@"test"] = ^(){
NSLog(@"test按钮被点击了!!");
// 这里网页上的按钮被点击了, 客户端可以在这里拦截到,并进行操作
};
block中是在子线程,因此执行UI操作,控制台有警告,需要回到主线程再操作UI。