7

私のiPhoneアプリには、オンラインモードとオフラインモードの2つのモードがあります。ユーザーがアプリをオンライン モードで使用している場合、リクエストはすぐにサーバーに送信されます。ユーザーがアプリをオフライン モードで使用している場合、要求をローカルに保存して、インターネットが利用可能になったときにアップロードできるようにします。到達可能性クラスを使用して、インターネットの可用性を確認しています。到達可能性はアプリで正常に機能しています。次のシナリオを達成できません。ユーザーがオフラインモードで作業しているため、リクエストを保存しました。つまり、ユーザーはiPhoneのホームボタンをクリックしてアプリケーションをバックグラウンドでプッシュします。しばらくすると、ユーザーは自分のデバイスで Wi-Fi またはセルラー接続を有効にします。ユーザーがインターネット接続を有効にすると、バックグラウンドにあるアプリに通知が送信され、サーバーへのリクエストの送信が開始されます。この機能を実現するにはどうすればよいですか? 多くの iOS アプリで、この要件が同じである可能性があります。彼らはどのようにそれをやっていますか?何か案が?

これを達成するために次の手順を試みましたが、成功しませんでした。ここで間違っていることを教えてください。

1) applicationDidEnterBackground デリゲート メソッド内に kReachabilityChangedNotification のオブザーバーを追加しました。しかし、この方法では、私のアプリは Kreachabiliychaged 通知をリッスンできません。

2) applicationdidbecomeActive 内に kReachabilityChangedNotification のオブザーバーを追加すると、アプリは Kreachabiliychagednotification をリッスンできます。

アプリがバックグラウンドにあるときに IOS が Kreachabiliychagednotification をリッスンできないのはなぜですか?

4

2 に答える 2

4

答えは、アプリケーションがこれらの特定の用途のいずれかを持たない限り、できないということです (Apple doc を引用):

一部のタイプのバックグラウンド実行のサポートは、それらを使用するアプリによって事前に宣言する必要があります。アプリは、Info.plist ファイルを使用してサービスのサポートを宣言します。UIBackgroundModes キーを Info.plist ファイルに追加し、その値を次の文字列の 1 つ以上を含む配列に設定します。

*audio - アプリは、バックグラウンドでユーザーに可聴コンテンツを再生します。(このコンテンツには、AirPlay を使用したスト​​リーミング オーディオまたはビデオ コンテンツが含まれます)

*voip - このアプリは、ユーザーがインターネット接続を使用して電話をかける機能を提供します。
*newsstand-content - このアプリは、バックグラウンドで雑誌や新聞のコンテンツをダウンロードして処理する Newsstand アプリです。
*external-accessory - アプリは、外部アクセサリ フレームワークを通じて定期的に更新を配信する必要があるハードウェア アクセサリで動作します。
*bluetooth-central - アプリは、コア Bluetooth フレームワークを通じて定期的に更新を配信する必要がある Bluetooth アクセサリと連携します。
*bluetooth-peripheral - アプリは、コア Bluetooth フレームワークを介してペリフェラル モードで Bluetooth 通信をサポートします。

再びフォアグラウンドに入って到達可能性を確認することしかできません。

于 2013-08-07T06:46:46.457 に答える
1

私はプロジェクトに参加していたときに同じシナリオを処理するようになりましたが、デフォルトではバックグラウンド状態のアプリは短時間しか留まらず、ほとんどのアプリはその後すぐに一時停止状態に移行することを知りました。つまり、アプリはバックグラウンドにありますが、コードを実行していません。したがって、カスタム実装の通知は機能しません。アプリのデリゲート メソッドで、ウェイクアップ時に NetworkReachability を再クエリする必要があります。

applicationWillEnterForeground:
applicationDidBecomeActive 

これは私がその問題を処理するために行った最善の方法でした。

于 2013-08-07T06:45:06.260 に答える