如何将JS函数作为对象属性传递给iOS

时间:2016-02-24 15:51:19

标签: ios javascriptcore jsvalue

我有一个名为JSExport的{​​{1}}协议,其方法为ChannelExport。从Javascript代码调用此方法可以正常工作,如下所示:

- (void)sendRequest:(NSDictionary *)request withCallback:(JSValue *)callback;

在ObjC中,我可以访问channel.sendRequestWithCallback({'foo': 'bar'}, function(response) { ... }); 字典中的值,也可以调用request函数。

现在我想将接口更改为callback,将JS函数作为- (void)sendRequest:(NSDictionary *)request字典的一部分传递,如下所示:

request

在这种情况下,当我尝试在ObjC中调用channel.sendRequestWithCallback({ 'foo': 'bar' 'callback': function(response) { ... } }); 函数时,应用程序崩溃了。显然,callback对象不是callback,而是JSValue(更确切地说,是NSDictionary)。我假设JS函数正确地包装为__NSDictionaryM,其方式与将其作为简单参数传递时的方式相同。

有没有提示为什么会这样,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您无法使用- (void)sendRequest:(NSDictionary *)request签名来实现目标。如果将参数定义为NSDictionary,则JavaScriptCore将递归地将此字典中的所有对象转换为相应的Objective-C对象。请改用- (void)sendRequest:(JSValue *)requestValue

- (void)sendRequest:(JSValue *)requestValue {
    JSValue *fooJSValue = [requestValue valueForProperty:@"foo"];
    NSString *bar = [fooJSValue isUndefined] ? nil : fooValue.toString;
    // use bar

    JSValue *callback = [requestValue valueForProperty:@"callback"];
    [callback callWithArguments:myArguments];
}