iOS 蓝牙扫描枪

iOS 蓝牙扫描枪

iOS 蓝牙扫描枪_第1张图片

1. 实现原理

通过蓝牙连接手机和扫描枪,相当于给手机添加了一个外接键盘,当连接扫描枪后,手机内的键盘不会弹出来。

可以通过textField的代理可以监听到扫描过程和扫描结果。

扫描时候相当于外接键盘在输入,通过-(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string回调可以监听到。

通过上面的回调我们会发现每次扫描结束后都会自动添加一个换行符,所以最后的扫描结果我们可以通过-(BOOL)textFieldShouldReturn:(UITextField*)textField来监听到。

2. 功能实现

2.1 业务场景

扫码枪通过蓝牙连接iOS手机设备,将扫描结果传输到手机App中进行其他业务处理。

2.2 业务实现

2.2.1 连接扫码枪

设备打开蓝牙,通过蓝牙连接扫码枪。

如何验证是否连接成功? 连接后,可以打开手的备忘录等可以输入文本的工具,点击输入,有光标出现。这时候使用蓝牙扫描枪扫描一个条形码,正常情况下,条形码的的内容会通过蓝牙扫描枪传入到手机设备,并显示在光标输入的地方。

2.2.2 接收和处理扫描结果

我们在App内接收扫码枪的扫描内容,可以通过textField来接收。扫码枪就是一个外接键盘,textField可以接收键盘的内容。

初始化一个textField,不需要将其添加到view层,只初始化一个textField对象即可。

实现textField的代理,即可监控扫码枪内容的输入。

3. 注意事项

3.1 扫码枪的断与连

扫码枪连接期间 ,键盘是不会弹出来。扫描结束后扫码枪会在几秒之后自动断开,这时候键盘可能会自动弹出。我们用的设备是扫描结束后会自动关闭,再次扫描时会再打开。
这个根据不同设备和业务自行处理,适合自己的业务即可。

3.2 扫描结果延时处理

扫码内容是一个字符一个字符的传输到手机设备里的。和键盘输入是一样的,键盘也是一个字符一个字符的输入。这个可以通过-(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string方法来监听扫描内容的传入。

不建议在 -(BOOL)textField:(UITextField)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString)string 方法里来处理扫描结果,因为不清楚什么时候扫描完成。

建议再 -(BOOL)textFieldShouldReturn:(UITextField*)textField 方法里处理扫描结果,因为每次整体内容扫描结束后,扫码枪会自动添加一个换行符,这个代理会被回调。

如果不是在上面的方法中处理扫描的话,对扫描的内容需要添加延迟处理,否则扫描的结果可能就只是一串内容中的最后一个字符。

之前有遇到这样的“坑”:初始化了scannerTextField来监听输入内容,scannerTextField有一个target方法来监听扫描内容。

[scannerTextField addTarget:self action:@selector(scannerTextFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]

这个方法只要扫描内容改变就会被调用,我在scannerTextFieldEditingChanged:这个方法中直接处理扫描内容,
结果发现获取到的扫描内容只是一个字符。

本来要扫描一串字符,结果只得到了其中一个字符,这个是怎么回事?

这是因为扫码是一个字符一个字符来处理的,scannerTextFieldEditingChanged:这个方法只要是有新值就会回调,只获取到了一个字符就以为扫描了整个结果,这是不对的。

避免这个问题的办法有两个:

一是在scannerTextFieldEditingChanged:这个方法里加一个延迟,延迟处理扫码结果,但是需要在每次收到结果的时候设置 [NSObject cancelPreviousPerformRequestsWithTarget:self];
,0.5秒的延迟足够让扫码枪将整个扫描结果都获取到了。

- (void)scannerTextFieldEditingChanged:(UITextField *)sender {
	[NSObject cancelPreviousPerformRequestsWithTarget:self];
    if(sender.text.length > 3){
        [self performSelector:@selector(processScanerBarcode:) withObject:textInput afterDelay:0.5];
    }
}

二是不要再scannerTextFieldEditingChanged:这个方法中监听扫描结果,在-(BOOL)textFieldShouldReturn:(UITextField*)textField 代理中处理扫描结果。

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] 安卓条码扫描器蓝牙设备禁用键盘 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 当连接外接设备时,显示软键盘 https://stackoverflow.com/questions/4150724/display-soft-keyboard-ipad-when-is-connected-a-bluetooth-input-device

[6] 如何知道iOS设备上是否有外接键盘 https://stackoverflow.com/questions/2893267/how-can-i-detect-if-an-external-keyboard-is-present-on-an-ipad

[7] 安卓连接蓝牙设备时唤起应用程序 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

你可能感兴趣的:(#,App开发,iOS蓝牙扫描)