? ? ? ? 關(guān)于ExternalAccessory這個框架志电,我就不多說,有很多介紹ExternalAccessory.framework這個框架的文章,在簡書中就能找出很多瓢姻,比如這里暴氏,就是一篇講的非常好的延塑。我要介紹的是關(guān)于ExternalAccessory.framework這個框架我在開發(fā)中遇到的坑。
一答渔、系統(tǒng)方面變化
? ? ? ?最開始接觸這個框架是在ios9的時候关带,我要維護一個關(guān)于這個項目的框架,所以也查了關(guān)于這個框架的資料(那個時候這方面的資料還是很少的)沼撕,結(jié)合我需要維護的項目以及蘋果給的AEDemo豫缨,就開始試著自己重新寫一個一樣的項目出來。首先是導(dǎo)入框架端朵,然后注冊通知好芭,然后根據(jù)通知的回調(diào)知道是否有設(shè)備連接上(藍牙設(shè)備連接了,也是會有提示的冲呢,會走通知的方法的)舍败。
? ? ? ? 然后來說說這個通知,在ios9之前敬拓,link:這個方法會跑兩遍邻薯,也就是會有兩個設(shè)備連接,只是連接一個Lightning設(shè)備乘凸,為啥會有兩個設(shè)備連接呢厕诡?這個我也不知道。用蘋果提供的AEdome可以很清楚的看到確實是有兩個設(shè)備連接的营勤,如果點擊進去看呢灵嫌,會發(fā)現(xiàn)modeName是不同的,一個是mcu根據(jù)產(chǎn)品信息燒錄進去的葛作,還有一個呢叫做X90寿羞。而且一個是有協(xié)議(這個協(xié)議我會在下面說),另外一個是沒有協(xié)議的赂蠢。所以是可以根據(jù)協(xié)議去判斷是去跟那個設(shè)備進行通信绪穆。
? ? ? ? 在ios10的時候啊,貌似蘋果對ExternalAccessory做了一些調(diào)整,link這個方法只會跑一次了玖院,也就是只會連接一次了菠红,但是呢,modeName這個屬性查到是x90了难菌,在設(shè)置->關(guān)于本機中去看呢试溯,又是顯示是正確的,我跑去問了下mcu工程師扔傅,他說他那邊沒啥錯誤耍共,但是框架里只有這個屬性能看到。最后沒辦法了猎塞,只好跟mcu工程協(xié)商了一下试读,增加一條協(xié)議,在建立通信連接的時候發(fā)送查詢指令查詢modeName(版本號也是這樣的荠耽,也可以用這個方法來查)钩骇。
? ? ? ? 最后就是ios11了,我覺得是最坑的了铝量,link方法會跑一次倘屹,然后協(xié)議也是正確的,都已經(jīng)建立通信連接了慢叨,可以發(fā)送數(shù)據(jù)了纽匙,但是呢disconnect方法也執(zhí)行了,然后又斷開了連接拍谐,然后又調(diào)用了一次link方法烛缔。這種效果跟在設(shè)置->關(guān)于本機中看設(shè)備出現(xiàn)的效果有點像。但是我發(fā)現(xiàn)不知道是我代碼的原因還是什么原因轩拨,導(dǎo)致session = nil践瓷,我弄了一兩天,也沒找到原因亡蓉,最后因為項目有點趕晕翠,所以,我就獲取系統(tǒng)版本號砍濒,ios11做了單獨的處理淋肾。
再說最后一點,如果是插lightning設(shè)備梯影,然后再啟動App巫员,那么是不會走link方法,需要用
?[[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]];這個方法去獲取甲棍。這個方法會返回一個數(shù)組,里面包含已經(jīng)連接上的設(shè)備(不要問我什么還要說這個)。
二感猛、協(xié)議
? ? ? ? 另外七扰,再來說說協(xié)議,記住一定要在plist文件中增加協(xié)議陪白,不然session也是會等于nil的颈走。一般是先獲取到設(shè)備里面的協(xié)議進行對比,如果協(xié)議是正確的就建立通信咱士。當然我是因為公司有很多產(chǎn)品立由,都用了同一個協(xié)議,所以我就增加了另外兩個參數(shù)序厉,ModeName以及name锐膜。
? ? ? ? 再有,就是在設(shè)備里面讀取到了2個協(xié)議一個自己公司定義的協(xié)議弛房,另外還多了一個協(xié)議道盏,估計是蘋果給的協(xié)議,有可能是蘋果強制加上去的通用協(xié)議文捶,也有可能是MCU工程師沒有將原本有的這個協(xié)議刪除荷逞。
三、后臺處理
App進入后臺時粹排,我測試到有時會丟失發(fā)送的數(shù)據(jù)种远,但是有時候又能正常使用,因為我不知道具體的通信方式是如何 的顽耳,所以我在后臺做了處理坠敷,每次進入后臺就停止發(fā)送,回到前臺時斧抱,重新開始發(fā)送數(shù)據(jù)常拓,確保數(shù)據(jù)不會漏發(fā)。
只要在下圖勾選如下圖所示辉浦,可以APP后臺發(fā)數(shù)據(jù)
最近發(fā)現(xiàn)一本書《Building iPhone OS Accessories: Use the iPhone Accessories API to Control 》是關(guān)于EA框架的弄抬,大家可以去看看
四、Could‘t find the ''com.apple.private.externalaccessory.showallaccessories'' entitlement
在iOS10之前是不會在運行l(wèi)og中出現(xiàn)這個提示宪郊,但是進過我的測試發(fā)現(xiàn)并沒有什么影響掂恕,在蘋果論壇中也有帖子討論這個問題。
五弛槐、線程鎖死
如果發(fā)現(xiàn)能與APP進行通訊設(shè)備懊亡,沒改什么代碼缺不能通訊了,設(shè)備接入?yún)s發(fā)現(xiàn)設(shè)備通知方法都不走了乎串,連設(shè)置——通用——關(guān)于本機中也看不到設(shè)備了(或者沒插任何設(shè)備卻還是有設(shè)備)店枣,那么就是外部連接線程鎖死了,重啟一下就好了。建議不能通信的時候最好是看下關(guān)于本機中有沒有設(shè)備顯示鸯两,如果設(shè)置中有設(shè)備顯示闷旧,那么基本上就可以確定是程序出現(xiàn)問題了。
注:這些都是開發(fā)時查找到的資料和自己的一些總結(jié)钧唐,如果看到到相關(guān)資料或者繼續(xù)有其他的總結(jié)忙灼,有些問題我可能忘記了,如果想起來也會繼續(xù)更新钝侠。上面有錯誤的地方也請大家告訴我该园,我會馬上更正帅韧,還有就是上面這些坑出現(xiàn)的原理知道的話,也請大家告訴我弱匪,我也會更新的青瀑。