当 iOS 应用程序处于免费状态时,我无法理解如何执行扫描。我有一个非常简单的测试应用程序,它只扫描设备并将结果输出到控制台。我在 Info.plist 中将蓝牙中心添加到所需的后台模式,所以我应该没问题,我正在扫描具有一项指定服务的设备,即
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
除了应用程序委托中的初始化之外,应用程序中没有任何其他内容。