Ios 使用JavascriptCore将javascript函数发送到objective-C
我正试图利用JSExport协议,通过JavascriptCore向Objective-C发送一个Javascript函数对象。我在Objective-C中声明了一个函数,符合JSExport的要求,如下所示:Ios 使用JavascriptCore将javascript函数发送到objective-C,ios,objective-c,javascriptcore,Ios,Objective C,Javascriptcore,我正试图利用JSExport协议,通过JavascriptCore向Objective-C发送一个Javascript函数对象。我在Objective-C中声明了一个函数,符合JSExport的要求,如下所示: (class View) + (void) newWithFunc:(id)func { NSLog(@" %@ ", func); } 声明此类后,我尝试使用Javascript函数对象作为参数调用上述函数 JSValue *val; val = [context ev
(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中是可能的吗?这绝对是可能的,但您需要更改newWithFunc:以接受JSValue*而不是普通id。原因是JSValue*是JavaScriptCore的特殊类型-它不会尝试将JS值转换为其本机等效值,而是将其包装在JSValue中并传递。请标记为正确。我不知道他是怎么知道的,也不知道记录在哪里,但这是我通过反复试验得出的结论:
- (void)newWithFunc: (JSValue*)func
{
[func callWithArguments:@[]]; // will invoke js func with no params
}
声明参数(id)func
显然会导致javascript cocoa桥将其转换为NSDictionary(如您所注意到的),从而使其无法作为可调用的JSValue使用