iOS CoreBluetooth:startAdvertising()播发静态数据时出错 [英] iOS CoreBluetooth: startAdvertising() Error advertising static data

查看:505
本文介绍了iOS CoreBluetooth:startAdvertising()播发静态数据时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要播发静态数据。我在iOS上使用的是Swift 2.2.1和CoreBluetooth。我的应用程序构建了蓝牙 Services 及其对应的 Characteristics ,然后调用 startAdvertising(),然后 peripheralManagerDidStartAdvertising90 回调返回了此信息错误:

I want to advertise static data. I'm using Swift 2.2.1 and CoreBluetooth on iOS. My app builds bluetooth Services and their corresponding Characteristics, then calls startAdvertising(), and the peripheralManagerDidStartAdvertising90 callback returns this error:

peripheralManagerDidStartAdvertising encountered an error. // Mine
One or more parameters were invalid. // ...from Apple CoreBluetooth
nil  // ... return value from Apple CoreBluetooth callback

我对Swift和iOS开发还比较陌生,所以我猜我在做些愚蠢的事情,但到目前为止我还不知道要做什么。

I'm relatively new to Swift and iOS development so my guess is that I'm doing something goofy, but so far I can't figure out what.



I'll attempt to distill things down for more experienced eyes.

- - - - - - pointutility.swift - - - - - - -
// This is a code excerpt and probably won't compile.

// UUID for the one peripheral service, declared outside the class:
var peripheralServiceUUID = CBUUID(string: "9BC1F0DC-F4CB-4159-BD38-7375CD0DD545")

// UUID for one characteristic of the service above, declared outside the class:
var nameCharacteristicUUID = CBUUID(string: "9BC1F0DC-F4CB-4159-BD38-7B74CD0CD546")

class PointUtility: NSObject, CBPeripheralManagerDelegate {

var peripheralManager:CBPeripheralManager?
var bluetoothServices:CBMutableService?
var nameCharacteristic:CBMutableCharacteristic?

override init() {
    super.init()
    peripheralManager = CBPeripheralManager(delegate:self, queue:nil)
    bluetoothServices = CBMutableService(type: peripheralServiceUUID, primary: true)
}

func configureUtilityForIdentity(identity:Point!) {
    var characteristicsArray:[CBCharacteristic] = []
    myIdentity = identity

      if (identity.name != nil) {
        nameCharacteristic =
            CBMutableCharacteristic(type: nameCharacteristicUUID,
                properties: (CBCharacteristicProperties.Read),
                value: myIdentity?.name?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false),
                permissions: CBAttributePermissions.Readable)

        characteristicsArray.append(nameCharacteristic!)
      }

    // more characteristics built here and added to the characteristicsArray[]...
    // ... then all are added to the CBMutableService at the bottom...
    bluetoothServices?.characteristics = characteristicsArray as [CBCharacteristic]
}


func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager) {
    switch (peripheral.state) {
    case .PoweredOn:
        print("Current Bluetooth State:  PoweredOn")
        publishServices(bluetoothServices)
        break;
    case .PoweredOff:
        print("Current Bluetooth State:  PoweredOff")
        break;
    case .Resetting:
        print("Current Bluetooth State:  Resetting")
        break;
    case .Unauthorized:
        print("Current Bluetooth State:  Unauthorized")
    case .Unknown:
        print("Current Bluetooth State:  Unknown")
        break;
    case .Unsupported:
        /
        print("Current Bluetooth State:  Unsupported")
        break;
    }
}

func publishServices(newService:CBMutableService!) {
    peripheralManager?.addService(newService)
}

func peripheralManager(peripheral: CBPeripheralManager, didAddService service: CBService, error: NSError?) {

    if (error != nil) {
        print("PerformerUtility.publishServices() returned error: \(error!.localizedDescription)")
        print("Providing the reason for failure: \(error!.localizedFailureReason)")
    }
    else {
        peripheralManager?.startAdvertising([CBAdvertisementDataServiceUUIDsKey : service.UUID])
    }
}

func peripheralManagerDidStartAdvertising(peripheral: CBPeripheralManager,
    error: NSError?) {
        if (error != nil) {
            print("peripheralManagerDidStartAdvertising encountered an error.")
            print(error!.localizedDescription)  // Error: One or more parameters were invalid
            print(error!.localizedFailureReason)  // Error: nil
        }
        print ("Debug: peripheralManagerDidStartAdvertising()")
}
}
- - - - - - pointutility.swift - - - - - - -

我非常感谢您提供的任何帮助。

I really appreciate any assistance offered.

最好的问候

Michael

推荐答案

传递给 startAdvertising 的字典中 CBAdvertisementDataServiceUUIDsKey 的值是 CBUUID 对象,但您只传递了一个 CBUUID 。一旦将其更改为数组,您的代码就可以使用。

The value for the CBAdvertisementDataServiceUUIDsKey in the dictionary passed to startAdvertising is an array of CBUUID objects, but you are only passing a single CBUUID. Once I changed it to an array your code worked.

func peripheralManager(peripheral: CBPeripheralManager, didAddService service: CBService, error: NSError?) {

    if (error != nil) {
        print("PerformerUtility.publishServices() returned error: \(error!.localizedDescription)")
        print("Providing the reason for failure: \(error!.localizedFailureReason)")
    }
    else {
        peripheralManager?.startAdvertising([CBAdvertisementDataServiceUUIDsKey : [service.UUID]])
    }
}

这篇关于iOS CoreBluetooth:startAdvertising()播发静态数据时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆