为rails应用程序构建iphone客户端的最佳方法是什么?

时间:2008-12-13 22:34:27

标签: iphone ruby-on-rails objective-c xml rest

我有一个相当标准的rails应用程序,并希望能够从iPhone应用程序访问基本的CRUD(创建,更新,删除)操作以及我添加的查询。 Rails或多或少开箱即可为这些操作提供REST API。

在iphone上处理REST / XML部分的最佳方法是什么,是否有任何好的Objective-C库已经做过这种事情了?操作还需要与特定用户相关联(即经过身份验证)。

6 个答案:

答案 0 :(得分:13)

这对我来说是一个常见的问题,以至于我一直在研究名为ObjectiveResource的Rails ActiveResource框架的端口。

到目前为止,我们已经有两个版本的项目。 1.0已经被App Store中的一些应用程序使用,并且可以处理Rails中内置的默认to_xml和to_json资源处理。 1.01是一个错误修复版本,并且升级失败。

我们目前正致力于定义1.1的功能集。我们已经have quite a few ideas了,而且是discussing more on the mailing list

答案 1 :(得分:6)

我使用plist运气好了......

您需要安装plist-3.0.0 gem(gem install plist IIRC)

然后在您的控制器中设置如下内容:

plist = {'a'  => 'b', 'c' => 'd', 'e' => {'f' => 'g', 'h' => {'i' => 'j'}}}.to_plist
render(:text => plist)

然后在你的iphone应用程序中设置如下:

NSURL *url = [NSURL URLWithString:@"http://somewhere.com"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSError *error;
NSData *plistData;
plistData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSPropertyListFormat format;
NSString *errorStr;
id imagesToRate = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
if(!imagesToRate) {
    NSLog(errorStr);
} else {
    NSLog(@"%@", [imagesToRate objectForKey:@"e"]);
}

你几乎可以自由地使用json(例如,你不需要使用自己的xml方案来格式化数据,序列化就像to_plist调用一样简单)另外,sdk还带有本机处理plists的代码。

但是,如果你们都准备好了一个用json / xml输出的web服务,你可能想保留它,只是使用已经提到过的东西解析iphone上的东西(TouchXML,json-framework)

答案 2 :(得分:4)

最好的办法是围绕NSURLConnection编写一个简单的包装类,为您的API设置特定的东西。它并不是特别复杂,它可以让您直接根据您要定位的REST API定制类的API。您的类可以有一个类似initWithMethod:delegate:params:的init方法,其中委托是想要异步接收结果的对象,而params是所有参数的NSDictionary。您还可以使用类上的属性来设置身份验证(或让您在登录后让类自己发现并记录它。)

至于解析XML,我建议您查看TouchXML

答案 3 :(得分:2)

如果您不喜欢解析XML(以及谁呢?)并且可以将后端配置为吐出JSON而不是XML,我强烈建议您使用json-framework之类的库。将数据读入对象要比通过XML节点解析要容易得多。

答案 4 :(得分:1)

小心使用iPhone上的NSURLConnection。众所周知,内存泄漏会导致应用程序崩溃。如果您正在执行大量HTTP请求,请不要指望NSURLConnection可以为您工作。找一些其他东西,可能是一些卷曲包装。

答案 5 :(得分:1)

我最近整理了一个使用NSURLConnection的TouchJSON示例。这是非常基本的,但应该足以让你开始使用asych。

http://github.com/twoism/touchjsonexample/tree/master