Отправьте функцию javascript на target-C, используя JavascriptCore

Я пытаюсь отправить объект функции Javascript в Objective-C через JavascriptCore, используя протокол JSExport. У меня есть функция, объявленная в 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?

2 ответа

Решение

Пожалуйста, отметьте ответ Тайшренна как правильный. Я не знаю, откуда он это знал или где это задокументировано, но вот что я понял методом проб и ошибок:

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

Объявление параметра (id)func очевидно, что мост javascript-cocoa преобразует его в NSDictionary (как вы заметили), что делает его непригодным для использования в качестве вызываемого JSValue.

Это определенно возможно, но вам нужно изменить newWithFunc: принимать JSValue* вместо простого идентификатора. Причина в том, что JSValue* является специальным типом для JavaScriptCore - он не будет пытаться преобразовать значение JS в его собственный эквивалент, а вместо этого обернет его в JSValue и передаст его.

Другие вопросы по тегам