传输在JavaScript和iOS、OSX、Android之间建立桥梁。您可以将WebView或通过JS脚本嵌入到您的应用中,并将原生物件作为函数传递,特别是事件处理器。当您的原生物件被调用时,您可以重新使用所有参数以及this
参数,即使它们是JavaScript,函数也行!
它不依赖于像JavaScript Core或Rhino这样的特殊JavaScript运行时,可以与任何理解JavaScript的实时或非实时组件一起使用。因此,您可以将现有的网页轻松修改以与您的原生物件集成(例如,使history.go(-1)
关闭WebView或将按钮的onClick
事件绑定到您的原生物件)。另一方面,您可以暴露原生物件作为可访问的JavaScript函数(例如,[transit bind:
)。
从任何可见或不可见的WebView创建传输上下文
TransitUIWebViewContext *context = [TransitUIWebViewContext contextWithUIWebView:someViewView];
使用方便的占位符@
和隐式类型转换评估JavaScript。例如,调用
NSLog(@"%@", [context eval:@" {result: @ + Math.max(23, @) } " val: @"foo" val: @42.5]);
将打印 NSDictionary: {结果: "foo42.5"}
到控制台。
您可以将JavaScript函数存储在本地变量中,稍后调用它们,也可以在任意时刻将它们返回给JavaScript。这段代码
TransitFunction *mathMax = [context eval:@"Math.max"];
NSLog(@"%@", [mathMax callWithArg:@3.5 arg:@6] );
NSLog(@"%@", [context eval:@" @(3.5, @)" val: mathMax val:@6] );
在两种情况下都打印出6
。
双向也是一样的,您可以向JavaScript传递块,例如注册或覆盖全局函数
context[@"log"] = ^(id object){
NSLog(@"%@", object);
};
[context eval:@"log('Hello, World!')"];
但是,传输真正的强大之处在于您可以结合原代码与JavaScript。块或代理可以从JavaScript调用,甚至可以接收JavaScript函数作为参数。下面的代码片段
TransitFunction *applyFunc = [context functionWithBlock:^(TransitFunction* func, float a, int b){
NSLog(@"arguments: func: %@, a: %f, b: %d", func, a, b);
return [func callWithArg:@(a) arg:@(b)];
}];
NSNumber* result = [context eval:@"@(Math.max, 3.5, @)" val:applyFunc val:@6];
NSLog(@"result: %f", result.floatValue);
输出到控制台。
arguments: func: <TransitJSFunction: 0x11b34fc0>, a: 3.500000, b: 6
result: 6.0000
。
还有更多内容。例如,TransitCurrentCall
让您可以访问 this
变量、所有 arguments
并且还允许您从JavaScript和原生物件中打印统一的调用堆栈
002 TransitNativeFunctionCallScope(this=<TransitUIWebViewContext: 0x75250d0>(<TransitJSFunction:0x11b34fc0>, 3.5, {field = 6;})
001 TransitEvalCallScope(this=<TransitUIWebViewContext: 0x75250d0>) @(Math.max, 3.5, {field:@}) -- values:(<TransitNativeFunction: 0x752ff00>, 6)
阅读API 文档 获取更多详细信息。
您可以在Wiki中找到更多信息,例如