iOS 8核心蓝牙没有发现外设

我无法让Core Bluetooth在iOS 8上发现外围设备。相同的代码在iOS 7设备上工作正常。 起初,我认为这将是一个权限问题,因为我一直在做一些iBeacon的工作,并在iOS 8的核心位置权限有一些变化。我找不到任何网上帮助,但是。 这里是一个示例项目的链接,适用于iOS 7,但不适用于iOS 8:

https://github.com/elgreco84/PeripheralScanning

如果我在iOS 7设备上运行这个项目,它会logging我周围的一些设备的广告数据。 在iOS 8上,我看到的唯一输出是中央pipe理器状态为“已打开”。

在“开机”状态之前,开始扫描外围设备是无效的。 也许在你的iOS7设备上,你很幸运,但是代码仍然不正确。 你的centralManagerDidUpdateState:应该是

 - (void)centralManagerDidUpdateState:(CBCentralManager *)central { switch (central.state) { case CBCentralManagerStateUnsupported: { NSLog(@"State: Unsupported"); } break; case CBCentralManagerStateUnauthorized: { NSLog(@"State: Unauthorized"); } break; case CBCentralManagerStatePoweredOff: { NSLog(@"State: Powered Off"); } break; case CBCentralManagerStatePoweredOn: { NSLog(@"State: Powered On"); [self.manager scanForPeripheralsWithServices:nil options:nil]; } break; case CBCentralManagerStateUnknown: { NSLog(@"State: Unknown"); } break; default: { } } } 

并从didFinishLaunchingWithOptions删除对scanForPeripheralsWithServices的调用

我在构build非常基本的BLE扫描程序时遇到了同样的问题。 添加了所需的方法“centralManagerDidUpdateState”。 但没有任何工作。

我相信问题与queue有关。 将CBCentralManager实例放在dispatch_get_main_queue

这个代码片段可以做到这一点:

  // BLE Stuff let myCentralManager = CBCentralManager() // Put CentralManager in the main queue required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) myCentralManager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()) } 

使用默认的单一视图xCode启动应用程序。 你可以把它放到ViewController.swift文件中:

  import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { // BLE Stuff let myCentralManager = CBCentralManager() var peripheralArray = [CBPeripheral]() // create now empty array. // Put CentralManager in the main queue required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) myCentralManager = CBCentralManager(delegate: self, queue: dispatch_get_main_queue()) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // Mark CBCentralManager Methods func centralManagerDidUpdateState(central: CBCentralManager!) { updateStatusLabel("centralManagerDidUpdateState") switch central.state{ case .PoweredOn: updateStatusLabel("poweredOn") case .PoweredOff: updateStatusLabel("Central State PoweredOFF") case .Resetting: updateStatusLabel("Central State Resetting") case .Unauthorized: updateStatusLabel("Central State Unauthorized") case .Unknown: updateStatusLabel("Central State Unknown") case .Unsupported: println("Central State Unsupported") default: println("Central State None Of The Above") } } func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { println("Did Discover Peripheral") } } 

我的相关问题是通过更新CBCentralManagerDelegate方法签名解决的

 func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) 

 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 

请注意didDiscover\Peripheral参数的不同名称。

另外请注意,由于这不是必需的委托方法,所以没有警告说第一个版本根本没有链接到委托,因此当然也不会被调用。 有了Core方法的所有语法变更和过时的名字/版本/文档/教程,我希望Swift有一个更好的方式告诉编译器你试图使用(有效的)委托方法(除了依靠Auto-thinkletion)