我有两个程序,一个用于Mac,一个用于iOS。当我从Mac连接到iOS设备时,它会找到我想要的服务以及我想要的特性。找到特征后,我使用peripheral.setNotifyValue(true, forCharacteristic: characteristic)
,但是在iOS端没有调用peripheralManager:central:didSubscribeToCharacteristic:
方法。当我检查characteristic.isNotifying
是否为假时。根据我的理解,当我将notify值设置为true时,它应该是通知,每当我更改值时,都是更新。为什么不更新?提前谢谢。
以下是设置相关特征的代码 -
self.characteristic = CBMutableCharacteristic(type: UUID_CHARACTERISTIC, properties: CBCharacteristicProperties.Read, value: self.dataToSend, permissions: CBAttributePermissions.Readable)
theService = CBMutableService(type: UUID_SERVICE, primary: true)
theService.characteristics = [characteristic]
self.peripheralManager.addService(theService)
答案 0 :(得分:0)
如果您希望您的特性支持notify
操作,那么您需要在其属性上设置它 -
self.characteristic = CBMutableCharacteristic(type: UUID_CHARACTERISTIC, properties: CBCharacteristicProperties.Read|CBCharacteristicProperties.Notifiy, value: self.dataToSend, permissions: CBAttributePermissions.Readable);
Core Bluetooth会忽略尝试在未声明支持通知的特性上设置通知。
另外,请注意,通过在创建特征时设置值,您将来无法更改此特征的值 - 因此通知有点无意义。如果您希望能够更改值,则必须在创建特征时为nil
指定value
。
来自CBMutableCharacteristic
文档 -
讨论
如果为特征指定值,则值为 缓存,其属性和权限设置为 CBCharacteristicPropertyRead和CBAttributePermissionsReadable, 分别。因此,如果你需要一个特征的值 是可写的,或者如果你期望在生命周期中价值发生变化 对于特征所属的已发布服务,您必须 将值指定为nil。这样做可以确保价值 每当时动态处理并由外围设备管理器请求 外围设备管理器从a接收读或写请求 中央。当外围设备管理器收到读或写请求时 从中心,它调用peripheralManager:didReceiveReadRequest: 或者peripheralManager:didReceiveWriteRequests:它的方法 委托对象,分别。