1. ホーム
  2. ios

CoreBluetoothアプリケーションはバックグラウンドでどのようなことができるのですか?

2023-09-24 08:54:17

質問

主題は、本当にすべてを物語っています。ドキュメントが存在する限り、iOS デバイス上で動作する CoreBluetooth フレームワークに対して書かれたアプリは、バックグラウンド特権リストに "bluetooth-central" を追加でき、非アクティブ時に何らかの Bluetooth イベントを処理できることを示唆していますが、どのように処理するのでしょうか。 正確には イベントが配信されたりされなかったりするのでしょうか?

例えば

  1. すでにペアリングを確立している機器との通信を継続できますか?
  2. 圏外にある/見たことのないデバイスを見つけるために、定期的に発見要求を出すことはできますか? (たとえば、新しい興味深いデバイスに遭遇したときに通知を配信できるようにしたい場合など)。
  3. デバイスが圏外になった後、戻ってきた場合はどうなりますか? ユーザーの介入なしに切断と接続のイベントを受け取ることができますか、それともフォアグラウンドになり、ユーザーが明示的に再接続を要求する必要がありますか?

どのように解決するのですか?

誰も知らないようなので、私は iOS の開発者アカウントを購入し、いくつかの実験を行いました。以下は、私が見つけたものです。

フォアグラウンドで実行している場合、CBCentralManager::scanForPeripheralsWithServices を使用してスキャンを開始することができます。スキャンは 制限付き として、特定のサービスを宣伝するデバイスに限定したり 無制限 (その呼び出しのパラメータにnilを渡す)。また 許可 または 重複を許可しない 前者の場合、iPhoneが広告パケットを受信するたびにdidDiscoverPeripheralコールバックを受け取ることになります。

バックグラウンドに入ると、ルールは次のように表示されます。

  • を実行していた場合 無制限 スキャンを実行していた場合、それは静かにキャンセルされます。didDiscover コールバックを受け取ることはありません。
  • もしあなたのスキャンが 制限されている (つまり、探しているサービスの UUID を 1 つ以上指定した場合)、スキャンは実行され続けますが、その際に allow duplicates フラグは無視されます。 . これは、次のような場合にのみ、didDiscoverPeripheralコールバックを受けることを意味します。 新しい デバイスのためのdidDiscoverPeripheralコールバックのみを受け取るようになったことを意味します。すべてのデバイスがフォアグラウンドにある間に見られた場合、コールバックは全く得られません。
  • スキャンの開始と停止 は行いません。 は、どのデバイスが新しいとみなされるかをリセットします。1 つのデバイスが存在する場合、複数のスキャンにわたっても、以下の場合を除き、1 つのコールバックしか得られません...
  • もし に接続します。 をデバイスに接続すると 接続を解除する で、次に 再スキャン を実行すると、デバイスは再び列挙されます(つまり、didDiscoverPeripheralをもう1回呼び出すことになります)。iOS はこれを、デバイスに興味を示したと見なすのでしょう。

私の例のデバイスは接続可能なので、接続できないデバイス (近接プロファイルを実装しているような BLE アドバタイザーなど) への接続試行が十分かどうかはわかりません。しかし、少なくとも接続可能なデバイスについては、このスキャン/接続/切断/スキャンの手順で、バックグラウンドでデバイスの存在を確認するのに十分です。

上記の結果は、iOS 5.0.1 を実行する iPhone 4S を使用して収集されました。