1. ホーム
  2. iphone

[解決済み】iPhoneのCoreデータをWebサーバーと同期し、他のデバイスにプッシュする方法は?[クローズド]

2022-03-31 20:21:42

質問

iPhoneアプリケーションに格納されたコアデータを、iPadやMacなど複数のデバイス間で同期させる方法を研究しています。iOSのCore Dataを利用するためのシンクフレームワークは、あまり多くありません。しかし、私は次のようなコンセプトを考えています。

  1. ローカルのコアデータストアに変更が加えられ、その変更が保存される。(a) デバイスがオンラインの場合、チェンジセットを送信したデバイスのデバイスIDを含めて、サーバーに送信しようとする。(b) チェンジセットがサーバーに到達しない場合、またはデバイスがオンラインでない場合、アプリはチェンジセットをオンラインになったときに送信するためにキューに追加します。
  2. クラウド上にあるサーバーは、受け取った特定の変更セットをマスターデータベースに統合します。
  3. クラウドサーバーで変更セット(または変更セットのキュー)がマージされた後、サーバーは何らかのポーリングシステムを使用して、サーバーに登録されている他のデバイスにそれらの変更セットをすべてプッシュします。(AppleのPushサービスを使おうと思ったのですが、コメントによるとどうやらこれは実行可能なシステムではないらしいです)。

何か凝ったことを考えなければならないのでしょうか?私は、以下のようなRESTフレームワークを調べました。 ObjectiveResource , コアリソース および RestfulCoreData . もちろん、これらはすべて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. また、ローカルデバイスは、サーバーから変更を受信した場合/ときに、メモリに保持されているすべてのものを更新する必要があります。

他に何か見落としていることはありますか?これを可能にするためには、どのようなフレームワークを見ればよいのでしょうか?

どのように解決するのですか?

iPhone 2009カンファレンスでDan Groverが説明した同期戦略をよく読み、実行することをお勧めします。 こちら をpdfドキュメントとして提供します。

これは実行可能なソリューションであり、Chrisが説明したソリューションと重なり、実装はそれほど難しくありません(Danはこれをいくつかのアプリケーションで実装しました)。同期に関する詳細で理論的な議論については、Russ Cox(MIT)とWilliam Josephson(Princeton)による論文を参照してください。

ベクトル時間ペアによるファイル同期

のように、いくつかの明らかな修正を加えれば、コアデータにも同様に適用できます。これは、全体としてより堅牢で信頼性の高い同期戦略を提供しますが、正しく実装するためにはより多くの労力を必要とします。

EDIT

Groverのpdfファイルが使えなくなったようです(リンク切れ、2015年3月)。UPDATE: ウェイバックマシンでリンクが利用可能です。 こちら

というObjective-Cのフレームワークは ZSync iCloud がようやく正しいコアデータの同期をサポートしたようなので、Marcus Zarra によって開発されたこのソフトウェアは非推奨となりました。