特定のシナリオでは、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.
私はそれらの更新を取得する必要があるようですが、このような問題が発生したことはありますか?
どんな助けでも大歓迎です!
前もって感謝します