自从升级到iOS 8.2后,我似乎遇到了CoreBluetooth问题。我有一个以前的应用程序工作,运行CBCentralManager子类来扫描我想要的UUID。现在,我无法获得didDiscoverPeripherals
的委托回调。
我已经验证外围设备是通过LightBlue正确广播的。在调用扫描之前,我已经验证了CentralManager状态是否已打开电源。我尝试使用我的UUID和nil进行扫描。再次,我在升级之前已经使用了几周的代码。有没有其他人经历过这个或者知道会发生什么?
编辑 - 添加了代码CBCentralManager子类代码
@implementation CentralManager
-(id) initWithDelegate:(id<CBCentralManagerDelegate>)delegate queue:(dispatch_queue_t)queue {
self = [super initWithDelegate:delegate
queue:queue
options:nil];
_items = [NSMutableDictionary new];
_discoveredPeripherals = [NSMutableArray new];
_app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
return self;
}
-(void) startScan {
if (!_isScanning && self.state == CBCentralManagerStatePoweredOn && _app.loggedIn) {
[self scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:APP_SERVICE_UUID]] options:nil];
_isScanning = YES;
NSLog(@"Scanning started");
}
}
-(void) stopScan {
[super stopScan];
_isScanning = NO;
NSLog(@"Scanning stopped");
}
在AppDelegate中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (!_centralManager) {
_centralQueue = dispatch_queue_create("centralQueue", nil);
_centralManager = [[CentralManager alloc]initWithDelegate:self queue:_centralQueue];
}
[_peripheralManager beginAdvertising];
[_centralManager startScan];
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
if (central.state == CBCentralManagerStatePoweredOn) {
[_centralManager startScan];
}
}
startScan
被调用两次,具体取决于用户是否已登录或centralManager
是否已启动。我基本上同等对待peripheralManager
并且有效(由浅蓝色验证)。
答案 0 :(得分:0)
看起来问题与子类化CBCentralManager
有关。也许是因为iOS 8.2中最近的changes,因为之前它运行良好。快速解决方法是在子类中添加ivar manager
并初始化CBCentralManager
。然后在该经理上拨打scan
。虽然这可能不是一个干净的方法,但它突出了这个问题。