我想通过Objective-C编写一个可以导出到JavaScript的方法,这样我就可以将JavaScript Object转换为本机代码。例如,在以下代码中:someObject
是本机实现的对象,其方法很有趣。
someObject.fun({ k : 'value1', k2 : 'value2'})

我知道使用JSExport
可以将本机方法导出到JavaScript。并成功将JavaScript String传递给本机代码(NSString*
)。但是,当我想将JavaScript对象传递给本机时,它会失败。
如何解决这个问题?
非常感谢
答案 0 :(得分:1)
除了已经观察到的将javascript字符串转换为NSString *之外,在传递给objective-c方法之前,Javascript对象被复制到符合KVC的objective-C对象(实质上是NSDictionary实例)。
例如,使用以下定义:
@protocol MyJSAPI
- (void)fun:(id)param;
@end
@interface MyObject: NSObject<MyJSAPI>
- (void)fun:(id)param;
@end
和JSContext的初始化如下:
myjscontext[@"someObject"] = [[MyObject alloc] init];
[myjscontext evaluateScript:@"someObject.fun({ k : 'value1', k2 : 'value2'});
然后,您的fun:(id)param
方法可以访问对象的k
和k2
字段,如下所示:
@implementation MyObject
- (void)fun:(id)param {
NSString* k = [param valueForKey:@"k"];
NSString* k2 = [param valueForKey:@"k2"];
NSLog(@"k = %@, k2 = %@", k, k2);
}
@end
答案 1 :(得分:0)
除了ste3veh的回答。
您可以按照以下方式使用JSExportAs
宏将Objective-C方法导出为JavaScript:
@interface MyObject: NSObject <JSExport>
JSExportAs(fun,
- (void)fun:(id)param
);
@end
@implementation MyObject
- (void)fun:(id)param {
NSString* k = [param objectForKey:@"k"];
NSString* k2 = [param objectForKey:@"k2"];
NSLog(@"k = %@, k2 = %@", k, k2);
}
@end
在这种情况下,param
将使用-[JSValue toObject]
隐式转换为相应的Objective-C oblect。在您的情况下,它将在NSDictionary
中转换。要避免隐式转换,您可以将参数指定为JSValue
:
@interface MyObject: NSObject <JSExport>
JSExportAs(fun,
- (void)fun:(JSValue*)param
);
@end
@implementation MyObject
- (void)fun:(JSValue*)param {
NSString* k = [[param valueForProperty:@"k"] toString];
NSString* k2 = [[param valueForProperty:@"k2"] toString];
NSLog(@"k = %@, k2 = %@", k, k2);
}
@end
请注意,大型JavaScript对象(即window
或document
)转换为相应的Objective-C对象非常昂贵,因此第二种方式更受欢迎。此外,您可以使用JSValue
参数使用callWithArguments:
从Objective-C回调此对象的JavaScript方法。
答案 2 :(得分:-1)
我认为你不能。请参阅JSExport.h
标题:它定义了参数可以是什么,并且看起来不会传递通用JavaScript对象。