在上一篇《Android BLE开发常见问题及解决方法》文章中我相信帮助了很多的小伙伴, 那么在这篇《iOS BLE开发常见问题及解决方法》文章希望还能帮助到你!
1、安装导入问题及解决方法
1.1 安装了 pods 的 xcode 导入蓝牙库运行报错
按照下面的步骤查看,TARGETS->Build Phases->Compile Sources,看是否导入了 DeviceInfo.m 文件,如果导入了 DeviceInfo.m 文件,删除后再运行即可。
2、扫描设备问题
2.1 如何获取设备的 MAC 地址?
如今的 iOS 系统已经没有允许开发者获取设备 MAC 地址的权限了,如果在开发过程中,需要用到设备的 MAC 地址信息,可以通过底层修改广播数据,将设备的 MAC 地址存放在广播数据中的厂商数据里面,这样,我们在扫描的时候,就可以通过解析广播数据来获取设备的 MAC 地址信息;
2.2 扫描不到设备?
检查是否在 viewDidLoad 方法里面马上调用了扫描方法,如果是,修改成在 viewWillApper 方法里面延时1s 左右后开始扫描。
3、数据收发的问题
3.1 无法修改模块名称的问题
情况1:修改名称不成功
检查使用的是哪个版本的 API 文件,V2.9以前的版本(包括 V2.9)存在无法修改名称的问题,这个问题已经在V3.0(包括 V3.0)后的版本中得到修复;
情况2:无法将名称修改为中文
在V3.0中,模块的名称是无法改为中文的,因为在这个版本中,字符编码是 ASCII 码,而中文不存在 ASCII 码,所以在修改的时候会失败,这个 bug 在3.1及后续的版本中会得到修复,那V3.0版本就要手动将字符编码转换为UTF-8编码,这样就能解决要修改的名称即包含中文也包含英文的情况。
注意:修改模块名称之后,需要重启 iPhone 的蓝牙并连接设备,然后断开,再重新扫描,设备的名称就刷新过来了。
3.2 数据发送不成功的问题
首先确认模块收发数据是否是加密的模式,确认完毕后,根据模块收发数据的类型设置 isEncryption属性的值,默认该属性为 YES,当属性值为 YES 时, API 会以加密的方式发送数据,为 NO 时,会以不加密的方式发送数据。
3.3 APP端收不到模块发送的数据
情况1:确认加密方式
确认模块发送数据的方式是加密还是非加密,然后根据问题2中的方式设置 isEncryption 属性;
情况2:确认对应通道的 notify 是否打开
可以在 -(void)bleManagerPeripheral:(CBPeripheral*)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error这个回调方法里面确定通道 notify 是否打开(注:该回调方法在 V3.0 及以上版本中才能使用)。
3.4 APP接收的数据参差不齐
开发中可能模块会持续向APP发送多笔数据,而每发送两笔数据,之间的间隔又比较短(一般小于等于30ms),且每笔数据不满20字节(模块数据加密的话不满17字节),这时候APP接收的数据可能是被拆分并重新组装后的数据,比如非加密模块,每次发送17字节,快速发送5次,APP第一次可能会收到20字节, 而多出来的3字节是模块端第二次发送的前3字节, 后面的数据也可能被类似这样拆分,APP接收数据的次数便小于5,而APP接收的数据整体顺序是没问题的,这种情况要避免数据被拆分,要么模块增大发送间隔,要么模块每次发送的数据补足20字(数据加密的话补足17字节)。
3.5 如何在不使用我司蓝牙库对数据加解密
如果客户在开发过程中,直接使用的是系统的<CoreBluetooth>框架,而模块数据是加密的,这时就需要 APP 端在发送数据时进行加密,在接收数据时进行解密,在这种情况下,可以单独使用我们的加密库TTC_Ble_Encryption_lib。具体如下
加密使用方法:+ (NSData *)decryption:(NSData *)data.
解密使用方法:+ (NSData *)encryption:(NSString *)string.
Susan Yang:
谢谢分享!