[解決済み】iPhoneのCoreデータをWebサーバーと同期し、他のデバイスにプッシュする方法は?[クローズド]
質問
iPhoneアプリケーションに格納されたコアデータを、iPadやMacなど複数のデバイス間で同期させる方法を研究しています。iOSのCore Dataを利用するためのシンクフレームワークは、あまり多くありません。しかし、私は次のようなコンセプトを考えています。
- ローカルのコアデータストアに変更が加えられ、その変更が保存される。(a) デバイスがオンラインの場合、チェンジセットを送信したデバイスのデバイスIDを含めて、サーバーに送信しようとする。(b) チェンジセットがサーバーに到達しない場合、またはデバイスがオンラインでない場合、アプリはチェンジセットをオンラインになったときに送信するためにキューに追加します。
- クラウド上にあるサーバーは、受け取った特定の変更セットをマスターデータベースに統合します。
- クラウドサーバーで変更セット(または変更セットのキュー)がマージされた後、サーバーは何らかのポーリングシステムを使用して、サーバーに登録されている他のデバイスにそれらの変更セットをすべてプッシュします。(AppleのPushサービスを使おうと思ったのですが、コメントによるとどうやらこれは実行可能なシステムではないらしいです)。
何か凝ったことを考えなければならないのでしょうか?私は、以下のようなRESTフレームワークを調べました。 ObjectiveResource , コアリソース および RestfulCoreData . もちろん、これらはすべてRuby on Railsで動作しており、私はそれに縛られているわけではありませんが、手始めにはなります。私のソリューションに対する主な要件は以下の通りです。
- 変更はすべて、メインスレッドを一時停止することなくバックグラウンドで送信される必要があります。
- できるだけ少ない帯域幅を使用する必要があります。
いろいろと課題を考えてみました。
- 異なるデバイスにある異なるデータストアのオブジェクトIDがサーバー上に添付されていることを確認すること。つまり、オブジェクトIDとデバイスIDのテーブルを用意し、データベースに格納されているオブジェクトへの参照を通じて紐付けます。私はレコード(DatabaseId [このテーブルにユニーク], ObjectId [データベース全体のアイテムにユニーク], Datafield1, Datafield2)を持ち、ObjectIdフィールドは別のテーブル、AllObjectsを参照することになります。(ObjectId, DeviceId, DeviceObjectId)を参照します。そして、デバイスが変更セットをプッシュすると、デバイスIDとローカルデータストアのコアデータオブジェクトのobjectIdが渡されます。そして、クラウドサーバーはAllObjectsテーブルのobjectIdとデバイスIdを照合し、初期テーブルの中から変更するレコードを見つけます。
- すべての変更は、マージできるように、タイムスタンプが必要です。
- デバイスは、バッテリーをあまり消費することなく、サーバーをポーリングする必要があります。
- また、ローカルデバイスは、サーバーから変更を受信した場合/ときに、メモリに保持されているすべてのものを更新する必要があります。
他に何か見落としていることはありますか?これを可能にするためには、どのようなフレームワークを見ればよいのでしょうか?
どのように解決するのですか?
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 によって開発されたこのソフトウェアは非推奨となりました。
関連
-
[解決済み] ReadStreamから読み込もうとすると、エラーDomain=kCFErrorDomainCFNetwork Code=2を受信する。
-
[解決済み] NSComparisonResultとNSComparator - これらは何ですか?
-
録音と再生に AVFoundation フレームワークを使用する IOS (AVAudioSession、AVAudioRecorder、AVAudioPlayer)
-
[解決済み] NSData を String に変換しますか?
-
[解決済み】iPhoneのブラウザからlocalhostで動作するWebサイトにアクセスする方法
-
[解決済み】iPhoneのCoreデータをWebサーバーと同期し、他のデバイスにプッシュする方法は?[クローズド]
-
[解決済み】UIButtonのテキストと画像をimageEdgeInsetsとtitleEdgeInsetsで整列させる。
-
[解決済み】Interface BuilderにRGB値を入力する方法は?
-
[解決済み】Xcode 4 - 新規インストールしたMacintoshでプロファイルをプロビジョニングすると「Valid signing identity not found」エラーが発生する。
-
[解決済み】iOS 7でUITableViewのセパレータを修正する方法は?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スレッド1:EXC_BAD_ACCESS (code=1, address=0xf00000c)
-
[解決済み] ストーリーボードの警告:プロトタイプのテーブルセルは再利用可能な識別子を持つ必要がある
-
[解決済み] lPods 用のライブラリが見つかりません。
-
Cocoaposがエラーを報告 Podsプロジェクトを生成する Abort trap: 6
-
[解決済み] iOS 6のユーザーエージェントの文字列は何ですか?
-
[解決済み】iPhoneのブラウザからlocalhostで動作するWebサイトにアクセスする方法
-
[解決済み】2つのNSDatesを比較する方法。どちらがより新しいですか?
-
[解決済み】デバッグモードでこの実行ファイルに有効なプロビジョニングプロファイルが見つからない
-
[解決済み】iPhoneアプリでNSErrorを使用するにはどうすればよいですか?
-
[解決済み】iPhoneのUIViewとUILabelsのグラデーション【重複あり