2010-10-15 37 views
19

我计划我的第一个iPhone应用程序,我想获得一些投入就如何构建它,从一开始。 iPhone应用程序正在构建为与已经构建在PHP中的面向公众的Web应用程序配对。我应该如何构建我的iPhone应用程序来与我的网站交谈?

我希望网络平台是中心的(数据存放在mySQL数据库中),并让iPhone客户端与之通话并使用REST'ful方法执行网站的功能 (获取最新内容,发布内容,投票,账户管理为例)。

我想客户获得在SQLite数据库中的数据的本地副本,但刷新获取最新版本的饲料(类似于Twitter的应用程序)。

夫妇的想法我现在所拥有的:

  • 使用类似ASIHTTPRequest发送/收到的数据到PHP文件在服务器上侦听请求

  • JSON - 我会关闭以更好将GET/POSTS发送给返回JSON对象的PHP,并使用某种包装来处理数据并将更改传递给本地SQLite数据库?

  • 我完全掉在我应如何建设这件事与网络沟通? 有最佳做法吗?

我真的很感激任何关于如何设计这种设置的建议。

谢谢

编辑:再次阅读自己的文章后,我知道这听起来像一个Twitter客户端,但它不是,虽然它具有类似的功能/ Twitter的类型的设置结构。谢谢!

+0

这是所有用户的SQLite数据库相同吗?还是每个用户都特定?数据库/数据在初始复制和后期获取中会占用多少? – baalexander 2010-10-15 15:34:19

+0

SQLite数据库将托管本地化版本的提要,数据从中央mySQL数据库中提取。对于inital fetch,我想我可以控制我想要的大小,因为我可以设置多少个以前的feed项目,这些只是文本。 – barfoon 2010-10-15 15:43:58

+0

只是一个历史性的笔记。多年来,** ASIHTTPRequest **是iOS领域中最受欢迎,最好的iOS库的解决方案!不幸的是,这些日子已经不在我们身边了,但它是特别的。啊,回忆! – Fattie 2016-03-14 14:11:56

回答

17

正如你在你的计划,XML和REST已经概述是一个沟通的好方法Web应用程序。我想提出一些关于如何实际设计和构建它的细节,或者你应该记住的内容。

首先,我认为坚持使用MVC是很重要的。我见过人们在视图控制器中创建HTTP连接,控制器是NSXMLParser的委托,控制器包含成员变量中的数据。我甚至见过建立HTTP连接的UITableCells。不要这样做!

您的模型及其基本操作代码应尽可能从用户界面提取。由于您已经在Web应用程序中创建了模型,因此请尝试在iPhone项目中重新创建实体。不要害怕在实体类中使用一些简单的方法,但不要让它们使用外部资源,特别是TCP连接。作为实体类中的方法的一个例子,你可能有方法以特定的方式格式化数据(日期为例,或者返回姓氏作为名字和姓氏的连接),或者你甚至可以使用像- (void)update这样的方法作为包装器调用负责更新模型的类。

创建另一个类来更新模型 - 从web-app获取XML。甚至不要考虑使用同步连接,甚至不要使用专用线程。与委托的异步连接是要走的路。有时需要多个请求才能获取所有必需的数据。您可能想要创建某种状态机来保存关于您处于哪个下载阶段的信息,以及从一个阶段到另一个阶段的进度,如果发生错误,则跳至末尾,在某些时刻之后从失败阶段重新执行。

暂时将数据下载到某个地方,首先当您拥有了所有数据时,请进行切换并更新用户界面。这有助于启动应用程序时的响应 - 用户可以立即使用本地存储的数据,而更新机制正在下载新数据。

如果您需要下载大量文件,请尝试同时下载它们,前提是文件之间的依赖性允许。这包括为每个请求创建一个连接,可能为每个请求实例。你当然可以只有一个委托实例用于所有这些连接,但是跟踪数据会变得更加复杂。同时下载可能会大大减少延迟,使用户的机制更快。

要节省时间和带宽,请考虑使用HTTP的If-Modified-Since和/或ETag标头。请记住上次请求数据时的时间或标记,并在下次使用HTTP标题发送时。如果内容尚未更改,则您的网络应用程序应返回HTTP代码304。 iPhone应用程序应在connection:didReceiveResponse:中对此代码做出相应反应。

创建一个专用类解析XML和更新模型。你可以使用NSXMLParser,但如果你的文件不是很大,我强烈建议使用TouchXML,它很高兴使用XML作为文档(它也支持XPath),而不是基于事件的API。您也可以在下载文件时使用此解析器来检查其有效性 - 如果解析失败,请重新下载。那时专用的解析类很方便。

如果你的数据集不是很大,如果你不需要在iPhone上永久保存下载的数据,你可能不需要将它们存储在SQLite数据库中,你可以简单地将它们存储为XML格式 - 只需简单的缓存。这至少可能是一个Twitter应用程序的方式。它变得更容易,但对于更大的数据集,XML消耗大量内存和处理能力 - 在这种情况下,SQLite更好。

我建议使用核心数据,但你提到这是你的第一个iPhone应用程序,所以我建议你不要使用它。然而。

不要忘了多任务处理 - 你的应用程序可以去下载过程中睡觉,你需要取消连接,并清理你的更新机制。在应用程序唤醒时,您可能需要恢复更新。

关于应用程序的视图部分 - 使用界面生成器。一开始可能会很痛苦,但从长远来看,这是值得的。

视图控制器是模型和视图之间的粘合剂。不要在那里存储数据。考虑在什么地方实施什么,以及谁应该叫它。

这与应用程序的体系结构无关,但我想提醒一下,Objective-C是非常富有表现力的语言。代码应该看起来很像一个句子。通过协议扩展课程。作为一个例子,有一天我需要一个字符串的第一行。当然,你可以在第一次出现新行的地方写一行,并从头到尾得到一个子字符串。但它看起来不正确。我已将- (NSString*)firstLine添加到我的NSString协议中。代码看起来好多了,它不需要任何评论。

有很多事情在这两个架构和设计任何项目的考虑,他们都应该齐头并进。如果有人给对方造成麻烦,你需要适应。没有什么是写在石头上的。

0

就像我已经用了很多AJAX网页做的东西我会做到这一点。即:

  1. 在你的服务器端有一个URL将要传输的信息打包成XML格式。 (这可以通过CGI/PHP脚本或其他)。您在消息体中传输XML - 因此使用标准Web浏览器进行人工读取和调试非常容易。

  2. 使用标准的iPhone NSXMLParser方法从XML文档中解析出各个数据字段,并将其写回到数据库中。这种方法是装备既从URL 解析它取一个通话中的数据 - 这样的:

NSURL *xmlURL = [NSURL URLWithString:@"http://www.example.com/livefeed.cgi"]; 
NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
  1. 漫步与的NSXMLParser方法和填充数据层次相应的数据库。
+1

请注意,[NSXMLParser alloc] initWithContentsOfURL:xmlURL是一个同步调用,在获取数据之前会阻塞 - 您可能不希望从主线程执行此操作,因为如果服务器的应用程序看起来完全冻结回应缓慢。 – JosephH 2010-10-18 15:52:50

1

这是一个很广泛的问题,我想你在正确的道路要去反正,但是我会尽我所能给出一些建议:

JSON,ASIHTTPRequest并发布到PHP脚本声音就像一个伟大的路要走。

如果数据不是非常敏感,我会在大部分时间使用http,并且仅对登录页面使用https,该页面可以设置cookie或返回在后续请求中使用的“标记”。 (HTTPS在3G连接上可能非常慢,因为在设置SSL连接的数据包数量方面的开销高于普通TCP连接。)

您应该确保将输入中的任何数据正确传递给PHP脚本到数据库,以避免任何SQL注入攻击 - 即。使用参数化SQL,不要通过做“sql”查询“SELECT * from users where username="+$_GET['username']

3

我目前正在开发一个类似于您的应用程序。我还建议使用ASIHTTPRequest,并且可能像TouchJSON用于JSON解析,或者如果要解析XML,则可以扩展/制作NSXMLParser的委托。

正如JosephH所建议的那样,根据您的应用程序的工作方式,您可能需要考虑其他身份验证方法:我会查看一些基于令牌的OAuth(其中有ready-made libraries供人们深入研究)。

虽然我更喜欢NSCoding,所以您可以冻结您的自定义数据结构,但SQLite对于提要缓存完全可行。

作为一般性建议,请务必花费大量时间思考每个用例和连接情况:很容易假定用户只会以某些方式在特定时间与服务器联系,然后在你在多任务/来电/锁定屏幕/内存警告中投掷,事情可能会变得毛茸茸的,没有任何计划。

总而言之,你似乎是在正确的轨道上,只要确保你计划了一切事先:)

3

Apple拥有全新的深度示例代码 - MVCNetworking,深入展示了如何使用NSHTTPRequests和NSOperationQueues的子类。

2

正如其他人提到的那样,我认为您提出了正确的问题,并且正朝着正确的方向前进。以上所有回复都是有价值的建议。这是我的建议,我希望你会觉得它有用。

无论您选择与您的Web服务对话哪种方法/库,我认为重要的是要以您在手机上设计数据模型的方式进行干净的分离。 Web应用程序中的数据模型。你有3间主要的区别要记住为您的设计:在Web应用程序

  1. 数据模型(由现有的MySQL数据库反映)

    因为这是已经存在,没有什么好说的关于它,除了它会影响你的设计以下2部分。我建议将此模型作为您的数据如何跨平台表示的“主要参考”。在iPhone上的应用程序(由你需要在iPhone应用程序中显示的信息反映)

    这是有趣的开始

  2. 数据模型。首先,您需要充分了解您需要在手机应用中显示的数据。因此,首先应该有一个好的,高层次的应用程序设计(使用笔和纸,绘制每个视图的模型以及它们之间的交互,模拟视图控制器之间的导航等)。它真的有助于理解视图控制器与您想要在应用程序中显示的各种数据的交互。这将帮助您在手机上创建数据模型的要求。根据这些要求,将现有(网络)数据模型映射到适合您的iPhone应用程序的新模型。这个新模型可能包含或不包含您的Web应用程序中找到的所有表格和字段。但2种型号的一般表示形式应该是非常相似的(例如关系,数据类型等)

  3. 数据模型中使用上面的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日)”)

祝你好运!

相关问题