• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在应用程序暂停后重新打开蓝牙 radio 不会调用 centralManagerDidUpdateState

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:52:19 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的应用与低能耗外围设备连接。当外围设备超出范围时,我会收到 didDisconnect 方法回调,我只需在外围设备上调用 connect ,只要它回到范围内,它就会连接。

即使在后台,即使应用程序被 iOS 挂起,但由于我有一个挂起的连接,它会唤醒应用程序并连接。

但是,如果用户关闭蓝牙,所有外围设备都会进入断开状态,因此不会保留未决连接。如果应用程序被 iOS 挂起,并且用户在挂起后重新打开它,我的委托(delegate)方法都不会被调用,我在下面添加了我的初始化和状态恢复方法。

我在后台队列中初始化我的中央管理器,但每当我收到回调时,我都会让主队列执行任务:

- (void)initialize {
if (!self.centralManager) {
    _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) options{ CBCentralManagerOptionRestoreIdentifierKey"CBCentralManagerIdentifierKey" }];
}
}

我的中央状态回调方法

- (void)centralManagerDidUpdateStateCBCentralManager *)central {

dispatch_async(dispatch_get_main_queue(), ^{
    [SFUtil writeLog"centralManagerDidUpdateState"];
    if (central.state == CBManagerStatePoweredOff) {
        [SFUtil writeLog"CBManagerStatePoweredOff"];
        [[NSNotificationCenter defaultCenter] postNotificationName:CB_MANAGER_BLUETOOTH_POWERED_OFF object:nil];
    }
    else if (central.state == CBManagerStatePoweredOn) {
        [SFUtil writeLog"CBManagerStatePoweredOn"];
        [self restoreConnections]; // here I reconnect to already known devices, retrieved from calling central method of retrievePeripheralsWithIdentifiers
        [[NSNotificationCenter defaultCenter] postNotificationName:CB_MANAGER_BLUETOOTH_POWERED_ON object:nil];
    }
});

}

我的中央恢复方法:

- (void)centralManagerCBCentralManager *)central willRestoreStateNSDictionary<NSString *, id> *)dict {

dispatch_async(dispatch_get_main_queue(), ^{
    [DataManagerInstance startBackgroundTaskIfInBackground]; // Here, I start a background task.
    [self initialize];
   });
}

当用户重新打开应用程序时,我需要在后台重新连接到外围设备,但由于当用户从控制中心或设置重新打开蓝牙时从未调用 centralManagerDidUpdateState 方法,所以我无法发送连接调用。

当我手动启动应用程序时,外围设备处于连接状态但不会重新连接。



Best Answer-推荐答案


您是否正在监视 CBCentralManager 中的状态变化?当蓝牙关闭和打开时,您应该得到一个委托(delegate)回调,记录 here :

- (void)centralManagerDidUpdateStateCBCentralManager *)central {
    if (central.state == CBManagerStatePoweredOn) {
        // reconnect/scan/etc
    }
}

听起来您正在使用 Core Bluetooth State Preservation and Restoration ,它应该会在这些状态更改时通知您。

另外,我现在无法尝试,但您也可以在蓝牙关闭时尝试重新连接,因为连接请求不会超时。

关于ios - 在应用程序暂停后重新打开蓝牙 radio 不会调用 centralManagerDidUpdateState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48030480/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap