2015-01-06 32 views
6

ここに入力を希望します。iOS CoreBluetooth:状態の保存と復元

現在のiOSプロジェクトでは、CoreBluetoothを迅速に使用しています。このアプリは基本的に動作するバックグラウンドでCoreBluetoothを使って通信することができます。周辺機器は、期待どおりに動作するために、iOSデバイスとのアクティブな接続が必要です。接続が切断されるたびに、周辺機器は現在の動作を停止します。これはメモリ圧のためにアプリが終了したときにも発生します。その場合、周辺機器は動作を停止すべきではないので、問題があります。それを解決するために、私は基本的に述べている状態の保存および復元バックグラウンドモードを実装するapples core bluetooth programming guideを続い:

  1. は復元識別子とCentralManagerを初期化します。デリゲート=自己。
  2. willRestoreStateデリゲートメソッドを実装します。 NSLogの内容
  3. launchOptionsで特別なキーを確認します。 NSLogの何か。

私はこの共通のプロジェクトを使用してiOSにバックグラウンドでのアプリケーションを閉じるように強制します:BackgroundKill。もちろん、アプリケーションはデバッグモードでは実行されていないため、重要なポイントにNSLogステートメントを追加してデバイスコンソールで検索します。良いニュース:アプリが終了したときに接続がもうキャンセルされないため、iOSは接続を維持して周辺機器が動作を停止しないように動作しています。ストライク!この時間中は、アプリが購読しているバッテリーサービスを除き、中央と周辺機器との間に通信はありません。アクティブな接続を確立する唯一の理由は、周辺機器の動作を停止することです。

ここで手動でアプリを再起動すると、上記のNSLogが表示されません。 willRestoreStateデリゲートは呼び出されず、launchOptionsはnilになりません。 CentralManagerをインスタンス化するときに、 "DISPATCH_QUEUE_CONCURRENT"というキューをnilの代わりに使用しようとしました。効果なし。

アプリケーションを再起動するとき、保存された接続をどのように使用する必要がありますか? willRestoreStateデリゲートが呼び出されないのはなぜですか?私はここに何かを逃していますか状態の保存と復旧を使用するためには、バックグラウンドでデータを受信し/強制的にシステムによって強制的にデータを受信することは必須ですか?

ありがとうございます。 :)

+0

あなたのアプリがバックグラウンドで復元された直後にwillRestoreStateを呼び出す必要があります。アイコンの後にアプリを起動すると、すでに実行されているので何も特別なことはない可能性があります。また、ドキュメントによれば、復元するものがない場合は、willRestoreStateの代わりにdidUpdateStateメソッドが最初に呼び出されます。 – KoCMoHaBTa

答えて

8

最終的にいくつかのテストを行い、結果を得ました。 にはが必要なときにアプリがバックグラウンドで起動することが判明しました。これは、周辺機器が保存された接続でデータを送信するときはいつでもを意味します。この場合、iOSはdidFinishLaunchingWithOptionsを通じてアプリを起動するので、起動オプションを確認して何かをする〜10秒間あります。だから私の問題は、接続上に送信されるデータがないという事実に関連していました。私たちは周辺機器のファームウェアをこれを整理するために変更する必要があるようです。

デベロッパーwillRestoreStateは、アプリを手動で再起動するときに呼び出されます。現時点では、iOSは、最近使用されたセントラルだけでなく、接続された周辺機器や最近登録されたサービスのリストも提供しています。だから私はオブジェクトを復元して、接続された周辺機器の適切なサービスから購読された特性を完全に機能させる必要がありました。

+3

こんにちはSTEXさん、「私のオブジェクトを復元し、適切なサービスから購読した特性を取得するだけでした。接続された周辺機器は完全に機能します。 "私は同様の問題に直面しており、私の周辺機器オブジェクトを取得しているので、私のアプリケーションを再び機能させることができませんでしたが、私は接続コマンドを再度送信する必要がありますか、私はデリゲートメソッドを設定する必要があります。 ありがとうございます。 – Nik

関連する問題