iOS Ble開發(fā)的問題

? ? 最近在進(jìn)行低功耗藍(lán)牙SDK的開發(fā),為了方便快捷,使用了BabyBluetooth庫(kù),整個(gè)開發(fā)都比較順利,但是在測(cè)試的時(shí)候發(fā)現(xiàn)一個(gè)很奇怪的問題。App在被用戶主動(dòng)殺掉的時(shí)候,設(shè)備會(huì)斷開ble的連接,但是如果是app crash的時(shí)候,app已經(jīng)斷開了ble的連接了,但是設(shè)置里面還是顯示連接著外設(shè),這樣就導(dǎo)致了一個(gè)問題,因?yàn)閎le外設(shè)作為邊緣設(shè)備一次只能被一個(gè)設(shè)備連接上,而且在連接上時(shí)其他手機(jī)是掃描不到這款ble外設(shè)的,所以在那種場(chǎng)景下,其他的手機(jī)掃描不到外設(shè),必須要將連接ble的手機(jī)斷開了,或者打開crash的app,手動(dòng)殺掉才能正常斷開外設(shè)的連接。

? ? 這個(gè)問題很尷尬,很多人會(huì)說(shuō),app既然上線了,就要保證基本不crash吧,總不能把這種case作為一種正常的測(cè)試用例。理論上是這樣的,但是沒辦法保證100%不crash,而且我很奇怪,究竟是什么原因?qū)е铝诉@個(gè)問題。為了搞清楚這個(gè)問題,我先咨詢了固件開發(fā),發(fā)現(xiàn)crash了他們沒有任何辦法去監(jiān)測(cè)到,所以想要固件去主動(dòng)斷開連接是不可能的,問題還是出在app端。我去網(wǎng)上下了一個(gè)BabyBluetooth的官方demo,用這個(gè)demo去連接外設(shè),發(fā)現(xiàn)也是會(huì)出現(xiàn)上面所說(shuō)的問題的,我這個(gè)時(shí)候才有點(diǎn)開始懷疑是不是BabyBluetooth庫(kù)有問題,因?yàn)檫@個(gè)庫(kù)使用很方便,不需要考慮CBCentralManager等,庫(kù)里都實(shí)現(xiàn)好了,一般用起來(lái)也沒什么問題。正當(dāng)我準(zhǔn)備去搞一個(gè)使用CoreBluetooth的demo時(shí),我想著是不是CBCentralManager的初始化做了什么,然后我就去看了源碼,一看我才恍然大悟。

? ? 我們?cè)陂_發(fā)Ble的時(shí)候,外面都設(shè)置Background mode,如圖1所示。

圖1


圖2

在CBCentralManager初始化時(shí),會(huì)判斷圖1是否勾選上,加上一個(gè)CBCentralManagerOptionRestoreIdentifierKey的初始化。這個(gè)key是給中心管理者提供一個(gè)字符串作為“恢復(fù)標(biāo)識(shí)”,在系統(tǒng)重啟app時(shí)恢復(fù)你的中心或周邊角色,這個(gè)key在這里不做討論,但是就是因?yàn)樵O(shè)置了這個(gè)key,導(dǎo)致了crash之后,設(shè)置里不會(huì)斷開ble的連接。這個(gè)key在之前的項(xiàng)目中都用過,但是沒有意識(shí)到會(huì)導(dǎo)致這個(gè)問題。

? ? 很多時(shí)候都是一個(gè)細(xì)節(jié)引發(fā)了一個(gè)百思不得其解的問題,所以還是要理解透徹才能一目了然問題的原因。

?著作權(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ù)。

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