gpt4 book ai didi

iOS CBCentralManager 在进入范围时不会在后台检测到 CBPeripheral

转载 作者:行者123 更新时间:2023-11-29 03:06:05 24 4
gpt4 key购买 nike

我正在开发一个测试 BTLE 应用程序。用户可以选择启动中央或外设模式。如果 2 个设备都处于事件状态并且在范围内,它们会立即检测、连接并传递数据,但是......

如果设备 1 以中央模式启动然后置于后台,则设备 2 被移出范围并置于外围模式,当外围设备被带到后台中央设备旁边时,中央设备检测到外围设备并获取数据。

如果设备 1 以外设模式启动并置于后台,则设备 2 被移出范围并置于中央模式,然后进入范围,它不会检测到外设。 (我等了 5 分钟)如果我再次按下“启动中央”按钮,它会立即检测到!

“启动中心”仅执行以下操作:

-(id)init{
if (self=[super init]) {
dispatch_queue_t peripheralQueue=dispatch_queue_create("com.Dev.peripheralQueue", 0);
dispatch_queue_t centralQueue=dispatch_queue_create("com.Dev.centralQueue", 0);

// Initiate Managers with restore keys for background mode
self.centralManager=[[CBCentralManager alloc]initWithDelegate:self
queue:centralQueue
options:@{CBCentralManagerOptionRestoreIdentifierKey: CM_RESTORE_KEY}];
self.peripheralManager=[[CBPeripheralManager alloc]initWithDelegate:self
queue:peripheralQueue
options:@{CBPeripheralManagerOptionRestoreIdentifierKey: PM_RESTORE_KEY}];
// 1. create The UUIDs
// 2. create the service and characteristics
//service is alloc/inited and published in did update state
}
return self;
}

-(void)switchToCentral
{
NSLog(@"BTM switchToCentral");
[self.peripheralManager stopAdvertising];
[self scan];
self.isCentral = YES;
}

- (void)scan
{
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]
options:@{ CBCentralManagerScanOptionAllowDuplicatesKey:@NO}];
NSLog(@"CM Scanning started");
}

我添加了以下可耻的 hack:

-(void)switchToCentral
{
NSLog(@"BTM switchToCentral");
[self stopBroadcasting];
[self scan];
self.isCentral = YES;

dispatch_async(dispatch_get_main_queue(), ^{
[NSTimer scheduledTimerWithTimeInterval:5
target:self
selector:@selector(centralShouldRescan:)
userInfo:nil
repeats:YES];
});
}

-(void)centralShouldRescan:(NSTimer*)timer{

NSLog(@"BTM centralShouldRescan");
if (self.isCentral) {
NSLog(@"BTM centralShouldRescan isCentral");
[self stopBroadcasting];
[self scan];


}else{
NSLog(@"BTM centralShouldRescan isCentral");
[timer invalidate];
}
}

现在可以了!我很困惑。我的理解和经验是,当CBCentral manager开始扫描时,它会一直扫描直到停止,尤其是当它在前台时。

最佳答案

您是否实现了 centralManagerDidUpdateState 委托(delegate)方法?我怀疑当您禁用外设模式时,在 centralManager 准备好扫描之前会有一些时间延迟 - 这只是一个猜测。你可以尝试类似的东西-

-(void) centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state == CBCentralManagerStatePoweredOn)
{
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] options:@{ CBCentralManagerScanOptionAllowDuplicatesKey:@NO}];
}
}

这将确保在中央管理器退出开机状态时重新启动扫描。

关于iOS CBCentralManager 在进入范围时不会在后台检测到 CBPeripheral,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22753082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com