8

私は、ユーザーのデータ入力をサーバーにアップロードする iOS アプリ (社外で構築される) を仕様化しています。デバイスがインターネットに接続されていない場合、デバイスにデータを保存し、ネットワークが再接続されたときにアップロードしたいと考えています。(このアプリは主に、ほとんどの場合切断される iPod Touch デバイスで実行されます)。

ユーザーがデバイスのロックを解除し、ネットワークが再接続された後にアプリを再度開いた場合、アプリが実行されているため、サーバーへのアップロードは簡単です。

しかし、アプリが実行されていない場合はどうなるでしょうか。「実行されていない」とは、次の 1 つ以上を意味します。

  • デバイスの電源が入れ直されました
  • ユーザーはデバイスをロックし、ポケットに入れています
  • アプリがクラッシュしました
  • ユーザーがアプリを終了しました
  • ユーザーが他のアプリの使用を開始したため、アプリがフォアグラウンドで実行されなくなった
  • 他のケースはありますか?

上記の場合、インターネット接続が回復した直後にローカル データがアップロードされるようにする方法 (理想的にはバッテリー効率の良い方法) はありますか? 上記のどのケースが原因でアプリが実行されないかによって、答えは異なりますか?

また、アプリが実行されていないときに上記の実行されていないケースの一部 (またはすべて) を引き続きアップロードできるようにするために、デバイスに必要な iOS の最小バージョンはありますか?

これらが明らかな初心者の質問である場合は、申し訳ありません。私は iOS の専門家ではありません。

4

4 に答える 4

7

InstapaperNews.me (この手法のパイオニア)などで使用されている興味深い手法があり、領域監視を使用してバックグラウンドでのダウンロードまたはアップロードを開始します。Marco (Instapaper) はブログを書き ( Build and Analyze podcast のエピソード 80 で)、Apple とのコミュニケーションについて語ったので、App Store で許可されるはずです。


手短に言えば、「自宅」や「職場」などの特定の地域 (ジオフェンス) を設定し、locationManager:didEnterRegion:(および同様の) コールバックに応答するというテクニックです。事前に指定されたリージョンに入ると、アプリがバックグラウンドから起動し、アップロードするデータがあるかどうかを確認できます。

この手法は、ネットワークが再接続されたときにデータがアップロードされることを保証するものではありませんが、iPod Touch ユーザーが WiFi ネットワークに帰宅したときに、アプリが自動的に情報をアップロードできるようにします。

それはおそらく、少なくとも 1 日に 1 回である必要があります。最初のアップロードが試行されたときにタイムスタンプを追加し、サーバー上でイベント (データ エントリ) の正しい順序を取得することに成功したら、アップロードに沿ってそれを送信できます。

于 2012-09-05T13:43:26.783 に答える
3

これを確実にする方法はありません。アプリケーションが「実行されていない」場合 (質問で説明されている定義による)、デバイスのネットワーク ステータスの変化に応答することはできません。次回アプリケーションを再度実行したときにアップロード操作を再開するように設定する必要があります。

EDIT:あなたが説明したいくつかのケースは、あなたのアプリケーションに実際に異なる機会を提供するかもしれません. 具体的には、ユーザーがホーム ボタンを押してアプリを「終了」するか、フォアグラウンドで別のアプリを起動した場合、アプリケーションは引き続きバックグラウンドで実行され、ネットワークの到達可能性の変化に応答する可能性があります。

バックグラウンドで行われる可能性のある処理の性質とその期間は十分に文書化されており、マルチタスクをサポートする iOS のすべてのバージョンでサポートされています。アプリの状態とバックグラウンド サービスに関するドキュメントを確認することをお勧めします。

于 2012-09-05T03:19:00.267 に答える
1
  • デバイスの電源が入れ直されました -->アプリを開かない限り、再開する方法は本当にありません!!!
  • ユーザーがデバイスをロックし、ポケットに入れています --> アプリの applicationStatus は UIApplicationStateInactive ですが、バックグラウンドで実行されています。通知や加速度計のイベントには引き続き対応できます。到達可能性クラスを試して、変更をログに記録してください!
  • アプリがクラッシュしました --> アプリを開かない限り、あり得ません
  • ユーザーがアプリを終了しました --> アプリはバックグラウンドで待機しています。そこには、アプリを完全に使用するための最大10分間の制限があります(アプリ「Pastebot」のように)
  • ユーザーが他のアプリの使用を開始したため、アプリがフォアグラウンドで実行されなくなった -->ユーザーがアプリを終了した場合と同じ

マルチタスキングについて、Apple は次のように述べています。

  • オーディオ バックグラウンド再生、VOIP (Skype など)、ナビゲーション アプリケーションなど、特定の種類の使用にのみ対応する真のマルチタスキング
  • 他のすべてのアプリは、特定のタスク (電子メール、SMS の送信、重要なデータのアップロード/ダウンロードなど) を完了するために、アプリが閉じられた後/バックグラウンドで特定の時間を要求できます。

開発ドキュメントからの重要な引用:

アプリ デリゲートのapplicationDidEnterBackground:メソッドには、タスクを終了して戻るのに約 5 秒かかります。実際には、このメソッドはできるだけ早く戻る必要があります。時間がなくなる前にメソッドが戻らない場合、アプリは強制終了され、メモリから消去されます。タスクの実行にさらに時間が必要な場合は、beginBackgroundTaskWithExpirationHandler:メソッドを呼び出してバックグラウンド実行時間を要求し、実行時間の長いタスクをセカンダリ スレッドで開始します。バックグラウンド タスクを開始するかどうかに関係なく、applicationDidEnterBackground: メソッドは 5 秒以内に終了する必要があります。

于 2012-09-05T13:12:36.293 に答える
1

Restful API を構築している場合は、 RestKitを使用することをお勧めします。これにはrequest queue、デバイスのネットワーク ステータスをチェックし、ネットワーク アクセスが保証されたらアップロードを開始する があります。詳細については、http: //mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/を参照してください。リクエスト キューとバックグラウンドでのダウンロード/アップロードに関するセクションをお読みください。RestKitに注意する必要があります。長所と短所がある大きなライブラリです。アプリが終了してもリクエストキューを保存する場合、このキューがアプリのライフサイクルでどのように機能するかは完全にはわかりません。あなたはそれを調査しなければならないでしょう。RestKit はバックグラウンドでのアップロード/ダウンロードをサポートしていますが、既に述べたように、アプリが終了し、バックグラウンド状態でない場合、アップロードを行うことは不可能だと思います。

API が Rest でない場合、RestKit の使用はお勧めしません。

https://github.com/RestKit/RestKitから RestKit をダウンロードして試すことができます。

于 2012-09-09T09:32:02.980 に答える