如何將iPhone Core Data與Web服務器同步,然後推送到其他設備?




ios core-data (6)

我一直在研究一種方法來同步多個設備(如iPad或Mac)之間存儲在iPhone應用程序中的核心數據。 iOS上的Core Data使用的同步框架並不多(如果有的話)。 但是,我一直在思考以下概念:

  1. 對本地核心數據存儲進行更改,並保存更改。 (a)如果設備處於聯機狀態,它會嘗試將更改集發送到服務器,包括發送更改集的設備的設備標識。 (b)如果變更集沒有到達服務器,或者設備不在線,應用程序會將變更集添加到隊列中,以便它在聯機時發送。
  2. 坐在雲中的服務器將它收到的特定變更集與其主數據庫合併。
  3. 在雲服務器上合併更改集(或更改集隊列)之後,服務器會使用某種輪詢系統將所有這些更改集推送到在服務器上註冊的其他設備。 (我以為使用Apple的Push服務,但顯然根據評論,這不是一個可行的系統。)

我需要考慮什麼幻想? 我查看了諸如ObjectiveResourceCore ResourceRestfulCoreData類的REST框架。 當然,這些都是與Ruby on Rails合作的,我並不打算這麼做,但它是一個開始的地方。 我對我的解決方案的主要要求是:

  1. 任何改變都應該在後台發送而不會暫停主線程。
  2. 它應該使用盡可能少的帶寬。

我曾考慮過一些挑戰:

  1. 確保服務器上連接了不同設備上不同數據存儲的對象ID。 也就是說,我將擁有一個對象ID和設備ID的表格,這些表格通過對存儲在數據庫中的對象的引用關聯起來。 我將有一個記錄(DatabaseId [對此表唯一的],ObjectId [對整個數據庫中的項唯一的],Datafield1,Datafield2),ObjectId字段將引用另一個表,AllObjects:(ObjectId,DeviceId,DeviceObjectId)。 然後,當設備推送更改集時,它將從本地數據存儲中的核心數據對像傳遞設備Id和objectId。 然後,我的雲服務器將檢查AllObjects表中的objectId和設備Id,並查找要在初始表中更改的記錄。
  2. 所有更改都應該有時間戳,以便它們可以合併。
  3. 該設備將不得不輪詢服務器,而不會消耗太多的電池。
  4. 如果/從服務器接收到更改,本地設備還需要更新內存中的任何內容。

還有什麼我在這裡失踪? 我應該考慮什麼樣的框架來實現這一點?


2017年

關於這個令人難以置信的老問題。

這很像問

“我想購買一部可以隨身攜帶的手機 - 但也可用於許多計算任務,甚至瀏覽WWW!”

顯然,對此的回答是, 如果你已經在火星上,最近在這個星球上實現的主要技術之一是“智能手機”,買一個。

現在,從零開始創建一個OCC系統就像從零開始創建一個SQL數據庫一樣瘋狂。

顯然,對於OCC來說,這是現在所有非平凡應用程序的基本範例

  • 火力地堡
  • PubNub
  • Couchbase

很簡單,是近幾年人類科技的重大進步

今天,你不會再從頭開始創建OCC

  • 編寫你自己的操作系統

  • 從頭編寫自己的SQL數據庫

  • 從頭開始編寫自己的字體渲染

請注意,事實上,從專業意義上講,你不能再成為“ios程序員”或“android程序員”。

誰在乎知道如何佈置表格和按鈕?

您是Firebase /任何專家,並且作為附帶的問題,您知道如何在iOS或Android上佈局按鈕等。

唯一的問題是,哪個BAAS使用 - 例如,如果它是面向遊戲的,可能是PlayFab,如果是真正的消息驅動,可能是PubNub,也許可以.abio.io,如果你是公司 - 也許是kinvey。



我剛剛發布了我的新Core Data Cloud Syncing API的第一個版本,即SynCloud。 SynCloud與iCloud有很多不同之處,因為它允許多用戶同步界面。 它與其他同步API也不同,因為它允許多表,關係數據。

請通過http://www.syncloudapi.com了解更多信息

使用iOS 6 SDK進行構建,截至2012年9月27日,它是最新的。


我建議您仔細閱讀並實施Dan Grover在iPhone 2009會議上討論的同步策略, here可以通過pdf文檔獲取。

這是一個可行的解決方案,並不難實現(Dan在其幾個應用程序中實現了這一點),重疊了Chris所描述的解決方案。 有關同步的深入理論討論,請參閱Russ Cox(MIT)和William Josephson(Princeton)的論文:

與矢量時間對的文件同步

它同樣適用於核心數據並做了一些明顯的修改。 這提供了一個整體上更加健壯和可靠的同步策略,但需要更多努力才能正確實施。

編輯:

看起來Grover的pdf文件已不再可用(鏈接斷開,2015年3月)。 更新:鏈接可通過Way Back Machine here

由於iCloud最終似乎支持正確的核心數據同步,因此被稱為ZSync並由Marcus Zarra開發的Objective-C框架已被棄用。


通知用戶通過推送通知更新數據。 在應用程序中使用後台線程來檢查本地數據和雲服務器上的數據,而在服務器上發生更改時,請更改本地數據,反之亦然。

所以我認為最難的部分是估計哪一方無效的數據。

希望這可以幫助你


類似@Cris我已經實現了客戶端和服務器之間的同步類,並解決了迄今為止已知的所有問題(向/從服務器發送/接收數據,基於時間戳合併衝突,在不可靠的網絡條件中刪除重複條目,同步嵌套數據和文件等)。)

您只需告訴該類應該同步哪個實體和哪些列,以及您的服務器在哪裡。

M3Synchronization * syncEntity = [[M3Synchronization alloc] initForClass: @"Car"
                                                              andContext: context
                                                            andServerUrl: kWebsiteUrl
                                             andServerReceiverScriptName: kServerReceiverScript
                                              andServerFetcherScriptName: kServerFetcherScript
                                                    ansSyncedTableFields:@[@"licenceNumber", @"manufacturer", @"model"]
                                                    andUniqueTableFields:@[@"licenceNumber"]];


syncEntity.delegate = self; // delegate should implement onComplete and onError methods
syncEntity.additionalPostParamsDictionary = ... // add some POST params to authenticate current user

[syncEntity sync];

您可以在這裡找到源代碼,工作示例和更多說明: github.com/knagode/M3Synchronization





data-synchronization