【问题标题】:Send javascript function to objective-C using JavascriptCore使用 JavascriptCore 将 javascript 函数发送到 Objective-C
【发布时间】:2014-10-05 22:43:12
【问题描述】:

我正在尝试利用 JSExport 协议通过 JavascriptCore 将 Javascript 函数对象发送到 Objective-C。我有一个在 Objective-C 中声明的函数,符合 JSExport 如下:

(class View)
+ (void) newWithFunc:(id)func
{
    NSLog(@" %@ ", func);   
}

在声明了这个类之后,我尝试调用上面的函数,以一个Javascript函数对象作为参数

JSValue *val;
val = [context evaluateScript:@"var mufunc = function() { self.value = 10; };"];
val = [context evaluateScript:@"mufunc;"];
NSLog(@" %@", val); //Prints as 'function() { self.value = 10; }', seems correct.
val = [context evaluateScript:@"var view = View.newWithFunc(mufunc);"];

最后一次调用时,发送到我的 Objective-C 方法的参数是“NSDictionary”类型,如果我想做的是从 Objective-C 调用该函数稍后的时间点。 JavascriptCore 可以做到这一点吗?

【问题讨论】:

    标签: ios objective-c javascriptcore


    【解决方案1】:

    请将Tayschrenn's answer 标记为正确。我不知道他是如何知道这一点的,也不知道它是在哪里记录的,但这是我通过反复试验得出的结论:

    - (void)newWithFunc: (JSValue*)func
    {
        [func callWithArguments:@[]]; // will invoke js func with no params
    }
    

    声明参数 (id)func 显然会导致 javascript-cocoa 桥将其转换为 NSDictionary(如您所见),使其无法用作可调用的 JSValue。

    【讨论】:

      【解决方案2】:

      这绝对是可能的,但是您需要更改 newWithFunc: 以接受 JSValue* 而不是普通的 id。原因是 JSValue* 是 JavaScriptCore 的一种特殊类型 - 它不会尝试将 JS 值转换为其原生等效值,而是将其包装在 JSValue 中并传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 2016-01-09
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多