问题描述
我要播发静态数据。我在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()播发静态数据时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!