iOS 蓝牙扫描枪

news/2025/1/11 21:46:14/

iOS 蓝牙扫描枪

在这里插入图片描述

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


http://www.ppmy.cn/news/314879.html

相关文章

USB扫描枪设置流程 扫描枪使用

第一步:安装驱动 将光盘放到光驱中,打开后找到SymbolCOMPortEmulationDriverv1.8.5.zip压缩包,减压后点击安装。压缩包如下如图所示: 第二步:设置扫描枪 1:将扫描枪安装在工控机上。 扫描枪为USB口&#…

无线扫码枪 服务器查询异常,扫描枪常见问题

扫描枪常见问题 1.为什么将扫描枪连接到电脑后没有任何反映? 答:将扫描枪连接到电脑后,是否有启动声音,如果没有启动声音,请检查一下您所用的连接线是否正常,电脑是否正常。如果连接线确认正常&#xff0c…

手机版无线扫描枪

手机版无线扫码枪 无线条码扫描枪电脑端是一款专门用作无线扫描条码枪专门配用的软件。用户下载该软件之后,电脑连接网络,在开启软件和扫描枪,扫描条码就会发送到电脑的光标,现在手机也可以同样功能,而且是免费的&…

GreenPlum版本升级

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

英语语态--主动和被动

文章目录 被动语态的结构被动语态的用法主动语态和被动语态的转换被动语态总结 被动:主语是谓语的承受者 什么是语态 I clean the room. The room is cleaned(谓语) by me. 被动语态的结构 The room is cleaned by me. be 动词过去分词&am…

mysql 查询某个GPS点位是否在一个电子围栏内 记录一下

前言;查看一个gps点位是否在围栏内,一般方法可以使用放射法 select count(DISTINCT plate_num) from vehicle_point_2023-05-26 vp where st_contains(ST_GeomFromText(POLYGON((104.22645465685945 30.831335092543757, 104.17633405168128 30.75775645829724, 104…

在 Windows 上从源代码安装 OpenCV – C++ / Python-附带安装脚本

OpenCV 于 11 月 20 日发布了 OpenCV-3.4.4 和 OpenCV-4.0.0。这些版本中有很多错误修复和其他更改。发布亮点如下: OpenCV 现在是 C++11 库,需要兼容 C++11 的编译器。最低要求的 CMake 版本已提高到 3.5.1。OpenCV 1.x 中的许多 C API 已被删除。核心模块中的持久性(将结构…

【Java】lambda表达式,Stream API,函数式编程接口

文章目录 1. 引言2. Lambda表达式是什么组成示例 3. Stream API是什么组成 示例4. 函数式编程接口是什么组成一个注解示例 示例 5. 总结 1. 引言 在Java中,函数式编程的概念得以实现和推广主要是从Java 8开始,引入了Lambda表达式和函数式接口的支持。这…