传输 0.1.0

传输 0.1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 BSD 3.0
发布最后发布2014年12月

Heiko Behrens维护。



传输 0.1.0

  • Heiko Behrens 和 Marcel Jackwerth

传输在JavaScript和iOS、OSX、Android之间建立桥梁。您可以将WebView或通过JS脚本嵌入到您的应用中,并将原生物件作为函数传递,特别是事件处理器。当您的原生物件被调用时,您可以重新使用所有参数以及this参数,即使它们是JavaScript,函数也行!

它不依赖于像JavaScript Core或Rhino这样的特殊JavaScript运行时,可以与任何理解JavaScript的实时或非实时组件一起使用。因此,您可以将现有的网页轻松修改以与您的原生物件集成(例如,使history.go(-1)关闭WebView或将按钮的onClick事件绑定到您的原生物件)。另一方面,您可以暴露原生物件作为可访问的JavaScript函数(例如,[transit bind: toVariable:'navigator.vibrate'])。

Objective-C 示例

从任何可见或不可见的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中找到更多信息,例如