iOS アプリケーションが背景にあるときにスキャンがどのように実行されるかを理解するのに苦労しています。デバイスをスキャンして結果をコンソールに出力するだけの非常に単純なテスト アプリケーションがあります。Info.plist で必要なバックグラウンド モードに bluetooth-central を追加したので、問題ないはずで、指定されたサービスでデバイスをスキャンしています。
NSArray *cbuuidArray = [NSArray arrayWithObjects:[CBUUID UUIDWithString:@"UUIDFromUUIDGEN"],nil];
[self.centralManager scanForPeripheralsWithServices:cbuuidArray options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
アプリケーションがフォアグラウンドにあるとき、電源に接続されている BLE デバイスが 1 つだけ (またはまったくない) であるため、iOS はそれを検出し、結果を非常に頻繁に表示します。CBCentralManagerScanOptionAllowDuplicatesKey
バックグラウンドに移動すると、NO に設定されているため、期待される最初のデバイスの結果はもうありません。
この時点で、2 番目の BLE デバイスに電力を供給し、それが結果に表示されるのを待ち望んでいます。10分待っても何も表示されません。最後の通知がから来て、タスクの作業中に呼び出されなかったapplicationDidEnterBackground
ため、アプリケーションは終了しません。applicationWillTerminate
非常に偶然の方法で、アプリが実行されていてバックグラウンドでまだスキャンしていて、別の BLE スキャン アプリケーション (私は優れたBLExplrを使用しています) がフォアグラウンドにあり、スキャンを開始すると、アプリケーションは最終的に結果を受け取っていることを発見しましたフォアグラウンド アプリケーションと同じ時間。アドバタイジング パケットはシステムによって処理され、アプリケーションにディスパッチされるため、これはある程度理にかなっていますが、アプリケーションがそれ自体で何も受信しないのはなぜですか?
誰かが同様の経験をしたか、これが何が原因であるかを知っていますか? この問題に関するヒントはなく、バックグラウンドと Bluetooth に関するおそらくすべての Apple リソースを読みました。私はiOS 5.1.1でiOS 4sに取り組んでいます。ViewController
デリゲートである私のメインはCBCentralManagerDelegate
次のようになります。
@implementation MainViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}
return self;
}
#pragma mark -
#pragma mark CBCentralManagerDelegate methods
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if( central.state == CBCentralManagerStatePoweredOn ){
NSArray *cbuuidArray = [NSArray arrayWithObjects:
[CBUUID UUIDWithString:@"UUID"],
nil];
[self.centralManager scanForPeripheralsWithServices:cbuuidArray options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
}
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"%s / peripheral: %@, adData: %@, RSSI: %@" , __PRETTY_FUNCTION__ , peripheral, advertisementData, RSSI);
NSLog(@"Periphal name: %@", peripheral.name);
}
#pragma mark -
#pragma mark CBPeripheralDelegate methods
@end
NavigationController
アプリケーション デリゲートでの初期化以外に、アプリケーションでは何も行われません。