iOS 13那些默默無聞的坑

引言

關(guān)于iOS 13適配,有非常多寫的很不錯(cuò)的文章,本文主要討論iOS 13對(duì)于藍(lán)牙開發(fā)其中一個(gè)影響

下面是一個(gè)小編認(rèn)為關(guān)于iOS 13適配寫得畢竟詳細(xì)得文章,以供參考

iOS 13適配

正題

藍(lán)牙開發(fā)中,從藍(lán)牙設(shè)備獲取到的數(shù)據(jù),都是以NSData的形式接收,有的時(shí)候需要將NSData數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的十六進(jìn)制字符串進(jìn)行操作。例如,定義設(shè)備名稱為廠商數(shù)據(jù)的某一個(gè)位置開始的N個(gè)字節(jié)

方案一

NSData利用initWithData:encoding:將數(shù)據(jù)用UTF8解碼轉(zhuǎn)換成字符串

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

或者

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

使用這兩種方式會(huì)出現(xiàn)轉(zhuǎn)換出來的stringnil的情況,這是由于NSData數(shù)據(jù)本身并不是字符串,所以使用UTF8轉(zhuǎn)碼并不能夠如你所愿,將NSData轉(zhuǎn)換為需要的字符串,使用這個(gè)API要求所操作的NSData數(shù)據(jù)本身就是以字符串的形式傳輸過來的,這樣才能正常使用UTF8轉(zhuǎn)碼轉(zhuǎn)換成對(duì)應(yīng)的字符串

方案二

利用字符串格式化功能進(jìn)行轉(zhuǎn)換

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

注意:使用這種方式進(jìn)行轉(zhuǎn)換,在iOS 13之前是不會(huì)有問題的,能夠進(jìn)行正常的轉(zhuǎn)換,但是iOS及以上版本則會(huì)出現(xiàn)問題,代碼如下:

   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以下運(yùn)行結(jié)果:

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

iOS 13及以上版本運(yùn)行結(jié)果:

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

在iOS 13上并不會(huì)像之前那樣現(xiàn)實(shí)NSData的真正內(nèi)容,而是顯示數(shù)據(jù)長(zhǎng)度和對(duì)應(yīng)內(nèi)容的地址,因此使用這種方式轉(zhuǎn)換,并不會(huì)得到想要內(nèi)容的字符串!

劃重點(diǎn)!劃重點(diǎn)!劃重點(diǎn)!
對(duì)于這種情況,可以用以下方式進(jìn)行轉(zhuǎn)換

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輸出結(jié)果如下:

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

OK!搞定!下面就可以根據(jù)自己的需要進(jìn)行操作了。

感謝觀眾老哥的閱讀 _

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,668評(píng)論 1 32
  • 在你和別人說話的時(shí)候,你以為你想說什么就說什么,不需要技巧和加工,只需要直抒胸臆就好?或許大部分人都是認(rèn)同這個(gè)做法...
    藍(lán)貓的季節(jié)閱讀 320評(píng)論 0 0
  • 距離高考還有15天,很多學(xué)校設(shè)法讓學(xué)生調(diào)適心態(tài),調(diào)整狀態(tài)。沒辦法,考前焦慮、緊張是必然的。我們都明白,不要指望我們...
    高進(jìn)儒閱讀 634評(píng)論 0 0
  • 人生百態(tài),正如月季開來開敗再開來。 月月花開,月月等待。
    醫(yī)塵閱讀 403評(píng)論 0 2
  • 英語導(dǎo)圖學(xué)習(xí)第21天,仿佛又回到初中學(xué)習(xí)英語的時(shí)代。而今天是通過尹航老師以導(dǎo)圖的形式,讓我這樣英語基礎(chǔ)很差的...
    Gervase閱讀 493評(píng)論 0 0

友情鏈接更多精彩內(nèi)容