iOS 13那些默默無聞的坑

2021-10-06 19:03:04 字數 2206 閱讀 5510

引言

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] = ;

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:

string:

在ios 13上並不會像之前那樣現實nsdata的真正內容,而是顯示資料長度和對應內容的位址,因此使用這種方式轉換,並不會得到想要內容的字串!

劃重點!劃重點!劃重點!

對於這種情況,可以用以下方式進行轉換

nsmutablestring *string = [[nsmutablestring alloc] initwithcapacity:[data length]];

[data enumeratebyterangesusingblock:^(const void *bytes, nsrange byterange, bool *stop) else

}}];

nslog(@"\nmutastring:%@", string);

ios 13輸出結果如下:

2019-11-29 18:22:06.298658+0800 try[14322:3711043] 

mutastring:00010203

ok!搞定!下面就可以根據自己的需要進行操作了。

ios13 購物車優化

03 綜合練習 import viewcontroller.h inte ce viewcontroller 購物車 property weak,nonatomic iboutlet uiview shopcarview 新增按鈕 property weak,nonatomic iboutlet u...

ios13 購物車優化

03 綜合練習 import viewcontroller.h inte ce viewcontroller 購物車 property weak,nonatomic iboutlet uiview shopcarview 新增按鈕 property weak,nonatomic iboutlet u...

iOS 13 繞過鎖屏密碼漏洞

ios 13 很快就要發布了,在未正式發布之前,西班牙的安全研究員 jose rodriguez 公開了乙個漏洞,能夠查繞過鎖屏密碼檢視通訊錄 簡訊。據了解,ios 其他的版本也有類似的漏洞,已知的有 ios 6.1 ios 7 ios 8.1 和 ios 12.1 也有類似的安全漏洞。jose r...