iPhone离线应用程序与同步

28

我正在考虑构建一款离线和在线都同样有效的应用程序。由于在离线状态下应用无法与服务器进行通信,因此需要进行某种程度的同步。

在规划iPhone的离线操作和同步时,有哪些好的工具可供参考和思考?

创建自己的工具和使用苹果已经提供的工具来帮助解决这个问题,各需哪些工具?


3
我赞同这个问题,并补充说我想听听合并不同步数据的策略。与服务器联系以进行同步操作是一件轻而易举的事情,困难在于如何将服务器数据与本地数据相结合。 - Alex
5个回答

16
我过去两个月一直在开发一个处理这种情况的应用程序。它有一小部分功能只能在线使用,还有一大部分功能既可以在线又可以离线使用。
我正在使用sqlite作为本地存储,建议使用sqlitepersistentobjects库的修改版本。由于基本版的sqlitepersistentobjects不是线程安全的,所以如果你使用它,请注意。 (如果需要线程安全的替代方案,可以查看objectiverecord: objectivesync, 但要准备好深入了解代码)。如果您愿意为3.0 sdk开发,则core data是另一个可能的sqlite库选择。
整体架构很简单,我使用sqlite对本地存储进行建模,并使用objective resource与rails应用和REST API进行远程交互。它可以使用xml或json进行数据序列化。
当本地对象被修改时,更改首先保存到该对象的sqlite数据库记录中,然后添加到队列中,该队列会被序列化并存储在本地sqlite数据库中。(然后可以随时处理队列)
如果有可用的连接,则会将任何排队的本地更改反序列化并添加到一个NSOperationQueue中,在后台处理它们。
为了使所有这些工作正常运行,我对NSOperation进行了子类化,以支持几种类型的远程队列操作-创建、更新、删除,主要使用objective resource进行远程请求。
使用NSOperationQueue和NSOperation的好处是,它们为您处理了后台线程,因此强烈建议您查看苹果文档中有关这些类的信息,同时还可以参考苹果的多线程指南
应用程序加载时会进行一些远程检查,并在后台进行处理以获取最新数据 - 虽然老实说我仍在改变这个行为的方式。

这是我目前需要处理的问题的简要概述... 希望能对您有所帮助。


14

App store上有许多应用程序同时依赖于在线和离线数据

在您的应用程序启动时,您应该运行一个后台线程(静默运行,使用户永远看不到任何延迟)。此线程从服务器下载最新数据并将其推入本地数据库(SQLite是最佳选择)

确保实现某种数据版本控制,以便您的应用程序仅下载自上次下载以来实际发生更改的数据-否则,您将不必要地下载整个数据集,数据集可能相当巨大(取决于您的应用程序要求)

在执行此操作时还要确保测试网络连接性。如果没有网络连接,请务必通知用户

这样您可以同时获得最佳效果。当用户离开互联网时,他们仍然可以使用带有本地sqlite数据的应用程序

在iPhone os 3.0中,苹果引入了推送服务-您可以简单地“PUSH”您的数据而不是进行“PULL”,但这在当前的iPhone OS(2.x.x)中不可用


在多设备的情况下,您最终需要进行主-主复制。确保考虑到冲突。考虑使用GUID来避免新记录上的ID冲突。 - jchook

4
推送可能不是可行的选择,因为你可以推送的数据量很小,并且基本上归结为“告诉我的应用程序去调用服务器”。在 Satchel 中,我们使用在线/离线模型。每当我们必须与服务器通信时,我们捆绑该通信(一个 URL 和可能一些 POST 数据),并将其存储到数据库中。如果我们在线,我们会立即将其取回、发送出去,当我们收到有效的响应后,从数据库中删除该记录。如果我们离线,这些行会积累起来,下次我们在线时,它们会被发送出去。这不是所有情况下都适用的可行模型,但可以适应大多数情况。
在 3.0 版本中,你可以访问 CoreData,这是一个很棒的数据管理工具。除此之外,NSURLXXX 系列是你的好帮手。

2

我会将离线收集的所有信息存储在SQLite数据库中。然后,在用户请求时,您可以使用HTTP或自定义TCP/IP协议将所有存储的信息与服务器同步。

我已经在Palm OS应用程序中使用这种方法将近10年了,并且它们非常有效。

据我所知,实现此目的唯一的工具就是使用Cocoa Touch的纯粹的OBJECTIVE-C。虽然如果您决定实现自己的协议,可以使用一些TCP/IP C++库来使生活更加轻松。


请不要过度大写“Objective-C”。 - Jonathan Sterling

1

不知道您是否考虑使用同步框架来管理同步。如果您感兴趣,可以看看开源项目OpenMobster的同步服务。您可以执行以下同步操作:

  • 双向
  • 单向客户端
  • 单向设备
  • 启动

此外,所有修改都会自动跟踪并与云同步。当网络连接断开时,您可以将应用程序离线。它会跟踪任何更改,并在连接恢复时自动在后台将其与云同步。它还提供了像iCloud一样跨多个设备的同步。

此外,云中的修改使用推送通知进行同步,因此即使数据存储在本地,数据始终是最新的。

这是开源项目的链接:http://openmobster.googlecode.com

这是iPhone应用程序同步的链接:http://code.google.com/p/openmobster/wiki/iPhoneSyncApp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接