iOS 蓝牙扫描枪
iOS 藍牙掃描槍
1. 實現(xiàn)原理
通過藍牙連接手機和掃描槍,相當于給手機添加了一個外接鍵盤,當連接掃描槍后,手機內(nèi)的鍵盤不會彈出來。
可以通過textField的代理可以監(jiān)聽到掃描過程和掃描結(jié)果。
掃描時候相當于外接鍵盤在輸入,通過-(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string回調(diào)可以監(jiān)聽到。
通過上面的回調(diào)我們會發(fā)現(xiàn)每次掃描結(jié)束后都會自動添加一個換行符,所以最后的掃描結(jié)果我們可以通過-(BOOL)textFieldShouldReturn:(UITextField*)textField來監(jiān)聽到。
2. 功能實現(xiàn)
2.1 業(yè)務(wù)場景
掃碼槍通過藍牙連接iOS手機設(shè)備,將掃描結(jié)果傳輸?shù)绞謾CApp中進行其他業(yè)務(wù)處理。
2.2 業(yè)務(wù)實現(xiàn)
2.2.1 連接掃碼槍
設(shè)備打開藍牙,通過藍牙連接掃碼槍。
如何驗證是否連接成功? 連接后,可以打開手的備忘錄等可以輸入文本的工具,點擊輸入,有光標出現(xiàn)。這時候使用藍牙掃描槍掃描一個條形碼,正常情況下,條形碼的的內(nèi)容會通過藍牙掃描槍傳入到手機設(shè)備,并顯示在光標輸入的地方。
2.2.2 接收和處理掃描結(jié)果
我們在App內(nèi)接收掃碼槍的掃描內(nèi)容,可以通過textField來接收。掃碼槍就是一個外接鍵盤,textField可以接收鍵盤的內(nèi)容。
初始化一個textField,不需要將其添加到view層,只初始化一個textField對象即可。
實現(xiàn)textField的代理,即可監(jiān)控掃碼槍內(nèi)容的輸入。
3. 注意事項
3.1 掃碼槍的斷與連
掃碼槍連接期間 ,鍵盤是不會彈出來。掃描結(jié)束后掃碼槍會在幾秒之后自動斷開,這時候鍵盤可能會自動彈出。我們用的設(shè)備是掃描結(jié)束后會自動關(guān)閉,再次掃描時會再打開。
這個根據(jù)不同設(shè)備和業(yè)務(wù)自行處理,適合自己的業(yè)務(wù)即可。
3.2 掃描結(jié)果延時處理
掃碼內(nèi)容是一個字符一個字符的傳輸?shù)绞謾C設(shè)備里的。和鍵盤輸入是一樣的,鍵盤也是一個字符一個字符的輸入。這個可以通過-(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string方法來監(jiān)聽掃描內(nèi)容的傳入。
不建議在 -(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string 方法里來處理掃描結(jié)果,因為不清楚什么時候掃描完成。
建議再 -(BOOL)textFieldShouldReturn:(UITextField*)textField 方法里處理掃描結(jié)果,因為每次整體內(nèi)容掃描結(jié)束后,掃碼槍會自動添加一個換行符,這個代理會被回調(diào)。
如果不是在上面的方法中處理掃描的話,對掃描的內(nèi)容需要添加延遲處理,否則掃描的結(jié)果可能就只是一串內(nèi)容中的最后一個字符。
之前有遇到這樣的“坑”:初始化了scannerTextField來監(jiān)聽輸入內(nèi)容,scannerTextField有一個target方法來監(jiān)聽掃描內(nèi)容。
[scannerTextField addTarget:self action:@selector(scannerTextFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]這個方法只要掃描內(nèi)容改變就會被調(diào)用,我在scannerTextFieldEditingChanged:這個方法中直接處理掃描內(nèi)容,
結(jié)果發(fā)現(xiàn)獲取到的掃描內(nèi)容只是一個字符。
本來要掃描一串字符,結(jié)果只得到了其中一個字符,這個是怎么回事?
這是因為掃碼是一個字符一個字符來處理的,scannerTextFieldEditingChanged:這個方法只要是有新值就會回調(diào),只獲取到了一個字符就以為掃描了整個結(jié)果,這是不對的。
避免這個問題的辦法有兩個:
一是在scannerTextFieldEditingChanged:這個方法里加一個延遲,延遲處理掃碼結(jié)果,但是需要在每次收到結(jié)果的時候設(shè)置 [NSObject cancelPreviousPerformRequestsWithTarget:self];
,0.5秒的延遲足夠讓掃碼槍將整個掃描結(jié)果都獲取到了。
二是不要再scannerTextFieldEditingChanged:這個方法中監(jiān)聽掃描結(jié)果,在-(BOOL)textFieldShouldReturn:(UITextField*)textField 代理中處理掃描結(jié)果。
4. 其他
下面是一些資料和參考,至于對不對沒去考量,可作參考。
[1] 藍牙掃描槍和原生鍵盤:https://stackoverflow.com/questions/46923853/default-keyboard-in-ios-disappears-when-bluetooth-scanner-is-connected
掃描槍上有一個按鈕,長按可以打開原生鍵盤。
[2] 連接掃描儀鍵盤不會顯示 https://stackoverflow.com/questions/38437658/default-keyboard-is-not-coming-when-barcode-scanner-device-is-connected-by-bluet
iPad上,當軟鍵盤消失時,只需按住屏幕右下角的向下箭頭,軟鍵盤就會恢復
[3] 安卓條碼掃描器藍牙設(shè)備禁用鍵盤 https://stackoverflow.com/questions/47706642/barcode-scanner-bluetooth-device-disables-the-keyboard
[4] 如何在 Android 上同時啟用硬件和虛擬鍵盤 https://stackoverflow.com/questions/10561760/how-to-enable-both-hardware-and-virtual-keyboards-on-android-ice-cream-sandwich/24287780#24287780
👍🏻
[5] iOS 當連接外接設(shè)備時,顯示軟鍵盤 https://stackoverflow.com/questions/4150724/display-soft-keyboard-ipad-when-is-connected-a-bluetooth-input-device
👍🏻
[6] 如何知道iOS設(shè)備上是否有外接鍵盤 https://stackoverflow.com/questions/2893267/how-can-i-detect-if-an-external-keyboard-is-present-on-an-ipad
👍🏻
[7] 安卓連接藍牙設(shè)備時喚起應(yīng)用程序 https://stackoverflow.com/questions/44102559/start-application-when-bluetooth-device-is-connected
[8] iOS 藍牙掃描槍和外接鍵盤沖突問題 https://stackoverflow.com/questions/72194810/when-the-ios-device-is-connected-to-the-bluetooth-scanner-the-apple-magic-keybo
總結(jié)
- 上一篇: python数据分析知识点_Python
- 下一篇: click传值vue_对vue下点击事件