iOS CoreBluetooth centralManager:willRestoreState:在应用程序被杀死时扫描和连接时不会被调用

时间:2015-12-28 10:54:32

标签: ios background bluetooth restore bluetooth-lowenergy

我正在开发一个iOS应用程序,它充当CoreBluetooth核心角色并与BLE设备交互。我选择使用CoreBluetooth的恢复功能时发现了一种奇怪的行为。

在iOS 9.2(13C75)/ iPhone5上测试

  1. < 按预期>虽然应用程序在扫描外设期间被杀死,但在发现外围设备时将调用centralManager:willRestoreState:

    // Scanning
    [centralManager scanForPeripheralsWithServices:@[MY_SERVICE_UUID] options:nil];
    
    // Kill
    kill(getpid(), SIGKILL);
    
    // centralManager:willRestoreState: return with dictionary when MY_SERVICE_UUID peripheral appear in range
    @{ kCBRestoredScanServices = ( MY_SERVICE_UUID ) };
    
  2. < 按预期>虽然应用程序在连接外围设备期间被终止或具有活动连接的外围设备,但当连接/连接的外围设备出现时,将调用centralManager:willRestoreState:

    // Scanning
    [centralManager connectPeripheral:A_CBPERIPHERAL options:nil];
    
    // Kill
    kill(getpid(), SIGKILL);
    
    // centralManager:willRestoreState: return with dictionary when MY_SERVICE_UUID peripheral appear in range
    @{ kCBRestoredPeripherals = (
      "<CBPeripheral: 0x14da2d70, identifier = 6C32ADB6-C531-0250-050B-B14F4429BECE, name = MY_NAME, state = connecting>"
    )};
    
  3. &lt; NOT 按预期&gt;虽然应用程序在连接外围设备时被杀,或者有一个活动的连接外围设备 AND 同时扫描,但当连接/连接外围设备时,centralManager:willRestoreState: 将被调用出现并且应用程序不会被非连接但需要的扫描外围设备唤醒。我不知道为什么,也无法从Apple文档中找到任何信息。

      

    2016年1月14日更新:我发现我的其他部分应用中存在一个小错误导致问题。现在一切都按预期工作了。我将保留可能感兴趣的旧帖子。

    &lt; 按预期&gt;虽然应用程序在连接外围设备时被杀,或者有一个活动的连接外围设备 AND 同时也在扫描,但当连接/连接的外围设备出现时,centralManager:willRestoreState:将被调用,app也将被唤醒非连接但需要扫描外围设备。

    // Scanning and Connecting
    [centralManager scanForPeripheralsWithServices:@[MY_SERVICE_UUID] options:nil];
    [centralManager connectPeripheral:A_CBPERIPHERAL options:nil];
    
    // Kill
    kill(getpid(), SIGKILL);
    
    // centralManager:willRestoreState: return with dictionary when MY_SERVICE_UUID peripheral appear in range
    @{ kCBRestoredPeripherals = (
      "<CBPeripheral: 0x14da2d70, identifier = 6C32ADB6-C531-0250-050B-B14F4429BECE, name = MY_NAME, state = connecting>",
       kCBRestoredScanServices = ( MY_SERVICE_UUID )
    )};
    
  4. 注意:

    • 我的所有扫描/连接/连接的外围设备都具有与UUID相同的服务MY_SERVICE_UUID
    • 以上kill代码仅用于演示时间序列,我通常将kill代码放在applicationDidEnterBackground:,这可以在我按下主页按钮后立即终止应用程序。

    我很好奇我发现了什么,只是想知道是否有人也面临同样的问题。

0 个答案:

没有答案