在iOS应用之间同步数据,有什么好的解决方案?

17

我正在开发一个应用程序,其数据管理通过Core Data实现,并且我正在研究如何实现在两个不同设备之间同步数据的功能(甚至最终在iDevices和Mac之间同步)。

到目前为止,我还没有找到有趣或有用的东西,因此我向您寻求一个好的起点、指南或要遵循的模型。您是否曾经实现过这样的功能?

更新

我已经在这个问题上开始了一项赏金。在iOS上进行同步可能是一项困难的任务,但是,出现了很多提供设备到设备同步功能的应用程序。我的问题是:它们是如何实现的?最佳方法是什么?有哪些不同的解决方案?

更新 2

毫无疑问,这个问题肯定已经过时了,因为iCloud已经发布了将近一年的时间。我想让它保持活力,因为它可以在移动设备之间的数据同步方面提供有趣的见解。


你需要一个无线解决方案,还是在iDevice同步时进行同步是你想要的? - bshirley
如果可能的话,一种无线解决方案! - marzapower
只有两个设备的假设吗?还是可以有三个或更多用户/设备?任意数据是否可以被任何设备修改?当合并冲突出现时,您将如何解决它们? - bshirley
我知道在收集分布式数据库之间的数据时,合并是一个常见的问题。我想知道的是其他人是如何解决这个问题的。如果只是粗暴地合并,那就不能称之为“同步”。 - marzapower
1
合并问题不是通用解决方案,而是需要考虑您的领域。在Core Data中,它们处理不相交的编辑和冲突解决,如此处所定义Core Data编程指南:更改管理 - 一个常见的解决方案是“失败”,这是可取和可以接受的,因为这意味着同时存在重复编辑 - 离线/同步后的更改时间尺度=频繁失败。 - bshirley
显示剩余2条评论
4个回答

11
如果您想自己完成,这可能是一个非常好的但具有挑战性的练习。除了下面的苹果公司提供的框架之外,我不知道有任何第三方框架可以促进“iDevices”之间的P2P连接。如果您不想重新发明轮子,可以沿着这些方向进行一些研究。我回答的是基于我的(少量)经验通过应用服务器实现同步服务 - 原则上使用P2P方法应该是更或多或少相同的。

第一步将是设计一个用于同步数据的协议。您可能需要自己回答以下问题:

  • 我需要了解哪些关于数据同步的内容?
  • 我想要同步Core Data模型的哪个部分?我是否需要更改当前的模型以便于同步?
  • 我将使用什么序列化/反序列化机制?
  • 如何能够在多个设备上唯一标识实体?
  • 我将如何版本化我的数据?我如何知道哪些实体需要进行同步?
  • 我需要能够还原同步操作吗?
  • 我将如何跟踪同步进度以及如何处理失败和异常情况?我如何通知用户这些情况?
  • 我更喜欢“逐步”同步(模型的一部分)还是“全局”同步(一次整个模型)?
  • 用户需要在设备之间进行多少次同步?
  • 是否有任何安全考虑?我需要加密吗?
  • 等等。

这只是皮毛。随着您的前进,您肯定会发现更多需要思考的事情。

接下来,确定你想要如何连接设备。你似乎更喜欢通过P2P的无线解决方案。为此,我建议你先查看以下工具:

根据你之前讨论的设计决策,选择你最舒适的工具,并且自己做出决定。我不能帮助你,因为我对它们都没有经验。就像Morpheus所说的:

我只能指引你门口,你必须自己走进去。

抱歉,开了个小玩笑 :)

最后,决定实现同步机制的解决方案。例如,你可以选择客户端-服务器模型(一个设备将监听连接,另一个设备将发起连接)。

更多相关文档:

我希望这能为您提供一个起点路径。

1
这个答案并没有“解决”问题,但是它将成为一个良好的同步技术规划的起点。 - marzapower

3

数据同步是非常棘手的。简单化的解决方案比没有解决方案更糟糕。

关于这个问题,如果你需要良好的精神指导,请去看看Things的作者们正在开发的云同步功能。我的希望是他们会发布一个同步API,使开发者能够实现同步服务。但即使他们将其保留给自己,他们也很好地展示了真正应对任务所需的内心探索。


好的,有很多应用程序具有“设备之间同步”的功能。我只想知道它们是如何实现的。Things 的作者可能会找到更好的解决方案,但他们是如何知道的? - marzapower
我认为他只是在警告你,要比所有关于“云”的炒作所假设的复杂程度更高一些。这就像日期和时间编程,一开始看起来很简单,但当你试图进行最小程度的自定义时,它会变得异常复杂。 - TechZen
我对复杂度没有特别的期望。我认为同步是一项困难的任务,哲学上来说甚至更是如此 :) 我不是在寻找一个简单的解决方案,而是在寻找一个解决方案。 - marzapower
顺便说一下,我现在不想在“云端”同步。我只想在设备之间同步。以后再考虑云、雨等问题。 - marzapower
具有设备同步功能的应用程序通常是简单的数据传输或暴力解决方案 - 在开始解决方案之前,需要提出和回答许多问题。 - bshirley

2
"Couchbase for iOS"也许能够满足您的需求。 https://github.com/couchbaselabs/iOS-Couchbase 根据自述文件:
Mobile Couchbase for iOS

Apache CouchDB on iOS provides a simple way to sync your application

data across devices and provide cloud backup of user data. Unlike other cloud solutions, the data is hosted on the device by Couchbase Mobile, so even when the network is down or slow (airplane, subway, backyard) the application is responsive to users.

What this means for you:

You can embed the rock solid distributed database, Mobile

Couchbase, on your iOS device. Your iOS apps can use Apache CouchDB's well-proven synchronization technology. If you <3 CouchApps, you can deploy them as iOS apps.


Tris 显然很有前途... 但我必须将现有的 Core Data 数据库迁移到这个新数据库,这有点可怕... - marzapower
1
Couchbase的问题在于它提供了一种在“云端”同步数据的方法,而不是点对点直接同步设备之间的数据的方法... - marzapower
2
@marzapower 它是一个分布式数据库,类似于 Git 作为数据库。因此,它不需要设备<->云,设备<->设备同样容易。它没有自动主机发现功能,但可以在应用程序中设置。 - theraven
URL已过期(请参见存储库说明),新URL:https://github.com/couchbaselabs/iOS-Couchbase-manifest - mAu

-1
我会从Apple API Sync Services开始,看看它是否符合您的需求。原则上,它可以让您在所有苹果设备和服务之间同步。

这项服务是否直接实现不同设备之间的同步?我的意思是,不需要使用计算机或云服务作为中介。 - marzapower
1
同步服务在iOS设备上不可用,所以对我来说是无用的。 - marzapower
传言称iSync及其基础服务将在Lion中被淘汰。 - Dan Ray

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