【问题标题】:Call native objective methods from JavaScript using JavaScript core framework使用 JavaScript 核心框架从 JavaScript 调用本机目标方法
【发布时间】:2014-05-07 03:57:49
【问题描述】:

假设我有三个班级。

  1. 一个带有按钮的视图控制器。
  2. 带有一些 JavaScript 方法的 JavaScript 文件。
  3. 使用一些调用 Web 服务的方法为目标类建模。

当我按下视图控制器上的按钮时,它会调用.js(JavaScript 文件),然后.js 文件会调用模型类中的方法。

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

【问题讨论】:

    标签: javascript ios javascriptcore


    【解决方案1】:

    在 iOS 7 / OS X 10.9 中引入的 JavascriptCore 框架中的 Objective-C 接口允许从 Javascript 调用 Objective-C 方法并从 Objective-C 调用 Javascript 函数。这两种情况都可以在不涉及 web 视图的情况下发生。有关这些功能的精彩介绍,请查看 Apple 开发者网络上的 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? 的回复。

    【讨论】:

    • Mike,假设我在一个 myJavascript.js 文件中有两个或三个函数,那么我该如何选择单个函数。因为如果我们提供 .js 文件的路径,那么就可以一口气读取完整的文件。如果您可以提供任何建议。
    • 您可以在 myJavascript.js 文件中包含任意数量的 javascript 函数。一旦它被[javascriptContext evaluateScript:script] 加载和评估,然后JSValue *myFn1 = javascriptContext[@"myFn1"]; [myFn1 callWithArguments:myArrayOfArgs];JSValue *myFn2 = javascriptContext[@"myFn2"]; [myFn2 callWithArguments:myArrayOfArgs2]; 从Objective-C 访问各个函数,其中您的函数在javascript 中称为myFn1 和myFn2
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多