假设我有三个班级。
当我按下视图控制器上的按钮时,它会调用.js
(JavaScript文件)并返回.js
文件调用模型类中的方法。
我只是想知道是否可以在不使用Web视图的情况下使用JavaScript核心框架。
提前致谢。
答案 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?的回答。