我在理解当iOS应用程序处于bacground时如何执行扫描时遇到一些麻烦。我有一个非常简单的测试应用程序,它只扫描设备并将结果输出到控制台。我已经在Info.plist中添加了bluetooth-central到所需的后台模式,所以我应该没事,我正在使用一个指定的服务扫描设备,即
NSArray *cbuuidArray = [NSArray arrayWithObjects:[CBUUID UUIDWithString:@"UUIDFromUUIDGEN"],nil];
[self.centralManager scanForPeripheralsWithServices:cbuuidArray options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
当应用程序处于前台时,我只有一个(或没有)BLE设备连接到电源,因此iOS检测到它并经常显示结果。当我转到后台时,由于CBCentralManagerScanOptionAllowDuplicatesKey
设置为NO,因此不再有第一个设备的结果。
此时我正在为第二个BLE设备供电,并急切地等待它显示在结果中。等了10分钟后什么也没出现。由于我的上一次通知来自applicationDidEnterBackground
,并且在我处理任务时从未调用过applicationWillTerminate
,因此应用程序未终止。
以一种非常偶然的方式,我发现如果我的应用程序正在运行并且仍然在后台扫描而另一个BLE扫描应用程序(我正在使用优秀的BLExplr)在前台并开始扫描,我的应用程序最终在前台应用程序的同时收到结果。这是有道理的,因为广告数据包由系统处理并发送到应用程序,但为什么我的应用程序不能自己接收任何内容?
有没有人有类似的经历或知道这可能是由什么引起的?
我已经阅读了有关背景和蓝牙的所有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
初始化之外,应用程序中没有其他内容。
答案 0 :(得分:1)
在ios端,如果您尝试在后台模式下连接或扫描ble设备,则该设备将永远无法工作。但是一旦您的设备在前景连接到ble,您就可以继续在后台模式下从Ble设备获取数据。
后台的CoreBluetooth应用程序无法像在前台那样扫描外围设备。