iOS app藍牙連接打印機

最近做了個app藍牙連接打印機打印的功能,感覺這方面的東西網(wǎng)上的不多,所以寫一篇文章存?zhèn)€檔。

因為我本人也是第一次接觸藍牙方面的功能,所以一開始也是各種百度,最后找到了大神寫好的一個藍牙庫,叫BLEPrinter。了解清楚其中原理之后,直接用上項目了。

首先第一步就是連接打印機了,這一步用了庫的話實在沒什么好說的了,根據(jù)實際需要調(diào)用一下庫中方法就行,上圖:

庫中方法

好了,打印機連好了,那么,要打印的數(shù)據(jù)從哪里來?因為這個項目中已經(jīng)集成好了極光,所以后臺將通過極光自定義消息來發(fā)送訂單編號。所以我在極光接收自定義消息的代理里加了個通知,然后再連接打印機的界面里寫了接收通知和通知方法實現(xiàn)的代碼,上代碼:

appDelegate中
連接打印機的界面中

接著實現(xiàn)這個startPrintOrder:方法就可以了。打印數(shù)據(jù)的方法,庫中已經(jīng)提供了。由于我通過自定義消息拿到的只是訂單號,所以還要通過請求一次接口拿到該訂單的訂單詳情。拿到訂單詳情之后就需要排版打印數(shù)據(jù)了。看了一下庫,排版所需的指令集已經(jīng)封裝好,可以根據(jù)自己的需求修改。順便提一下,我的項目中,打印機具有切割的功能,所以需要切割的指令集,當時百度了很久都沒找到,后來還是安卓給的我,為了方便他人,在這里放出:

切割指令集

調(diào)用打印方法,將排版好的數(shù)據(jù)打印出來:

庫中方法

到了這里,打印功能就差不多完成了。測試一下,因為自定義消息的方法只能在app處于前臺狀態(tài)的時候使用,所以,成功連接打印機之后app在前臺時,收到訂單之后,可以馬上打印出訂單詳情。當app處于后臺時,收到訂單之后不會馬上打印出訂單詳情,而是等app重新回到前臺狀態(tài),如果這個時候藍牙打印機沒有斷開連接的話,就會打印出在后臺收到的所有訂單的訂單詳情。

ok,完事,去找產(chǎn)品提交任務。產(chǎn)品說:不行,要求app在后臺時收到訂單也要打印,手機鎖屏也要打印。行吧,現(xiàn)在開始考慮后臺打印。


和安卓,后臺商量了下,決定app處于前臺的時候,訂單編號通過自定義消息發(fā)送;app處于后臺的時候,訂單編號通過通知的形式發(fā)送。那么問題來了,后臺如何知道app是處在前臺還是后臺呢?調(diào)接口。

后臺給了個接口,讓我在前臺的時候傳個1,進入后臺了,傳個0,所以我在appDelegate里:

前臺后臺的代理

然后在極光接收通知消息內(nèi)容的代理里加個通知:

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調(diào)試后臺打印,代碼都運行的,一用真機獨立測試就不行了,哪一步出了問題也看不出。

后來我跟幾個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提供足夠多的內(nèi)存吧,所以沒問題。但是真機獨立運行了,就不行了。

后來我就把程序改成了只有前臺打印,對,也就是分割線之前的那個樣子。之所以會寫這篇文章,也希望如果有人遇到了和我一樣的需求之后,這篇文章能夠幫到你,至少別在后臺打印那一塊和我一樣傻乎乎的折騰許久了吧,看著安卓能流暢的實現(xiàn)后臺打印,我眼紅啊。最后,如果我這篇文章中有什么錯誤,請告訴我;如果你已經(jīng)實現(xiàn)了iOS后臺打印,那就更要告訴我了,讓我參考下你的實現(xiàn)方法。(長嘆一口氣)一起努力吧!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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