2

根据Swift 2.0 文档CLBeaconRegion应该仍然可以将peripheralDataWithMeasuredPower:方法startAdvertising:的输出传递给CLPeripheralManager.

获取信标广告数据

- peripheralDataWithMeasuredPower:

检索可用于将当前设备宣传为信标的数据。

宣言

迅速

func peripheralDataWithMeasuredPower(_measuredPower: NSNumber?) -> NSMutableDictionary

目标-C

- (NSMutableDictionary<NSString *,id> * _Nonnull)peripheralDataWithMeasuredPower:(NSNumber * _Nullable)measuredPower

参数

measuredPower 设备的接收信号强度指示器 (RSSI) 值(以分贝为单位)。该值表示从一米外测得的信标强度,并在测距期间使用。指定nil使用设备的默认值。

返回值

可以与 a 结合使用的数据字典,CBPeripheralManager以将当前设备宣传为信标。

讨论

返回的字典对信标的识别信息以及广告信标所需的其他信息进行编码。您不需要直接访问字典内容。将字典传递给 a 的startAdvertising:方法 CBPeripheralManager以开始宣传信标。

可用性

在 iOS 7.0 及更高版本中可用。

然而,peripheralDataWithMeasuredPower:返回 an NSMutableDictionarywhile 的startAdvertising:方法CLPeripheralManager接受一个 Swift 字典[String : AnyObject]?,尽管文档声称它接受一个NSDictionary. 以下代码在 Swift 1.0 中有效:

// Set up a beacon region with the UUID, Major and Minor values
let region = CLBeaconRegion(proximityUUID:beaconUUID!, major:withMajor.unsignedShortValue, minor:withMinor.unsignedShortValue, identifier:"com.example.beacon")

// Attempt to set up a peripheral with the measured power
let peripheralData = region.peripheralDataWithMeasuredPower(withPower) 
_peripheralManager!.startAdvertising(peripheralData)

在 Swift 2.0 中,相同的代码编译失败并出现警告: 编译失败,出现警告:

NSDictionary不能转换为[String : AnyObject]; 你的意思是as!用来强迫沮丧吗?

但是,强制向下转换总是失败。

这是文档错误,Swift 2.0 中的错误,还是我遗漏了什么?

4

1 回答 1

3

问题似乎NSMutableDictionary是不容易转换为 Swift 的Dictionary,但NSDictinoary确实如此。所以我最终将其转换NSMutableDictionaryNSDictinoary第一个:

let pd = NSDictionary(dictionary: region.peripheralDataWithMeasuredPower(nil))
         as! [String: AnyObject]
peripheralManager.startAdvertising(pd)

它有效!

于 2015-10-06T14:18:30.353 回答