将Objective-c对象公开为JSON格式的JavaScript环境

时间:2010-10-12 14:28:21

标签: javascript objective-c

我想在RUNTIME中以JSON格式表示任何objective-c对象,以便javascript脚本可以使用它通过'dot'表示法访问任何字段/变量/属性。

例如,

该对象的Objective-c类可以是:

@interface myNativeObject 
   PrimtivieType *pVar;
   CustomClassType *cVar;
@end

其中CustomClassType可能包含另一个对象,如下所示:

@interface CustomDataType
  PrimitiveType *myVar;
@end

我想以JSON格式将myNativeObject公开给JavaScript,如下所示:

    var nativeObjInJavaScript = {
                                  pVar:pval,
                                  cVar:{
                                         myVar:myVarValue
                                  }
                                }

因此,现在跟随JavaScript表达式shoule正常工作:

var LValue = nativeObjInJavaScript.cVar.myVar;

我在考虑

1。)编写递归函数,该函数将使用Objective-C运行时库来获取有关对象的信息并生成JSON等效项。我是在正确的轨道上吗?

2。)在这种情况下,Objective-c的键值编码功能可能有任何帮助吗?

此致

1 个答案:

答案 0 :(得分:1)

在OS X上,WebKit已经有了这个机制,请阅读this document。您只需要获取窗口脚本对象并在那里设置Obj-C对象:

 WebScriptObject* wso=[webView windowScriptObject];
 [wso setValue:objCobj forKey:@"javascriptName"];

您需要在

中指定可从javascript端访问的方法名称和属性
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
 + (BOOL)isKeyExcludedFromWebScript:(const char *)name;
你公开的课程的

在iPhone上,您可以在UIWebView上使用的方法stringByEvaluatingJavascriptFromString:构建javascript对象,使用委托方法webView:shouldStartLoadWithRequest:navigationType:来接收信息。如果你想暴露通用对象,你需要使用方法1),但我不认为这通常是好的; NSObject可以拥有许多由运行时选取的私有ivars,您可能不想公开它们。我想最好给出你想要公开的属性列表。

项目PhoneGap大量使用这种技术,因此阅读其源代码可能会对您有所帮助。