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!搞定!下面就可以根據自己的需要進行操作了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章