0

特定のシナリオでは、bluetooth 周辺機器に無期限に接続する必要があるアプリを開発しています。

質問を続ける前に、次のことを確認したいと思います。

  • で初期化CBCoreBluetoothManagerしていdidFinishLaunchingWithOptions:ます。
  • bluetooth-centralバックグラウンド機能を有効にしています。
  • Manager をキーで初期化し、以下を実装することで、State Preservation and Restoration を使用していますwillRestoreState
  • 問題が発生する前に、周辺機器との接続に成功し、そのサービス (1 つだけを探しています) とその特性 (1 つだけを探しています) を取得しsetNotifyValue:ますYES。さらに、フォアグラウンドとバックグラウンドの両方で、didUpdateValueForCharacteristic:特性の値が更新されるたびにコールバックを受け取ります。
  • 「一時停止状態」をシミュレートしていますkill(getpid(), SIGKILL)(アプリをバックグラウンドに置き、1時間以上放置してテストしました)
  • 中断と言うのは、実際のSuspended状態を意味します。すべてのアプリは、一定時間バックグラウンドに置かれた後、最終的にそこに到達すると私は信じています.

私が抱えている問題はdidUpdateValueForCharacteristic:、アプリが中断されたときにコールバックを取得することです。アプリがバックグラウンドにある場合はコールバックを受け取りますが、中断されている場合は受け取りません。つまり、特性の値の更新によってアプリが起動されることはありません。

面白いことに、アプリをサスペンド モードにしているときに、ペリフェラルの範囲から出て切断し、範囲内に戻って再接続すると、復元しようとするため、アプリが起動されます ( willRestoreState:) を呼び出し、しばらくの間、特性値の更新をリッスンします。

要約すると、私のアプリが一時停止状態にあり、ペリフェラルの範囲内にある間、didUpdateValueForCharacteristic は呼び出されません。つまり、アプリは起動されません。100% 確実なのは、特性値の更新です。ただし、状態の保存と復元をサポートしているため、周辺機器の範囲から出て戻ってくると、アプリが起動します。

Appleのドキュメントから:

The system wakes up your app when any of the CBCentralManagerDelegate or CBPeripheralDelegate delegate methods are invoked, allowing your app to handle important central role events, such as when a connection is established or torn down, when a peripheral sends updated characteristic values, and when a central manager’s state changes.

私はそれらの更新を取得する必要があるようですが、このような問題が発生したことはありますか?

どんな助けでも大歓迎です!

前もって感謝します

4

0 に答える 0