web-dev-qa-db-ja.com

バックグラウンドでCoreBluetoothアプリケーションは正確に何ができますか?

被験者は本当にそれをすべて言います。ドキュメントは、それが存在する限り、iOSデバイスで実行されているCoreBluetoothフレームワークに対して作成されたアプリは、バックグラウンド特権リストに「bluetooth-central」を追加し、非アクティブながら何らかの種類のBluetoothイベントを処理できることを示唆していますが、どのexactイベントは配信されますか?

例えば:

  1. ペアリングを確立したデバイスとの通信を継続できますか?
  2. 範囲外のデバイスを見つけるために定期的なディスカバリーリクエストを発行できますか? (たとえば、新しい興味深いデバイスが検出されたときに通知を配信できるようにしたい場合)
  3. デバイスが範囲外になってから戻ってきたらどうなりますか?ユーザーの介入なしに切断イベントと接続イベントを取得しますか、それともフォアグラウンドでユーザーに明示的に再接続を要求させる必要がありますか?
78
Chris Smowton

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

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

背景を入力すると、ルールは次のように表示されます。

  • 無制限スキャンを実行していた場合、静かにキャンセルされます。 didDiscoverコールバックは取得しません。
  • スキャンが制限付き(つまり、探している1つ以上のサービスUUIDを指定した)の場合、スキャンは引き続き実行されますが、allow duplicatesフラグは無視されますです。これは、newデバイスに対してのみdidDiscoverPeripheralコールバックを取得することを意味します。フォアグラウンドですべてのデバイスが表示された場合、コールバックはまったく発生しません。
  • スキャンの開始と停止しないどのデバイスが新しいと見なされるかをリセットします。 1つのデバイスが存在する場合、次の場合を除き、複数のスキャンにわたっても1つのコールバックのみを取得します.
  • connectにデバイスを、次にdisconnectに、そしてscan againにすると、デバイスは再度列挙されます(つまり、 didDiscoverPeripheral)。 iOSはそれをデバイスに「関心を示している」と見なしていると思います。

サンプルデバイスが接続可能であるため、接続不可能なデバイス(近接プロファイルを実装しているようなBLE広告主など)への接続試行が十分であるかどうかはわかりません。ただし、少なくとも接続可能なデバイスの場合、このスキャン/接続/切断/スキャン手順は、バックグラウンドでのデバイスの存在をポーリングするのに十分です。

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

119
Chris Smowton

クリスの答えに加えて:

  • アプリに「bluetooth-central」バックグラウンドモードがあり、周辺機器に接続されている場合、通知を受け取ることができます(peripheral:didUpdateValueForCharacteristic:error:)10分経ってもバックグラウンドで周辺機器から。

したがって、バックグラウンドで継続的に実行する場合、2つのオプションがあります。

  • 「接続、切断、再スキャン」ループを実行します
  • 周辺機器に通知を送信させる

後でWWDC 2012 Core Bluetoothビデオの「イベントの背景」になるはずです https://developer.Apple.com/videos/wwdc/2012/ しかし、前者はハックのように見えます。それに依存する。

これをiPhone5、iOS6.1.4でテストしました


Appleはついに Core Bluetooth Programming Guide をリリースしました。ここに公式の注意事項があります

iOSアプリのコアBluetoothバックグラウンド処理

9
mash

AppleはこれをCoreLocation機能と考えることを好むが、iBeaconsに関連するバックグラウンドおよびCoreBluetoothの動作に注意することもよい。

  1. IBeaconリージョンの通知がオンになっている場合、リージョンの開始または終了をユーザーに通知します。これらの通知は、ディスプレイがオンかオフかによって異なります。これらの通知は、通知を要求するアプリがバックグラウンドにある場合でも機能します。 (これはドキュメントで明確になっています)。

  2. それほど明白ではありません:iBeaconレンジングAPIを使用する場合、アプリは最前面になければなりません。ドキュメントでこれを明示的に言っているわけではありません。実際、レンジングはドキュメントのバックグラウンドで機能するはずだと誤解される可能性があります。ただし、Appleエンジニアは、これをApple開発者フォーラムの長いスレッドのどこかに埋められた投稿で明らかにしました。これも失敗しました。フォアグラウンドでのみ機能します。

  3. IBeaconsを宣伝する周辺機器によって宣伝されている他のサービスを発見できます。ただし、これはフォアグラウンドでのみ機能します。そのため、iBeaconsを使用して中央に近接を通知し、他のBLEベースのサービスを使用して他のトランザクションを実行する場合、これは機能しますが、フォアグラウンドでのみです。バックグラウンドでは機能しません。バックグラウンドでBLEベースのサービスを使用するトランザクションの場合、広告はiBeaconではなく通常のBLE広告でなければなりません。バックグラウンドでの検出プロセスを支援するためにiBeaconアドバタイズメントを使用してから、バックグラウンドでBLEサービスを使用するように切り替えることはできません。 (私はこれが機能することを非常に気に入りましたが、サイコロはありませんでした)。

7
user108

IOS8.3および8.4でBLEデバイスのバックグラウンドモードを学習しましたが、上記といくつかの違いが見つかりました。

  1. 始めたら

    [centralManager scanForPeripheralsWithServices:@ [[CBUUID UUIDWithString:kServiceUUID]] options:@ {CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];

から

- (void)applicationDidEnterBackground:(UIApplication *)application

列挙は、異なるRSSIを持つ呼び出しごとに同じデバイスを返すため、CBCentralManagerScanOptionAllowDuplicatesKeyは無視されません。

  1. アプリがフォアグラウンドにある場合、BLEデバイスを1秒に50回発見しました。アプリがバックグラウンドにあるが、電話画面がアクティブな場合、アプリは1秒に6回BLEデバイスを検出します。電話画面がブロックされている場合、アプリはBLEデバイスを1秒に1回検出します。
4
Igor Vlasov