我正在计划我的第一个iPhone应用程序,我想从一开始就得到一些关于如何构建它的输入。 iPhone应用程序正在与面向公众的Web应用程序配合使用,该应用程序已经用PHP构建。
我希望网络平台是中心的(数据存放在mySQL数据库中),并拥有 iPhone客户端与它通信并使用REST'ful方法来执行站点的功能 (以最新内容,发布内容,投票,帐户管理为例)。
我希望客户在SQLite数据库中获取数据的本地副本,但刷新以获取最新版本的Feed(类似于Twitter应用程序)。
我现在有几个想法:
使用类似ASIHTTPRequest的内容将数据发送/接收到服务器上的PHP文件中侦听请求
JSON - 我最好将GET / POSTS发送给返回JSON对象的PHP,并使用某种管理数据的包装器并将更改传递给本地SQLite数据库吗?
我完全不知道如何构建这个与网络通信的东西?是 有最好的做法吗?
我真的很感激您对如何构建这种设置的任何意见。
谢谢,
编辑:再次阅读我自己的帖子之后,我知道这听起来像是一个Twitter客户端,但事实并非如此,尽管它具有与Twitter类型设置相似的功能/结构。谢谢!
答案 0 :(得分:17)
答案 1 :(得分:3)
我正在开发一款听起来与你类似的应用。我还建议使用ASIHTTPRequest,或者像TouchJSON一样用于JSON解析,或者如果要解析XML,则扩展/制作NSXMLParser的委托。
正如JosephH所建议的那样,根据你的应用程序的工作方式,你可能需要考虑其他身份验证方法:我会看一下基于令牌的内容,比如OAuth,它有ready-made libraries供人们使用
SQLite完全适用于Feed缓存,虽然我更喜欢NSCoding,因此您可以冻结自定义数据结构。
作为一般建议,请确保花费大量时间考虑每个用例和角落的连接:很容易假设用户只会以某种方式和某些时间联系服务器,然后在您之后投入多任务处理/来电/锁定屏幕/内存警告,事情可能会变得毛茸茸而没有任何计划。
总而言之,您似乎走在了正确的轨道上,只是确保您事先计划好一切:)
答案 2 :(得分:3)
Apple有一个全新的深度示例代码 - MVCNetworking,它深入展示了如何使用NSHTTPRequests和NSOperationQueues的子类。
答案 3 :(得分:2)
正如其他人所说,我认为你正在提出正确的问题,并正朝着正确的方向前进。以上所有回复都是有价值的建议。这是我的建议,我希望你会发现它很有用。
无论您选择哪种方法/库与您的网络服务进行交流,我认为在您在手机VS上设计数据模型的方式进行清晰分离非常重要。 Web应用程序中的数据模型。您的设计要记住3个主要区别:
Web应用程序上的数据模型(由您现有的mySQL数据库反映)
由于已经存在,所以没有太多可说的,除了它会对以下两个部分的设计产生很大的影响。我建议将此模型作为跨平台表示数据的“主参考”。
iPhone应用程序上的数据模型(反映在iPhone应用程序中需要显示的信息)
这就是乐趣的开始。首先,您需要很好地了解需要在手机应用中显示哪些数据。因此,首先要对您的应用程序进行良好的高级设计(使用笔和纸,绘制每个视图的模型以及它们之间的交互,在视图控制器之间建模导航等)。了解视图控制器与您希望在应用程序中显示的各种数据之间的相互作用确实很有帮助。这将帮助您在手机上创建数据模型的要求。根据这些要求,将现有(Web)数据模型映射到适合您的iPhone应用程序的新模型。此新模型可能包含也可能不包含您的网络应用中的所有表格和字段。但是2个模型的一般表示应该非常相似(例如关系,数据类型等)
用于在上述2之间进行通信的数据模型(这是您的'数据交换协议')
如果您对上述数据进行了2次表示,则需要从一个“转换”到另一个,双向。设计您的数据交换协议尽可能简单紧凑。您不希望在无用信息上浪费字节,因为网络上的传输成本很高。 (作为旁注,您可能会想到稍后压缩传输的数据,但从一开始就拥有一个好的设计同样重要)。最好从一个协议开始,其中元数据与Web应用程序模型中的元数据相同(例如,相同的关系,表的名称,属性等)。但请记住,您只需序列化/反序列化您在上面第2点中列出的实体和关系。所以设计相应。如果需要,您的交换协议还可能包含会话令牌,身份验证信息,版本号或其他元数据。
请记住:您的数据交换协议将解除您的Web应用程序和iPhone应用程序模型的分离。我发现最好将它们分开,因为它们可能会随着时间的推移而发展。例如,iPhone上的数据模型可能会发展很多,特别是当您发现需要重新建模某些关系或添加/删除实体中的属性以提高应用程序响应能力或用户体验,导航时,或者其他什么。
因为这本身就是一个完整的问题,所以你需要在你的(JSON / XML /你选择的任何解析器)之上设计一个通用的序列化/反序列化机制,它足够灵活,可以维持潜力您的2个数据模型之间的差异。这些差异可能是:实体/属性/关系名称,主键标识符名称,数据类型,要忽略的属性以及列表继续。我肯定会在iPhone应用程序中实现一个序列化器/反序列化器实用程序类,由.plist配置文件支持,该文件包含您可能拥有的所有受支持的实体,关注点和别名。当然,每个模型对象都应该“知道”如何序列化,反序列化自身及其关系(即所需的对象图深度)。
最后一点,由于您最终会得到2个数据表示形式,因此您需要一种方法唯一地识别双方的对象。例如,考虑为需要交换的所有数据添加uuid
属性,或者使用任何其他适合您需求的方法。
我正在构建一个与您有类似要求的应用程序,这些是我发现目前为止最好的方法。此外,你可能会发现这个视频很有用(它激发了我很多关于如何实现我上面提到的一些问题,如果你使用的是CoreData,它会特别有趣):
http://itunes.apple.com/ca/podcast/linkedin-important-life-lessons/id384233225?i=85092597 (参见题为“LinkedIn:关于CoreData和GameKit的重要人生课程(2010年3月12日)”的讲座)
祝你好运!答案 4 :(得分:1)
这是一个相当广泛的问题,我认为无论如何你都会采取正确的方式,但我会尽力提出一些建议:
JSON,ASIHTTPRequest和PHP脚本的POST听起来是一个很好的方式。
如果数据不是真正敏感,我会在大部分时间使用http,并且仅对登录页面使用https,该登录页面设置cookie或返回您在后续请求中使用的“令牌”。 (对于3G连接,HTTPS可能相当慢,因为设置SSL连接的数据包数量高于普通TCP连接。)
您应该确保正确地将输入中的任何数据传递到PHP脚本到数据库,以避免任何SQL注入攻击 - 即。使用参数化SQL,不通过“SELECT * from users where username="+$_GET['username']
”创建SQL查询
答案 5 :(得分:0)
我会这样做,就像我已经完成了很多AJAX网页的事情。即:
让服务器端的URL将要传输的信息打包成XML格式。 (这可以通过CGI / PHP脚本或其他)。您在消息体中传输XML - 因此使用标准Web浏览器可以轻松地进行人工阅读和调试。
使用标准iPhone NSXMLParser方法从XML文档中解析出各个数据字段,并将其写回数据库。此方法适用于从URL 获取数据和在一次调用中解析它 - 如:
NSURL *xmlURL = [NSURL URLWithString:@"http://www.example.com/livefeed.cgi"]; NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];