Ben*_*Ben 6 objective-c ios core-bluetooth bluetooth-lowenergy swift
我有一个管理BTLE通信的BluetoothManager类.我可以扫描并连接到CBPeripheral并发现服务或特征.我有来自CBCentralManagerDelegate和CBPeripheralDelegate的良好回调
当我连接到CBPeripheral时,我在CoreData中保存UUIDString以在我重新启动应用程序时检索此外围设备.
这是我重新启动应用程序时检索外围设备的Swift代码:
func retrievePeripheralsWithIdentifiers(identifiers: [AnyObject]!){
let data = self.centralManager.retrievePeripheralsWithIdentifiers(identifiers)
println("Data retrieved: \(data)")
for peripheral in data as [CBPeripheral] {
println("Peripheral : \(peripheral)")
peripheral.delegate = self
centralManager.connectPeripheral(peripheral, options: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的:
Data retrieved: [<CBPeripheral: 0x1669fcd0, identifier = XXXXX, name = Peripheral1, state = disconnected>]
Peripheral : <CBPeripheral: 0x1669fcd0, identifier = XXXXX, name = Peripheral1, state = disconnected>
Run Code Online (Sandbox Code Playgroud)
我可以找到我的一个外围没有任何问题.但是当我调用"centralManager.connectPeripheral(peripheral,options:nil)"这一行时,我没有任何回复.
这些方法
func centralManager(central: CBCentralManager!, didRetrievePeripherals peripherals: [AnyObject]!)
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!)
func centralManager(central: CBCentralManager!, didFailToConnectPeripheral peripheral: CBPeripheral!, error: NSError!)
Run Code Online (Sandbox Code Playgroud)
没有回电让我知道什么是错的.所以我可以找到好的外设,但我无法连接到它.
但是,当我扫描时,我有相同的代码连接到某些外围设备并且它可以工作; 我自己的CBCentralManager也有一个好的代表和我的外围设备.
我究竟做错了什么?
我在Xcode-Beta5上使用iPod-Touch iOS8-Beta5.
谢谢,
本
编辑
好的,那更奇怪了
我在iOS7和Objective-C上的旧应用程序中尝试以下代码,我在连接时保存了UUIDS字符串,并尝试检索外围设备.效果很好:NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"UUIDString"]) {
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:[defaults objectForKey:@"UUIDString"]];
NSArray * data = [self.centralManager retrievePeripheralsWithIdentifiers:@[uuid]];
if ( [data count] > 0 ){
self.currentPeripheral = [data objectAtIndex:0];
[self.currentPeripheral setDelegate:self];
[self.centralManager connectPeripheral:self.currentPeripheral options:nil];
}
} else {
NSLog(@"Scanning started");
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
这与我在iOS8和Swift上的新应用程序中的代码相同:
let userDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey("UUIDString") != nil {
let uuid = NSUUID(UUIDString: userDefaults.objectForKey("UUIDString") as String)
let data = self.centralManager.retrievePeripheralsWithIdentifiers([uuid]) as [CBPeripheral]
if data.count > 0 {
self.currentPeripheral = data[0]
println("Current peripheral \(self.currentPeripheral)")
self.currentPeripheral!.delegate = self
self.centralManager.connectPeripheral(self.currentPeripheral!, options: nil)
}
} else {
println("Start Scanning")
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
我在iPod Touch iOS7上试用我的旧应用程序,效果很好.我在iPod Touch iOS8上试用我的旧应用程序,它的工作原理也很好.我在iPod Touch iOS8上试用我的新应用程序,它不起作用.
我没有发现两个代码之间有任何差异.我可以扫描,发现和连接外围设备,但连接到检索到的外围设备似乎无法在iOS8和Swift上运行.
小智 7
在您的原始示例中,您似乎没有保存CBPeripheral的本地副本.
从CBCentralManager类参考 - connectPeripheral:
当取消分配外围设备时,也会自动取消挂起的连接尝试.
| 归档时间: |
|
| 查看次数: |
6269 次 |
| 最近记录: |