2009-03-27 6 views
27

私はオンラインのようにオフラインでも動作するアプリケーションを構築しています。アプリケーションはオフラインの間にサーバーと通信できないため、何らかのレベルの同期が必要です。iPhoneのオフラインアプリケーション(同期あり)

あなたのiPhone用の同期を使ってオフライン操作を計画するときに、読んで考えてみるとよいツールはありますか?

アップルがこの特定の問題を解決するために提供しているツールと比べて、自分で作成しなければならないツールは何ですか?

+3

、と私は併合するための戦略について聞いてみたいことを追加します。ここではhttp://openmobster.googlecode.com

は、iPhoneアプリの同期へのリンクです同期外れデータ​​。同期のためにサーバーに連絡するのは簡単です。難しい部分は、サーバーデータをローカルデータと結合する方法を理解することです。 – Alex

答えて

14

の両方をオンラインに依存しているアプリケーションストア上のアプリケーションと同様にオフラインデータ

の多くは、あなたが本当にやるべきことは、あなたのように、静かに実行するバックグラウンドスレッドを(実行し、あなたのアプリケーションの起動時にですがありますユーザーは何の遅延も見ません)。このスレッドはサーバーから最新のデータをダウンロードしてローカルデータベースにプッシュします(sqliteが最良の選択です)

最後のダウンロード以降に実際に変更されたデータのみをダウンロードするようにデータのバージョン管理を実装するようにしてください - そうしないと、(アプリの要件に応じて)非常に大きなデータセットを不必要にダウンロードすることになります。

また、これを行うときにインターネット接続をテストすることを確認してください。インターネットが利用できない場合は、ユーザーに確実に警告してください。

この方法で、あなたは両方の世界のベストを得ることができます。ユーザーがローカルのsqliteデータであなたのアプリを引き続き使用できる場合

iphone os 3.0 appleは、プッシュサービスを導入しました。ここでは単に "プル"を行う代わりにデータをプッシュすることができますが、これは利用できません現在のiPhone OS(2.xx)の

+0

複数のデバイスの場合、マスターとマスターの複製の必要性が生じます。競合がないかどうかを確認してください。新しいレコードのID衝突を避けるためにGUIDの使用を検討してください。 – jchook

2

SQLiteデータベースにオフラインで収集したすべての情報を保存します。その後、ユーザーの要求に応じて、HTTPまたはカスタムTCP/IPプロトコルを使用してサーバーに格納されているすべての情報を同期させることができます。

私はこのアプローチをPalm OSアプリケーションでほぼ10年間使用しており、非常に効果的です。

私が知る限り、あなたがこれを達成しなければならない唯一の "ツール"は、ココアタッチを持つ普通の古いOBJECTIVE-Cです。独自のプロトコルを実装しようと思えば、あなたの人生を楽にするTCP/IP C++ライブラリを使用することもできますが、

+0

「Objective-C」を過度に大文字にしないでください。 –

4

プッシュできるデータ量は非常に少なく、基本的には「アプリケーションにサーバー呼び出しを依頼する」と返されるため、プッシュはおそらく実行可能なオプションではありません。私たちはSatchelでオンライン/オフラインモデルを使用します。サーバーと通信する必要があるときはいつでも、その通信(URLと場合によってはPOSTデータ)をバンドルしてデータベースに格納します。私たちがオンラインの場合は、すぐに取り出して送信し、有効な応答が返ってきたら、そのレコードをデータベースから削除します。私たちがオフラインの場合、それらの行が蓄積され、次にオンラインになると、それらが送信されます。これはすべての状況で実行可能なモデルではありませんが、ほとんどの人に適応できます。

3.0では、素晴らしいデータ管理ツールであるCoreDataにアクセスできます。それ以外のNSURLXXXファミリーはあなたの友人です。

3

http://blog.webscale.co.in/?p=159この記事では、オフライン/オンラインデータ同期を処理する方法について説明します。独自のフレームワークを作成したい場合は、あなたを助けることができます。

+1

ページが見つかりません –

16

私は過去2ヶ月ほどこの正確な動作を処理するアプリを開発しています。これには、オンラインのみの機能の小さなサブセットとオフライン/オンラインの大きな機能セットがあります。

ここでは、sqlitepersistentobjectsライブラリの修正版で提案されているように、ローカルストレージ用にsqliteを使用しています。 sqlitepersistentobjectsの基本バージョンはスレッドセーフではありませんので、使用している場合は注意してください。 (スレッドセーフである代わりにobjectivesyncのobjectiverecordをチェックしてください。しかし、コードを掘り下げる準備はできています)。 3.0 sdkを開発したいなら、コアデータはsqliteライブラリの別の可能性です。

アーキテクチャ全体がシンプルで、レールアプリケーションとREST APIに対してobjective resourceを使ってsqliteとリモート操作を使用してローカルストレージをモデル化しました。データのシリアル化にはxmlまたはjsonを使用できます。

オブジェクトがローカルで変更されると、変更はまずそのオブジェクトのsqliteデータベースレコードに保存され、ローカルのsqliteデータベースにもシリアル化されて保存されたキューに追加されます。

使用可能な接続がある場合、キューに入れられたローカルの変更はすべてデシリアライズされ、NSOperationQueueに追加されてバックグラウンドで処理されます。

これをすべて動作させるために、NSOperationをサブクラス化してリモートキュー操作のいくつかのタイプをサポートできるようにしました。つまり、リモートリクエストを行う目的のリソースを基本的に使用して作成、更新、削除します。

NSOperationQueueとNSOperationを使用することについての素晴らしい点は、それらがあなたのためにバックグラウンドスレッディングを処理するということです。そのようなクラスのapple docsとAppleのthreading guideをよく見ることをお勧めします。

アプリケーションがロードされると、バックグラウンドでリモートチェックが行われ、最新のデータをプルダウンする処理が行われますが、正直言ってこの動作が少し変わっています。

これまで対処しなければならなかったことの簡単な概要です...少し助けてくれることを願っています。

1

Sync Frameworkを使用して同期を管理することを検討したことがありますか?興味のある方は、OpenMobsterのSyncサービスであるオープンソースプロジェクトをご覧ください。あなたはそれに加えて

  • 双方向
  • 片道クライアント
  • 一方向デバイスに
  • 起動時

を次の同期の操作を行うことができ、すべての変更が自動的に追跡され、同期されていますクラウドとネットワーク接続が切断されると、あなたのアプリケーションをオフラインにすることができます。変更があれば追跡し、バックグラウンドで自動的にクラウドと同期させます。また、複数のデバイス間でiCloudのような同期を提供します

また、クラウドの変更はプッシュ通知を使用して同期されるため、データはローカルに保存されていても常に最新です。ここで

は、オープンソースプロジェクトへのリンクです:私は2番目のこの質問http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

関連する問題