web-dev-qa-db-ja.com

コアBluetoothがバックグラウンドでアドバタイズおよびスキャン

デバイスを周辺機器用にスキャンし、周辺機器としてアドバタイズするようにアプリをセットアップしようとしています。目標は、2つのデバイスがBluetoothの発見によって互いに近づいたときに、バックグラウンドでウェイクアップされることです。 Appleドキュメンテーションから、BLEをバックグラウンドで実行できるはずです(bluetooth-centralおよびbluetooth-peripheralバックグラウンドモードが有効になっている)。フォアグラウンド。まず、次のようにデータを宣伝します。

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                              CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 

次に、データをスキャンするようにデバイスを設定します。

NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:nil];

ただし、両方がバックグラウンドに入ると(デバイスをロックする必要があります)、Bluetoothは検出できず、

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

どちらのデバイスでも呼び出されません。どうすれば修正できますか?ありがとう

30
Kyle Rosenbluth

あなたがしようとしていることはうまくいきません。私は同じことを達成しようとしました。

問題は、フォアグラウンドとバックグラウンドでのスキャンの違いです。フォアグラウンドでデバイスをスキャンしているときは、何でもスキャンできます。バックグラウンドで、スキャンする実際のサービスUUIDを指定する必要があります。探しているUUIDを知っているので、これは実際には問題ではありません。

周辺機器:周辺機器としてのブロードキャストは、フォアグラウンドとバックグラウンドで動作が異なります。フォアグラウンドでは、通常のBT周辺機器と同じように機能します。バックグラウンドでは、使用できるスペースが非常に限られているため、周辺機器のUUIDは非表示になり、ブロードキャストされません。中央デバイス(フォアグラウンドのiPhone)が中央デバイスから情報を要求した場合にのみ、アプリが起動され、UUIDが表示されます。

つまり、2は互いにキャンセルします。バックグラウンドスキャンは特定のUUIDを持つデバイスのみをスキャンでき、バックグラウンドペリフェラルはそのUUIDをアドバタイズできないため、お互いを認識できません。

デバイス(ペリフェラルまたはセントラルのいずれか)が動作するには、フォアグラウンドにある必要があります。

これは、Apple Bluetoothメールリストで何度も議論されています。

45
Darren

理論的には動作するように見えるので、これをテストする方法について詳しく説明する必要があります。あなたが直面しているかもしれない2つの主要な問題があります:

1。)iOSデバイスがバックグラウンドで実行されている場合、スキャンは抑制されます。

  • フォアグラウンドでスキャンするとすぐにその横に広告を表示しているデバイスが見つかる可能性がありますが、バックグラウンドでのディスカバリーには最大で60倍の時間がかかる場合があります。 iOSシステムは、ユーザーが1つのアプリのBluetooth機能を他のアプリよりも優れたものにしたい(または1つのアプリだけがそれを使用したいと思っている)ことを想定していません。また、共有機能であるため、ユーザーはアプリ全体で統一されたエクスペリエンスを望んでいます。広告とスキャンの間隔について 技術仕様 を確認して、Appleが何をしているのかをよく理解してください。

2。)バックグラウンドに入る前に、デバイスがすでにお互いを検出している可能性があります。

  • Appleは、バックグラウンドに入るとCBCentralManagerScanOptionAllowDuplicatesKeyスキャンフラグを無効にします。このフラグを指定していないので、デフォルトでNOに設定されています。したがって、お互いを一度見ただけでも、バックグラウンドにいるときは別のコールバックを取得できません。
8
Tommy Devoy

私は個人的にそのような機能を必要としていて、オープンソースコンポーネントを開発しました: https://github.com/omergul123/Discovery

ピアアプリがバックグラウンドで実行されている場合でも、IDを交換する場合に非常に役立ちます。

5