前文我们介绍了 Android 的 WebView 交互方式,iOS 从原理上来说和 Android 还是非常类似的。在 iOS 中 WebView 需要分为UIWebView 和 iOS8 中新增的 WKWebView 两种类型。其中 WKWebView 相较于 UIWebView 优势在于能够直接使用系统 Safari 渲染引擎去渲染页面,支持更多的 HTML5 特性,渲染性能也会更好点。由于对 iOS 开发了解不太多,以下的代码大多是网络整理,没有 swift 的实现,如果有任何错误还请及时联系。
客户端调用 JS
两个 WebView 类型提供了不同的调用方式,但是基本上可以归类成以下两种:
evaluateScript
在 UIWebView 中,iOS7+ 提供了 JavascriptCore 让我们能够直接在 WebView 中获取到 JSContext,也就是当前执行环境的 JS 上下文。在这里我们就可以获取到对应的 JS 方法并执行,是非常高效的执行方式。同时这种方式的好处是能够拿到 JS 执行的结果,并转换成对应的 JS 类型。定义好 jsContext
之后就可以调用 evaluateScript
方法来执行 JS 了。
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//设置JS执行报错捕获
[self.jsContext setExceptionHandler:^(JSContext *context, JSValue *exception){
NSLog(@"%@", exception);
}];
JSValue *value = [self.jsContext evaluateScript:@"document.title"];
self.navigationItem.title = value.toString;
}
Objective-C 数据类型 |
对应 JavaScript 数据类型 |
nil |
undefined |
NSNull |
null |
NSString |
string |
NSNumber |
number, boolean |
NSDictionary |
Object object |
NSArray |
Array object |
NSDate |
Date object |
NSBlock |
Function object |
id |
Wrapper object |
Class |
Constructor object |
阅读全文→