【问题标题】:iOS BLE background scanningiOS BLE 后台扫描
【发布时间】:2013-08-18 15:03:40
【问题描述】:

当 iOS 应用程序处于免费状态时,我无法理解如何执行扫描。我有一个非常简单的测试应用程序,它只扫描设备并将结果输出到控制台。我已经在 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。我的主要ViewControllerCBCentralManagerDelegate 代表看起来像这样。

@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 初始化之外,应用程序中没有其他任何事情发生。

【问题讨论】:

  • 你好。我和你有同样的问题。你发现问题了吗?或者解决方案?谢谢。
  • 您可以在当前最新(截至 2015 年 2 月 19 日)iOS 8.1.3 中尝试您的方法吗?

标签: ios background bluetooth-lowenergy network-scan


【解决方案1】:

在 ios 端,如果您尝试在后台模式下连接或扫描 ble 设备,它将永远无法正常工作。但是一旦您的设备在前台与 ble 连接,您就可以在后台模式下继续从 Ble 设备获取数据。

后台的 CoreBluetooth 应用无法像在前台那样扫描外围设备。

请查看Background scan ble device

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多