以JSON格式向JavaScript环境公开Objective-c对象
我希望在运行时以JSON格式表示任何objective-c对象,以便javascript脚本可以使用它通过“点”符号访问任何字段/变量/属性 比如说, 对象的Objective-c类可以是:以JSON格式向JavaScript环境公开Objective-c对象,javascript,objective-c,Javascript,Objective C,我希望在运行时以JSON格式表示任何objective-c对象,以便javascript脚本可以使用它通过“点”符号访问任何字段/变量/属性 比如说, 对象的Objective-c类可以是: @interface myNativeObject PrimtivieType *pVar; CustomClassType *cVar; @end @interface CustomDataType PrimitiveType *myVar; @end var nativeO
@interface myNativeObject
PrimtivieType *pVar;
CustomClassType *cVar;
@end
@interface CustomDataType
PrimitiveType *myVar;
@end
var nativeObjInJavaScript = {
pVar:pval,
cVar:{
myVar:myVarValue
}
}
var LValue = nativeObjInJavaScript.cVar.myVar;
其中CustomClassType可能包含另一个对象,如下所示:
@interface myNativeObject
PrimtivieType *pVar;
CustomClassType *cVar;
@end
@interface CustomDataType
PrimitiveType *myVar;
@end
var nativeObjInJavaScript = {
pVar:pval,
cVar:{
myVar:myVarValue
}
}
var LValue = nativeObjInJavaScript.cVar.myVar;
我想以JSON格式向JavaScript公开myNativeObject,如下所示:
@interface myNativeObject
PrimtivieType *pVar;
CustomClassType *cVar;
@end
@interface CustomDataType
PrimitiveType *myVar;
@end
var nativeObjInJavaScript = {
pVar:pval,
cVar:{
myVar:myVarValue
}
}
var LValue = nativeObjInJavaScript.cVar.myVar;
因此,下面的JavaScript表达式应该可以正常工作:
@interface myNativeObject
PrimtivieType *pVar;
CustomClassType *cVar;
@end
@interface CustomDataType
PrimitiveType *myVar;
@end
var nativeObjInJavaScript = {
pVar:pval,
cVar:{
myVar:myVarValue
}
}
var LValue = nativeObjInJavaScript.cVar.myVar;
我在想
1.)编写一个递归函数,该函数将使用Objective-C运行时库获取有关对象的信息并生成JSON等价物。我走对了吗
2.)在这种情况下,Objective-c的键值编码功能是否有帮助
关于,在OSX上,WebKit已经有了这种机制,请阅读。您只需获取窗口脚本对象并在其中设置Obj-C对象:
WebScriptObject* wso=[webView windowScriptObject];
[wso setValue:objCobj forKey:@"javascriptName"];
您需要在中指定可从javascript端访问的方法名称和属性
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
您公开的类的
在iPhone上,可以在UIWebView
上使用的方法是构造javascript对象,委托方法用于接收返回的信息。如果您想公开泛型对象,您需要使用方法1),但我认为这通常不好NSObject
可以有许多私有IVAR,这些IVAR由运行时拾取,您可能不想公开。我想最好给出你想要公开的属性列表
该项目大量使用这种技术,因此阅读其源代码可能会对您有所帮助。在OS X上,WebKit已经有了这种机制,read。您只需获取窗口脚本对象并在其中设置Obj-C对象:
WebScriptObject* wso=[webView windowScriptObject];
[wso setValue:objCobj forKey:@"javascriptName"];
您需要在中指定可从javascript端访问的方法名称和属性
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
您公开的类的
在iPhone上,可以在UIWebView
上使用的方法是构造javascript对象,委托方法用于接收返回的信息。如果您想公开泛型对象,您需要使用方法1),但我认为这通常不好NSObject
可以有许多私有IVAR,这些IVAR由运行时拾取,您可能不想公开。我想最好给出你想要公开的属性列表
该项目大量使用这种技术,因此阅读其源代码可能会对您有所帮助。Yuji-我想在iPhone上实现这一点,因此“WebScriptObject”肯定不会有用。无论如何,谢谢你的回复。我将研究PhoneGap源代码,并尝试编写递归函数,该函数可以选择性地公开所需的属性/变量。谢谢。当您使用
WebScriptObject
时,您不应该使用webView委托接收返回的信息。相反,您应该在自定义对象中实现WebScripting
,并使用它使JS能够调用ObjC程序中的方法。Yuji-我想在iPhone上实现这一点,因此“WebScriptObject”肯定不会有用。无论如何,谢谢你的回复。我将研究PhoneGap源代码,并尝试编写递归函数,该函数可以选择性地公开所需的属性/变量。谢谢。当您使用WebScriptObject
时,您不应该使用webView委托接收返回的信息。相反,您应该在自定义对象中实现WebScripting
,并使用它使JS能够调用ObjC程序中的方法。