Отправьте функцию 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 и передаст его.