我在理解当iOS应用程序处于bacground时如何执行扫描时遇到一些麻烦.我有一个非常简单的测试应用程序,它只扫描设备并将结果输出到控制台.我已经在Info.plist中添加了bluetooth-central到所需的后台模式,所以我应该没问题,我正在使用一个指定的服务扫描设备,即
NSArray *cbuuidArray = [NSArray arrayWithObjects:[CBUUID UUIDWithString:@"UUIDFromUUIDGEN"],nil];
[self.centralManager scanForPeripheralsWithServices:cbuuidArray options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
Run Code Online (Sandbox Code Playgroud)
当应用程序处于前台时,我只有一个(或没有)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 = …Run Code Online (Sandbox Code Playgroud)