【问题标题】:didDiscoverPeripheral "fail to build" errordidDiscoverPeripheral“构建失败”错误
【发布时间】:2015-10-13 03:20:14
【问题描述】:

我不确定为什么此代码无法构建,并且错误消息似乎很神秘。

代码:

var centralManager: CBCentralManager!;
var nrf8001Peripheral: CBPeripheral!;

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // initialize centralManager
    self.centralManager = CBCentralManager(delegate: self, queue: nil);

    // start scanning for device
    self.centralManager.scanForPeripheralsWithServices([UART_SERVICE_UUID], options:nil);
}

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

            //print out the name of the scanned peripheral
            print("Discovered \(peripheral.name)")

            //print out the UUID of the scanned peripheral
            print("NSUUID string \(peripheral.identifier.UUIDString)")

            //stop scanning when found
            self.centralManager.stopScan()

            //connect when found
            self.centralManager.connectPeripheral(peripheral, options:nil);
}

我从 XCode 编译器收到的错误是:

“由方法'centralManager(:didDiscoverPeripheral:advertisementData:RSSI:)'提供的Objective-C方法'centralManager:didDiscoverPeripheral:advertisementData:RSSI:'与可选要求方法'centralManager(:didDiscoverPeripheral)冲突:advertisementData:RSSI:)' 在协议 'CBCentralManagerDelegate'"

通过查看 CoreBluetooth 文档,方法语法和参数似乎是正确的,并且参数的可选性直接从规格表中复制:https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBCentralManagerDelegate_Protocol/#//apple_ref/occ/intfm/CBCentralManagerDelegate/centralManager:didDiscoverPeripheral:advertisementData:RSSI

任何帮助将不胜感激!谢谢

根据 cmets:

  1. 使用 XCode 7 测试版
  2. 当我将函数声明更改为:

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

我仍然遇到同样的构建错误。

  1. 我的 centralManagerDidUpdateState:方法是

    func centralManagerDidUpdateState(central: CBCentralManager) {
    
    print("centralManagerDidUpdateState:");
    
    switch (central.state) {
    
        case .PoweredOff:
            print("CBCentralManagerStatePoweredOff");
    
        case .Resetting:
            print("CBCentralManagerStateResetting");
    
        case .PoweredOn:
            print("CBCentralManagerStatePoweredOn");
    
        //scan for peripheral devices
        self.centralManager.scanForPeripheralsWithServices([UART_SERVICE_UUID], options:nil);
    
        case .Unauthorized:
            print("CBCentralManagerStateUnauthorized");
    
        case .Unsupported:
            print("CBCentralManagerStateUnsupported");
    
        default:
            print("CBCentralManagerStateUnknown");
        }
    }
    

【问题讨论】:

  • 您使用的是哪个 Xcode 版本?如果你使用的是 7,这个方法的参数应该都是非可选的。
  • 可能你忘记实现 centralManagerDidUpdateState: 方法
  • @0x7fffffff 谢谢,取出所有函数声明中的所有选项,但仍然无法构建。
  • @jinhualio 也有上面显示的 centralManagerDidUpdateState 方法。
  • 你有两个在这个类中声明的签名相同的方法吗?有没有可能是你复制粘贴了忘记删除旧的?

标签: ios swift core-bluetooth


【解决方案1】:

感谢您的建议;我最终通过 XCode 7 文档找到了答案。以下函数的 XCode 6 语法如下:

func centralManagerDidUpdateState(central: CBCentralManager!) {}

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData advertisementData: [NSObject : AnyObject]!, RSSI RSSI: NSNumber) {}

func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {}

func centralManager(central: CBCentralManager!, didDisconnectPeripheral peripheral: CBPeripheral!, error: NSError!) {}

func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!) {}

func peripheral(peripheral: CBPeripheral!, didDiscoverCharacteristicsForService service: CBService!, error: NSError!) {}

func peripheral(peripheral: CBPeripheral!, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic!, error: NSError!) {}

func peripheral(peripheral: CBPeripheral!, didUpdateValueForCharacteristic characteristic: CBCharacteristic!, error: NSError!) {}

但是,这些函数将与 XCode 7 CoreBluetooth 库声明冲突。

注意可选项数据类型的不同用途。

(XCode 6) error:NSError! vs. (XCode 7) error:NSError?

(XCode 6) advertisementData : [NSObject : AnyObject]! vs. (XCode 7) advertisementData [String : AnyObject]

XCode 7 beta 的相应函数声明实际上如下:

func centralManagerDidUpdateState(central: CBCentralManager) {}

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

func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {}

func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {}

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {}

func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) {}

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {}

func peripheral(peripheral: CBPeripheral, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic, error: NSError?) {}

func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) {}

希望这对遇到相同问题的其他人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2016-12-17
    • 2013-02-16
    • 2021-08-09
    相关资源
    最近更新 更多