在 JavascriptCore 中将 NSDictionary 从 Javascript 传递到 Objective-c

Pass NSDictionary from Javascript to Objective-c in JavascriptCore

我在我的应用程序中使用 JavascriptCore。现在,我将一些变量传递给 JSContext,然后这些变量可以传递回 Objective-C。但是,其中一个变量 NSDictionary 没有正确传递。我运行下面的代码:

var evaluate = function(variables) {
    app.setDictionary(variables.dictionary);
}

这是一个简单示例,在 JSContext 中设置了以下方法。

这是setDictionary()方法:

- (void)setDicationary:(NSDictionary *)dictionary {
    self.mutableDictionary = [dictionary mutableCopy];
}

这是variables.dictionary:

- (NSDictionary *)dictionary {
    return self.values;
}

我就是这样称呼 evaluate():

JSValue *jsFunction = self.context[@"evaluate"];
JSValue *value = [jsFunction callWithArguments:@[self.variables]];

但是,在 setDictionary 方法中,我没有得到 NSDictionary,而是得到一个包含 [object Object].

的 NSString

有什么解决办法吗?

虽然 JavaScriptCore 会自动在 Objective-C 或 Swift 和 JavaScript 之间转换类型,但我建议实现显式转换。自动转换并不总是像开发人员期望的那样工作。例如,当使用 NSString 时,undefined 将转换为 @"undefined"

试试这样的东西:

- (void)setDicationary:(JSValue *)jsDictionary {
    if ([jsDictionary isUndefined] || [jsDictionary isNull]) {
        jsDictionary = nil;
    }
    self.mutableDictionary = [jsDictionary toDictionary];
}

请注意 JavaScript 使用对象作为字典,因此您应该非常小心传递给 Objective-C 代码的参数。传递任何系统对象将导致该对象递归转换为 NSDictionary.