最近做了個app藍牙連接打印機打印的功能认轨,感覺這方面的東西網(wǎng)上的不多,所以寫一篇文章存?zhèn)€檔饿肺。
因為我本人也是第一次接觸藍牙方面的功能,所以一開始也是各種百度唧喉,最后找到了大神寫好的一個藍牙庫,叫BLEPrinter。了解清楚其中原理之后法挨,直接用上項目了。
首先第一步就是連接打印機了兄旬,這一步用了庫的話實在沒什么好說的了狼犯,根據(jù)實際需要調用一下庫中方法就行,上圖:
好了领铐,打印機連好了悯森,那么,要打印的數(shù)據(jù)從哪里來绪撵?因為這個項目中已經(jīng)集成好了極光瓢姻,所以后臺將通過極光自定義消息來發(fā)送訂單編號。所以我在極光接收自定義消息的代理里加了個通知音诈,然后再連接打印機的界面里寫了接收通知和通知方法實現(xiàn)的代碼幻碱,上代碼:
接著實現(xiàn)這個startPrintOrder:方法就可以了。打印數(shù)據(jù)的方法细溅,庫中已經(jīng)提供了褥傍。由于我通過自定義消息拿到的只是訂單號,所以還要通過請求一次接口拿到該訂單的訂單詳情喇聊。拿到訂單詳情之后就需要排版打印數(shù)據(jù)了恍风。看了一下庫誓篱,排版所需的指令集已經(jīng)封裝好朋贬,可以根據(jù)自己的需求修改。順便提一下窜骄,我的項目中锦募,打印機具有切割的功能,所以需要切割的指令集啊研,當時百度了很久都沒找到御滩,后來還是安卓給的我鸥拧,為了方便他人,在這里放出:
調用打印方法削解,將排版好的數(shù)據(jù)打印出來:
到了這里富弦,打印功能就差不多完成了。測試一下氛驮,因為自定義消息的方法只能在app處于前臺狀態(tài)的時候使用腕柜,所以,成功連接打印機之后app在前臺時矫废,收到訂單之后盏缤,可以馬上打印出訂單詳情。當app處于后臺時蓖扑,收到訂單之后不會馬上打印出訂單詳情唉铜,而是等app重新回到前臺狀態(tài),如果這個時候藍牙打印機沒有斷開連接的話律杠,就會打印出在后臺收到的所有訂單的訂單詳情潭流。
ok,完事柜去,去找產品提交任務灰嫉。產品說:不行,要求app在后臺時收到訂單也要打印嗓奢,手機鎖屏也要打印讼撒。行吧,現(xiàn)在開始考慮后臺打印股耽。
和安卓根盒,后臺商量了下,決定app處于前臺的時候物蝙,訂單編號通過自定義消息發(fā)送郑象;app處于后臺的時候,訂單編號通過通知的形式發(fā)送茬末。那么問題來了厂榛,后臺如何知道app是處在前臺還是后臺呢?調接口丽惭。
后臺給了個接口击奶,讓我在前臺的時候傳個1,進入后臺了责掏,傳個0柜砾,所以我在appDelegate里:
然后在極光接收通知消息內容的代理里加個通知:
然后如同自定義消息一般在連接打印機的界面中實現(xiàn)對應的通知方法就可以了。流程現(xiàn)在已經(jīng)很清晰了换衬,然而痰驱。证芭。。
因為藍牙功能只能用真機測試担映,所以我通過xcode連著數(shù)據(jù)線在真機上運行程序废士,測完前臺的功能之后,繼續(xù)測試后臺是否能打印蝇完。嗯官硝,這個斷點跑到了,那個方法走到了短蜕,結果完全沒啥問題氢架。所以我就把程序提交給了測試小姐姐去測。后來測試小姐姐反饋給我說:iOS前臺打印可以朋魔,后臺打印不行岖研,安卓的都可以。
我警检?缎玫??明明我自己測試的時候是沒啥問題的解滓。于是我又用xcode連線真機運行,該走的方法都走了筝家,為什么測試那關過不去呢洼裤?后來我發(fā)現(xiàn),真機獨立運行程序溪王,連上打印機后把app切換到后臺或者直接鎖屏腮鞍,下單,收到通知莹菱,確實是不打印移国。但是真機獨立運行的話報錯信息我怎么看?于是我陷入了連著線運行沒問題道伟,真機獨立運行有問題但是看不出問題的死循環(huán)中迹缀。。蜜徽。
期間查看了不少藍牙后臺模式的文章祝懂,項目中支持藍牙后臺模式的key和mode都設置了,但是還是不行拘鞋。后來有人勸我讓用戶點擊通知回到app再打印砚蓬,我試了試,這個方法不太符合需求盆色,我發(fā)現(xiàn)點擊通知回到app的時候其他的這個APP的通知都會消失灰蛙,而我在那條通知里只能獲取到那條通知所包含著的訂單編號祟剔。假設在后臺的時候收到了幾條訂單,然而我點擊某一條通知只能打印出點擊的那條通知的訂單摩梧,別的訂單都消失了物延,GG。也有人猜測是不是程序在后臺被殺死了障本,于是我添加了百度來的在后臺繼續(xù)存活三分鐘的代碼教届,發(fā)現(xiàn)在三分鐘里還是不打印。無奈啊無奈驾霜,用xcode調試后臺打印案训,代碼都運行的,一用真機獨立測試就不行了粪糙,哪一步出了問題也看不出强霎。
后來我跟幾個iOS好友們討論了許久,他們認為我要在后臺蓉冈,實現(xiàn)請求接口(拿到訂單編號去請求訂單數(shù)據(jù))城舞,排版打印數(shù)據(jù),再發(fā)送打印指令讓打印機打印(也是個異步過程)寞酿,是不太可能的家夺,蘋果手機不會允許一個在后臺的app還能夠做這么多事的。但是我藍牙后臺模式要求的配置都弄了啊伐弹,藍牙的后臺模式到底能做些什么東西拉馋?更重要的是為什么xcode連著線運行后臺打印沒問題?就是因為xcode連著線運行后臺打印沒問題惨好,我才一直以為是我代碼的問題煌茴。我覺得我很委屈。日川。蔓腐。
折騰了半個月,實在沒辦法了龄句,就把這個問題交給了上級回论。上級后來給了我答復。他查了資料發(fā)現(xiàn)分歇,iOS端app后臺藍牙長久的與藍牙設備連接透葛,這個確實是可以實現(xiàn)的。但是需要這個藍牙設備支持心跳機制卿樱,并且是藍牙設備給app發(fā)消息僚害,app給藍牙設備發(fā)消息的話不好實現(xiàn)。行吧,最后結果是iOS端后臺打印功能不做了萨蚕,只支持前臺靶草。這個卡了我近月的坎終于過去了。
文末了岳遥,還有個問題還沒解決:xcode連著線在真機上運行app奕翔,后臺打印沒問題的原因,可能是通過xcode運行浩蓉,真機會給這個app提供足夠多的內存吧派继,所以沒問題。但是真機獨立運行了捻艳,就不行了驾窟。
后來我就把程序改成了只有前臺打印,對认轨,也就是分割線之前的那個樣子绅络。之所以會寫這篇文章,也希望如果有人遇到了和我一樣的需求之后嘁字,這篇文章能夠幫到你恩急,至少別在后臺打印那一塊和我一樣傻乎乎的折騰許久了吧,看著安卓能流暢的實現(xiàn)后臺打印纪蜒,我眼紅啊衷恭。最后,如果我這篇文章中有什么錯誤纯续,請告訴我随珠;如果你已經(jīng)實現(xiàn)了iOS后臺打印,那就更要告訴我了杆烁,讓我參考下你的實現(xiàn)方法。(長嘆一口氣)一起努力吧简卧!