Kaare 1.0.0

Kaare 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

Artem Yarulin 维护。



Kaare 1.0.0

  • 作者
  • Artem Yarulin

JavaScript 和本地代码之间的跨平台反应通信通道

使用 ReactiveCocoa 构建 UI 并使用 JavaScript 作为跨平台业务逻辑核心,利用反应信号来解决问题,这不是很酷吗?

Kaare 还通过使本地和 JS 代码之间的通信也变得反应式,让一切都变得更加出色。

使用示例

Kaare 将处理从一种上下文到另一种上下文的全部双向通信

-(void)testExampleFromReadme
{
    __block NSString* output = @"";

    Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareJSCoreTransport alloc] initWithContextFinder:^JSContext *{
        // Here you can define how your JS context can be found
        return [self getContextForTestAndEvaluate:@[@"var getString = function(){ return 'Hello' }",
                                                    @"var splitString = function(str) { return Rx.Observable.fromArray(str.split('')) }"]];
    }]];

    [[[kaare executeCommand:@"getString" params:nil]
      flattenMap:^RACStream *(id value) { return [kaare executeCommand:@"splitString" params:@[value]]; }]
      subscribeNext:^(id x) { output = [output stringByAppendingString:x]; }
      completed:^{ isDone = YES; XCTAssertEqualObjects(output,@"Hello",@"There should be right output");
    }];
}

-(void)testReturnSignalWithNumber
{
    Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareJSCoreTransport alloc] initWithContextFinder:^JSContext *{
        return [self getContextForTestAndEvaluate:@[@"var forwarder = new kaare.Forwarder()"]];
    }]];
    [kaare registerCommand:@"number" handler:^RACSignal* (NSArray *params) { return [RACSignal return:@(42)]; }];

    [context evaluateScript:[NSString stringWithFormat:@"forwarder.executeCommand('number').subscribe(function(v){ output = v*2 },null,function(){ done() })"]];

    NSNumber* output = [[context evaluateScript:@"output"] toNumber];
    XCTAssertEqual([output intValue], 84,@"There should be right number");
}

扩展

Kaare 可以很容易地通过新处理程序进行扩展。例如,Kaare Platform 引入了一些可能对您的 JS 有用的原生 API 函数。

var app = {}
app.kaare = new Kaare(new KaareNativeTransport())
app.platform = new KaarePlatform(kaare)

app.platform.httpRequest('http://google.com')
  .map(function(response)       { return response.body })
  .map(function(body)           { return app.platform.xPath(body,'//input/@value') })
  .map(function(inputValue)     { return 'Found name with value: ' + inputValue })
  .subscribe(function(logEntry) { console.log(logEntry) })

传输(Transports)

Kaare 支持不同类型的传输,以便支持不同的 JS 执行上下文(JavaScriptCore、UIWebView)。其中一种传输允许 JS 和本地代码之间的远程通信,这对开发非常方便。

shell: vagrant up 将启动 redis 和 webdis
JS: var kaare = new Kaare(new KaareRemoteTransport('http://vagrantHost:7656'))
Obj-C: Kaare* kaare = [[Kaare alloc] initWithTransport:[[KaareRemoteTransport alloc] initWithOptions:@{@"url":@"http://vagrantHost:7656"}]

从现在起,您可以使用您喜欢的 OS 和工具(如 mocha、gulp 等)开发所有 JS 代码,同时使用 OS 的原生 API,无需模拟,无需更改代码。

路线图

1.2.0

  • [ ] UIWebView 传输
  • [ ] 思考如何简化 API 并去掉 KaarePlatform* platform = [[KaarePlatform alloc] initWithKaare:kaare]
  • [ ] 思考 JSContext 初始化器

1.3.0

  • [ ] 示例项目,展示 Kaare 的强大功能(想法:从 JS 发送无限数量的事件并根据这些事件填充表格?)

1.4.0

  • [ ] 稳定 API,思考在哪些方面可以扩展功能

2.0.0

  • [ ] Windows Phone
    • [ ] .Net C# Kaare 实现
    • [ ] Windows Phone Web View 传输

3.0.0

  • [ ] Android