我当前正在开发一个应用程序,该应用程序充当BLE Central与蓝牙外围设备进行通信。我正在尝试通过加密向Peripheral写入值,这样它就不会被其他人嗅到。
我已将服务和特性声明为NSArray。
myservices = @[[CBUUID UUIDWithString:@"1stServiceUUID"], [CBUUID UUIDWithString:@"2ndServiceUUID"]];
mycharacterstics = @[[CBUUID UUIDWithString:@"1sCharacteristicUUID"], [CBUUID UUIDWithString:@"2ndCharacteristicUUID"]];
当应用在附近找到匹配的服务时,应用会连接它并立即从didDiscoverCharacteristicsForService写入价值
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:mycharacterstics[0]]) {
_discoveredPeripheralCharactersticsNotify = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
if ([characteristic.UUID isEqual:mycharacterstics[1]]) {
_discoveredPeripheralCharactersticsWrite = characteristic;
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
[self.discoveredPeripheral writeValue:testData forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
}
预期结果:
应用程序在前景和后台均向外围设备写入加密的值。
实际结果:
应用程序在前景中:应用程序显示配对请求弹出窗口,用户想要“配对”或“取消”。如果选择“对”,则值将被加密,因此无法监听。如果选择“取消”,则仍写入未加密的值,以便可以对其进行嗅探。
应用程序在后台:应用程序不显示配对请求。无需加密就可以在连接后立即向外围设备写入值。
其他行为:
iOS 10及更低版本:如果应用程序位于前台,并且用户从配对请求弹出窗口中选择“取消”,则应用程序始终会写入加密值;如果应用程序位于后台,则应用程序会随机写入加密值。
我不明白为什么该应用在不同的操作系统版本中会有不同的表现。
问题:
我可以使应用程序始终通过加密来写入值吗?或者如果用户从配对请求弹出窗口中选择“取消”,那么应用程序就不会写入值?
如何根据用户的选择控制配对请求弹出窗口?
在后台运行应用程序时如何控制配对?
谢谢您的帮助。
致谢。