28

オンラインと同じようにオフラインでも機能するアプリケーションの構築を検討しています。オフライン中はアプリケーションがサーバーと通信できないため、ある程度の同期が必要です。

iPhone の同期を伴うオフライン操作を計画する際に、読んで考え始めるとよいツールは何ですか?

この特定の問題を解決するために Apple が既に提供しているツールに対して、自分で作成する必要があるツールは何ですか?

4

5 に答える 5

16

私はこの2か月ほどの間、この正確な動作を処理するアプリに取り組んできました。オンラインのみの機能の小さなサブセットと、オフライン/オンラインの機能の大規模なセットがあります。

sqlitepersistentobjectsライブラリの修正バージョンでここで提案されているように、ローカルストレージにsqliteを使用しています。sqlitepersistentobjectsのベースバージョンはスレッドセーフではないため、使用している場合は注意してください。(objectiverecord in:objectivesyncでスレッドセーフな代替手段を確認してください。ただし、コードを掘り下げる準備をしてください)。3.0 sdk用に開発する場合は、コアデータがsqliteライブラリのもう1つの可能性です。

全体的なアーキテクチャは非常にシンプルで、sqliteを使用してローカルストレージをモデル化し、RailsアプリとRESTAPIに対して客観的なリソースを使用してリモートインタラクションをモデル化しました。データのシリアル化にはxmlまたはjsonのいずれかを使用できます。

オブジェクトがローカルで変更されると、変更は最初にそのオブジェクトのsqliteデータベースレコードに保存され、次にシリアル化されてローカルsqliteデータベースにも保存されるキューに追加されます。(その後、キューはいつでも処理できます)

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

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

NSOperationQueueとNSOperationを使用することの良い点は、バックグラウンドスレッドを処理することです。そのため、これらのクラスのアップルドキュメントとアップルスレッドガイドを参照することを強くお勧めします。

アプリケーションがロードされると、バックグラウンドで実行および処理されて最新のデータを取得するためのリモートチェックが少し行われます。正直なところ、これが少し動作する方法を変更しています。

これは私がこれまでに対処しなければならなかったことの簡単な概要です...それが少し役立つことを願っています。

于 2009-04-13T21:03:27.650 に答える
14

アプリストアには、オンラインとオフラインの両方のデータに依存するアプリケーションがたくさんあります

実際に行うべきことは、アプリの開始時にバックグラウンド スレッドを実行することです (これはサイレントに実行されるため、ユーザーに遅延が発生することはありません)。このスレッドは、サーバーから最新のデータをダウンロードし、ローカル データベースにプッシュします (sqlite が最適です)。

アプリが最後のダウンロード以降に実際に変更されたデータのみをダウンロードするように、ある種のデータのバージョン管理を実装していることを確認してください。そうしないと、データセット全体を不必要にダウンロードすることになり、非常に巨大になる可能性があります (アプリの要件によって異なります)。

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

このようにして、両方の長所を最大限に活用できます。ユーザーはインターネットから離れていても、ローカルの sqlite データでアプリを使用できます

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

于 2009-03-27T12:34:04.210 に答える
4

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

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

于 2009-04-13T02:12:39.320 に答える
2

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

私はこのアプローチを Palm OS アプリケーションで 10 年近く使用してきましたが、非常に効果的に機能しています。

私の知る限り、これを達成するために必要な唯一の「ツール」は、Cocoa Touch を使用した昔ながらの OBJECTIVE-C だけです。ただし、独自のプロトコルを実装することを決定した場合に便利な TCP/IP C++ ライブラリを使用することもできます。

于 2009-03-27T02:59:52.237 に答える
1

同期フレームワークを使用して同期を管理することを検討したことがあるかどうか疑問に思います。興味がある場合は、オープン ソース プロジェクトである OpenMobster の Sync サービスを参照してください。次の同期操作を実行できます

  • 双方向
  • 一方向クライアント
  • 一方向装置
  • 起動する

それに加えて、すべての変更は自動的に追跡され、クラウドと同期されます。ネットワーク接続がダウンしている場合、アプリをオフラインにすることができます。変更を追跡し、接続が戻ったときにバックグラウンドで自動的にクラウドと同期します。また、複数のデバイス間で iCloud のような同期も提供します

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

オープン ソース プロジェクトへのリンクは次のとおりです: http://openmobster.googlecode.com

iPhone App Sync へのリンクは次のとおりです: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

于 2012-03-18T17:56:29.543 に答える