JavaScriptCore
- JSExport (Protocol)
- 实现将OC类及其示例方法,类方法,和属性导出为JavaScript代码的协议
- JSContext
- JS运行的环境
- 获取到的JSContext从属于一个JSVirtualMachine
- JSValue
- JavaScript的值的引用, 任何JS中的值都能被包装成一个JSValue
- JSManagedValue
- 对JSValue的包装,加入了conditional retain
- JSVirtualMachine
- JavaScript执行的独立环境
- 可包含多个JSContext,并互相传值
iOS 与 JS 交互
JS 调用 Native
1. 假请求方式
拦截约定好的scheme
WKWebView中 decisionHandler(WKNavigationActionPolicyCancel);
决定允许还是取消导航
2. JavaScriptCore方式 @import JavaScriptCore;
UIWebView
jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
Native 调用 JS
WebView直接注入JS并执行
UIWebView
NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')", @"alert msg"];
[_webView stringByEvaluatingJavaScriptFromString:jsStr];
::这个方法会返回运行 JS 的结果(nullable NSString *),它是一个同步方法,会阻塞当前线程!尽管此方法不被弃用,但最佳做法是使用 WKWebView 类的 evaluateJavaScript:completionHandler:method::
WKWebView
NSString *jsStr = [NSString stringWithFormat:@"setLocation('%@')", @"北京市东城区南锣鼓巷纳福胡同xx号"];
[_webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@----%@", result, error);
}];
JavaScriptCore 方法
UIWebView 可以直接通过JSContext获取到方法名,传参调用
// 首先引入 JavaScriptCore 库
#import // 先获取 JS 上下文
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 如果涉及 UI 操作,切回主线程调用 JS 代码中的 YourFuncName,通过数组@[parameter] 入参
dispatch_async(dispatch_get_main_queue(), ^{
JSValue *jsValue = self.jsContext[@"YourFuncName"];
[jsValue callWithArguments:@[parameter]];
});
WKWebView
WKUIDelegate
可以监听JS中的Alert 和 Confirm
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
// 用 Native 的 UIAlertController 弹窗显示 JS 将要提示的信息
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提醒" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
// 函数内必须调用 completionHandler
completionHandler();
}]];
[self presentViewController:alert animated:YES completion:nil];
}
MessageHandler
JS 调用 Native
继 Native 截获 JS 假请求后另一种 JS 调用 Native 的方法,WKWebView 的新特性实现。对比截获假 Request 的方法来说,MessageHandler 传参数更加简单方便。
-(void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;