ios藍(lán)牙封裝以及優(yōu)化

文章結(jié)構(gòu)

  • 藍(lán)牙封裝
  • 自動(dòng)連接
  • 后臺(tái)運(yùn)行
  • 優(yōu)化注意事項(xiàng)
  • 聲明

本篇不對(duì)藍(lán)牙的基本使用做介紹,網(wǎng)上多得跟米一樣。

藍(lán)牙封裝

對(duì)藍(lán)牙進(jìn)行封裝時(shí)候我選擇的是基于代理,有人使用基于block的,我認(rèn)為不好,結(jié)構(gòu)不夠清晰,藍(lán)牙是一系列操作的集合,本人覺(jué)得不大適合使用block進(jìn)行處理;并且藍(lán)牙的基本機(jī)制,比如掃描設(shè)備、連接等封裝成一個(gè)類,在本demo中該類為L(zhǎng)TSBTManager;而基于項(xiàng)目的使用藍(lán)牙進(jìn)行讀寫(xiě)數(shù)據(jù)的使用另外一個(gè)類來(lái)封裝接口,在本dmeo中該類為T(mén)aiJianYiService。
這樣做的好處是容易根據(jù)不同項(xiàng)目進(jìn)行復(fù)用,至于LTSBTManager基本不用針對(duì) 不同項(xiàng)目改變多少,TaiJianYiService(根據(jù)自己項(xiàng)目重命名)類的話可根據(jù)不同項(xiàng)目修改代理以滿足項(xiàng)目需求。

自動(dòng)連接

本人采用的是自動(dòng)連接上次連接過(guò)的設(shè)備,如果是手動(dòng)斷開(kāi)則取消自動(dòng)連接, 但是在連接上后如果是由于藍(lán)牙距離太遠(yuǎn)導(dǎo)致的斷開(kāi)連接,則接近時(shí)采用自動(dòng)連接。

為了實(shí)現(xiàn)自動(dòng)連接,可以使用NSUserDefaults保存上次連接過(guò)的peripheral的UUID。

斷開(kāi)連接后自動(dòng)連接,只需要在藍(lán)牙的代理didDisconnectPeripheral中調(diào)用

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;

即可。

后臺(tái)運(yùn)行

網(wǎng)上有一些使用音樂(lè)后臺(tái)無(wú)限播放或者不短刷新地理位置,這其實(shí)是不行的,如果想要保持后臺(tái)長(zhǎng)時(shí)間運(yùn)行,應(yīng)該間歇性地和設(shè)備保持?jǐn)?shù)據(jù)通信,比如每隔30秒發(fā)送一次數(shù)據(jù),協(xié)議自己定。

優(yōu)化注意事項(xiàng)

  1. 只有在必要的時(shí)候才打開(kāi)掃描,因?yàn)樗{(lán)牙掃描是比較耗電的。
  2. 在搜索服務(wù)和特征時(shí)候,只搜索關(guān)心的服務(wù)和特征,而不應(yīng)該全局搜索,不管是從程序性能還是電池使用上都是不好的。
  3. 當(dāng)peripheral發(fā)現(xiàn)了特征(characteristic),需要監(jiān)測(cè)某個(gè)特征值時(shí),如果特征值基本不會(huì)改變或者不經(jīng)常性改變,則調(diào)用以下接口:
- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;

如果某個(gè)特征值經(jīng)常性改變,則應(yīng)該采用訂閱方式監(jiān)測(cè)該特征值,調(diào)用以下接口:

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
  1. 重連方式:(1)重新獲取已發(fā)現(xiàn)的設(shè)備列表(搜索到的或是連接過(guò)的設(shè)備),使用 retrievePeripheralsWithIdentifiers: 。如果列表中有想要尋找的設(shè)備,那么發(fā)起連接。
    注意:可能有多種原因?qū)е略O(shè)備不能被連接上。比如,設(shè)備不在附近。還有一種可能,一些低功耗藍(lán)牙使用隨機(jī)設(shè)備地址,在重新連接時(shí),它的地址可能已經(jīng)變了。因此,即使設(shè)備就在附近,設(shè)備的地址也已經(jīng)變了,這種情況下,你想要連接的設(shè)備與實(shí)際設(shè)備已經(jīng)不匹配了。這種情況,你只有重新搜索了。
    (2)重新獲取當(dāng)前連接著的設(shè)備列表,使用retrieveConnectedPeripheralsWithServices:。 如果列表中有想要尋找的設(shè)備,發(fā)起本地連接,使得應(yīng)用與之連接上。檢查你想要連接的設(shè)備是否已經(jīng)連接到系統(tǒng)了(即可能其他應(yīng)用正連著呢)。

聲明

  1. 這只是一個(gè)demo,不可能拿過(guò)來(lái)就能用,而且我已經(jīng)把藍(lán)牙的數(shù)據(jù)封裝部分去掉了,但是里面引用的類以及頭文件沒(méi)有刪除,因項(xiàng)目需要的話,替換成自己定義的類即可。
  2. demo里的自動(dòng)連接時(shí)候,沒(méi)有進(jìn)行掃描,如果項(xiàng)目需要的話,需要自行掃描然后刷新UI。

demo

謝謝你的垂閱,歡迎下載交流!

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 剛讀到一段關(guān)于愛(ài)情的文字: 【愛(ài)情,不是要找一個(gè)最好的人,而是要找一個(gè)對(duì)你最好的人。不一定要嫁給最愛(ài)的,太愛(ài)一個(gè)人...
    Asia劉閱讀 215評(píng)論 0 0
  • 終于回到故鄉(xiāng)了,熟悉又陌生的景色,一直到處亂跑,拿起手機(jī)咔咔咔。哈哈。 都是手機(jī)拍的,VSCO后期。 ——————...
    匪玉閱讀 1,014評(píng)論 49 39
  • 安以北往南閱讀 413評(píng)論 1 0
  • 今天我去接孩子放學(xué),看見(jiàn)兒子高興極了,他對(duì)我說(shuō),媽媽我今天受到了老師的夸獎(jiǎng),因?yàn)闆](méi)有獎(jiǎng)狀了,老師還獎(jiǎng)勵(lì)了我三個(gè)本子...
    潘卓毅媽媽閱讀 264評(píng)論 0 1

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