iOS 13那些默默无闻的坑

引言

关于iOS 13适配,有非常多写的很不错的文章,本文主要讨论iOS 13对于蓝牙开发其中一个影响

下面是一个小编认为关于iOS 13适配写得毕竟详细得文章,以供参考

iOS 13适配

正题

蓝牙开发中,从蓝牙设备获取到的数据,都是以NSData的形式接收,有的时候需要将NSData数据转换为对应的十六进制字符串进行操作。例如,定义设备名称为厂商数据的某一个位置开始的N个字节

方案一

NSData利用initWithData:encoding:将数据用UTF8解码转换成字符串

 

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

或者

 

NSString *string = [[NSString alloc] initWithBytes:data.bytes length:sizeof(data.bytes) encoding:NSUTF8StringEncoding];

使用这两种方式会出现转换出来的stringnil的情况,这是由于NSData数据本身并不是字符串,所以使用UTF8转码并不能够如你所愿,将NSData转换为需要的字符串,使用这个API要求所操作的NSData数据本身就是以字符串的形式传输过来的,这样才能正常使用UTF8转码转换成对应的字符串

方案二

利用字符串格式化功能进行转换

 

NSString *string = [NSString stringWithFormat:@"%@", data];

注意:使用这种方式进行转换,在iOS 13之前是不会有问题的,能够进行正常的转换,但是iOS及以上版本则会出现问题,代码如下:

 

   uint8_t param[4] = {0x00,0x01,0x02,0x03};
   NSData *data = [NSData dataWithBytes:param length:4];
   NSString *string = [NSString stringWithFormat:@"%@", data];
   NSLog(@"\ndata:%@\nstring:%@\n", data,string);

iOS 13以下运行结果:

 

2019-11-29 17:58:46.452876+0800 Try[14226:4305384] 
data:<00010203>
string:<00010203>

iOS 13及以上版本运行结果:

 

2019-11-29 18:05:30.485160+0800 Try[14120:3702326] 
data:{length = 4, bytes = 0x00010203}
string:{length = 4, bytes = 0x00010203}

在iOS 13上并不会像之前那样现实NSData的真正内容,而是显示数据长度和对应内容的地址,因此使用这种方式转换,并不会得到想要内容的字符串!

划重点!划重点!划重点!
对于这种情况,可以用以下方式进行转换

 

NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
   [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
       unsigned char *dataBytes = (unsigned char*)bytes;
       for (NSInteger i = 0; i < byteRange.length; i++) {
           NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
           if ([hexStr length] == 2) {
               [string appendString:hexStr];
           } else {
               [string appendFormat:@"0%@", hexStr];
           }
       }
   }];
NSLog(@"\nmutaString:%@", string);

iOS 13输出结果如下:

 

2019-11-29 18:22:06.298658+0800 Try[14322:3711043] 
mutaString:00010203

OK!搞定!下面就可以根据自己的需要进行操作了。

 

你可能感兴趣的:(IOS)