iOS 8核心蓝牙无法发现外围设备
我无法让Core Bluetooth发现iOS 8上的外围设备。相同的代码在iOS 7设备上工作正常。起初,我认为这将是一个权限问题,因为我一直在做一些iBeacon工作,并且iOS 8上的核心位置权限发生了一些变化。然而,我找不到任何在线帮助。这里是为我在iOS 7,但不是在iOS 8正常工作的示例项目链接:iOS 8核心蓝牙无法发现外围设备
https://github.com/elgreco84/PeripheralScanning
如果我在iOS 7设备上运行这个项目它会记录广告数据的数量的我周围的设备。在iOS 8上,我看到的唯一输出是中央管理器状态为“已打开”。
直到处于'开机'状态时才开始扫描外设。也许在你的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
非常感谢。你救了我把我的人力资源管理系统从窗口扔出去。 – Craimasjien 2014-10-15 15:41:37
我做到了,但有时候,并非所有的时间,'didDiscoverPeripheral'根本没有被调用 - - 真的很困惑。 – Zennichimaro 2015-05-20 07:34:09
但对我来说,它调用didDiscoverPeripheral方法很晚,在iOS 8中,如何修理它? – 2015-09-07 12:29:19
我碰到了同样的问题,同时建立一个非常基本的BLE扫描仪应用中移除调用scanForPeripheralsWithServices
。添加了所需的方法“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")
}
}
我的相关问题从
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber)
解决通过更新CBCentralManagerDelegate
方法签名
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)
注的不同名称didDiscover\Peripheral
参数。
此外,请注意,由于这不是必需的委托方法,因此根本没有关于第一个版本根本没有链接到委托的事实的警告,因此(当然)永远不会被调用。有了Core方法的所有语法变更和过时的名称/版本/文档/教程,我希望Swift有更好的方法告诉编译器你试图使用(有效)委托方法(除了依靠自动思考)
[CBCentralManager的状态何时会启动但仍然给我一个“未通电”的警告?](http://stackoverflow.com/questions/17118534/when-would-cbcentralmanagers-state-ever-被启动,但仍然给我不) – 2014-09-01 19:58:35