使用JavaScript核心框架从JavaScript调用本机目标方法

时间:2014-05-07 03:57:49

标签: javascript ios javascriptcore

假设我有三个班级。

  1. 一个视图控制器,上面有一个按钮。
  2. JavaScript文件包含一些JavaScript方法。
  3. 模型目标类,包含一些调用web服务的方法。
  4. 当我按下视图控制器上的按钮时,它会调用.js(JavaScript文件)并返回.js文件调用模型类中的方法。

    我只是想知道是否可以在不使用Web视图的情况下使用JavaScript核心框架。

    提前致谢。

1 个答案:

答案 0 :(得分:5)

iOS 7 / OS X 10.9引入的JavascriptCore框架中的Objective-C接口允许从Javascript调用Objective-C方法并从Objective-C调用Javascript函数。这两种情况都可以在不涉及webview的情况下发生。有关这些功能的详细介绍,请查看Apple WWD开发人员网络上的2013 WWDC简介“将JavaScript集成到本机应用程序”会话:https://developer.apple.com/videos/wwdc/2013/?id=615

下面是一个简单的例子。您还可以创建更复杂的示例,通过JSExport协议直接公开现有方法(请参阅上面的pdf / video)。

myJavascript.js:

function myJavascriptFn(arg) {
    myObjC_callback(arg); // Call Objective C code
}

myView.m:

#import <JavaScriptCore/JavaScriptCore.h>

....

javascriptContext  = [[JSContext alloc] init]; // Create a standalone javascript VM and context.

// Load the javascript file into the VM
NSURL *scriptURL = [NSURL URLWithString:@"path/to/myJavascript.js"];
NSError *error = nil;
NSString *script = [NSString stringWithContentsOfURL:scriptURL encoding:NSUTF8StringEncoding error:&error];
[javascriptContext evaluateScript:script];

// Set up calling an Objective-C callback for Javascript to use
javascriptContext[@"myObjC_callback"] = ^(NSString *arg) {
    NSLog(@"Calling someObjectiveCMethod from javascript.  Passed arg is:%@", arg);
    [self someObjectiveCMethod:arg];
}

// Call javascript from Objective C
JSValue *myJavascript_callback = javascriptContext[@"myJavascriptFn"];
[myJavascript_callback callWithArguments:@[@"test arg"]];

JavascriptCore框架还提供了常见的Objective-C类型和Javascript类型之间的内置转换。有关详细信息,请参阅我对How is an ObjC JS bridge translated?的回答。