iOS(原iPhone操作系统)是苹果公司专门为其硬件开发的移动操作系统。目前苹果公司的许多移动设备,包括iPhone、iPad和iPod Touch,都采用的是这套操作系统。它是全球第二大最受欢迎的移动操作系统,仅次于Android。
iOS用户界面基于多点触控手势的直接操作。界面控制元素由滑块、开关和按钮组成。与操作系统的交互包括手势,例如刷卡,利用,捏,反向压力在iOS操作系统及其多点触控界面的上下文中,所有这些都有特定的定义。一些应用程序使用内部加速度计来响应设备的震动(一个常见的结果是undo命令)或在三维空间中旋转(一个常见的结果是在纵向和横向模式之间切换)。苹果在iOS中融入了全面的无障碍功能,使视力和听力有障碍的用户能够正确使用其产品,受到了广泛好评。
iOS的主要版本每年都会发布。目前的版本是iOS 12,于2018年10月8日发布。它适用于iPhone 5S及以上型号的iPhone,第五代iPad, iPad Air和iPad Air 2, iPad Pro, iPad Mini 2及以上型号的iPad Mini,以及第六代iPod Touch。在iOS中,有四个抽象层:核心操作系统层、核心服务层、媒体层和Cocoa Touch层。
康耐视移动条码SDK (cmbSDK)是一种用于开发移动条码扫描应用程序的简单而强大的工具。cmbSDK基于康视的旗舰DataMan技术和Manatee Works条形码扫描SDK,允许开发人员为所有移动扫描设备创建条形码扫描应用程序:从智能手机和平板电脑到MX系列的高性能工业条形码扫描仪。通过遵循一些简单的指导原则,开发人员可以编写可以在任何受支持的MX移动终端或智能手机上工作的应用程序,只需很少或根本没有条件代码。SDK通过“阅读器”连接层抽象设备来实现这一点:一旦应用程序与所需的阅读器建立了连接,就会使用单一、统一的API来配置设备并与设备交互。
SDK提供了两个基本的读取器:
本文档中描述的软件是在许可下提供的,只能按照该许可条款使用或复制,并包含本页所示的版权声明。本软件、本文件及其任何副本均不得提供给或以其他方式提供给被许可方以外的任何人。本软件的所有权和所有权仍属于康耐视公司或其许可方。康耐视公司对其软件在非康耐视公司提供的设备上的使用或可靠性不承担任何责任。康耐视公司对所述软件、其适销性、非侵权性或适用于任何特定目的不作任何明示或暗示的保证。
本文件中的信息如有更改,恕不另行通知,不应被理解为康耐视公司的承诺。康耐视公司不对本文件或相关软件中可能出现的任何错误负责。
除非另有说明,本文示例中使用的公司、名称和数据均为虚构。未经康耐视公司书面许可,本文件的任何部分不得以任何形式或方式(电子或机械),为任何目的复制或传播,也不得转移到任何其他媒体或语言。
版权所有©2017。Cognex公司。版权所有。
康耐视提供的部分硬件和软件可能包含一项或多项美国和国外专利,以及康耐视网站上列出的美国和国外未决专利://m.czl106.com/patents。
以下为康耐视公司的注册商标:
Cognex, 2DMAX, Advantage, AlignPlus, Assemblyplus,用Checker, Checker检查,Cognex Vision for Industry, Cognex VSOC, CVL, DataMan, DisplayInspect, DVT, EasyBuilder, Hotbars, IDMax, In-Sight, Laser Killer, MVS-8000, OmniView, PatFind, PatFlex, PatInspect, PatMax, PatQuick, SensorView, SmartView, SmartAdvisor, SmartLearn, UltraLight, Vision Solutions, VisionPro, VisionView
以下是康耐视公司的商标:
康耐视的标志,1DMax, 3D-Locate, 3DMax, BGAII, CheckPoint,康耐视VSoC, CVC-1000, FFD, iLearn, In-Sight(设计标志与十字线),In-Sight 2000, InspectEdge, Inspection Designer, MVS, NotchMax, OCRMax, PatMax RedLine, ProofRead, SmartSync, ProfilePlus, SmartDisplay, SmartSystem, SMD4, VisiFlex, Xpand
本协议中标识的其他产品和公司商标均为其各自所有者的商标。
SDK支持康耐视的MX移动终端系列,包括MX-1000和MX-1502设备。您可以在康耐视的官方网站上获得这些型号的详细描述(//m.czl106.com)。这些设备关于cmbSDK使用的一些相关特性如下:
MX平台的以下特性结合在一起使应用程序开发变得简单。
在向苹果应用商店提交您的MX-1000 Enabled应用程序之前,您的应用程序必须添加到康耐视MX-1000 MFi产品计划中。这是你的应用获得苹果批准的关键步骤。(如果你的应用没有被添加到该计划中,苹果将拒绝它。)
请提交有关https://cmbdn.cognex.com/mfi/apply你计划提交到app Store的每个iOS应用。
在向app Store提交应用之前,你还需要更新应用的注释。请按照下面的说明来做:
相关产品方案为:
附件名称:DataMan 9050
产品计划编号:144826-0004
状态:活动类型:制造过程
生产阶段:
收到此信息后,康耐视会将您的应用添加到MX-1000产品计划中。完成此步骤后,您将收到一封确认邮件,届时您可以直接向Apple提交应用程序。
MX移动终端通过设备的usb或lightning端口连接到您的设备。这意味着该端口将在应用程序运行时被占用。还有其他调试应用程序的方法,我们将在下面讨论如何通过wifi进行调试。
使用XCode调试iPhone:
要求:
如果你使用XCode运行你的应用程序,你需要在你的设备上启用“通过网络连接”。要做到这一点,首先打开XCode,从顶部菜单选择“窗口”,然后选择“设备和模拟器”。在这一点上,请确保您的设备已通过闪电电缆插入。从左侧的“已连接”设备列表中选择您的设备,并选中“通过网络连接”复选框。
此时,您可以关闭“设备”窗口,并且可以在不使用闪电电缆的情况下运行应用程序。
在iPhone上使用Xamarin或Visual Studio调试:
确保你的iPhone已经用闪电线连接上,然后打开Xamarin。IOS项目。通过右键单击项目并选择“选项”进入项目选项。从左侧菜单导航到iOS Debug,并选中“Debug over WiFi”复选框。应用程序的启动仍然是通过USB线完成的,所以初始启动仍然需要您插入电缆。但是一旦启动,你就可以安全地拔掉插头,通过WiFi继续调试。
重要的是要认识到智能手机(和平板电脑)作为条形码扫描设备的功能有几个根本的区别。这些差异导致用户体验与专用扫描仪不同,从而影响了移动条形码扫描应用程序的设计。
这些差异以及它们对应用程序的一般影响如下:
cmbSDK经过特别设计,使这些差异对应用程序开发人员和用户尽可能透明。通过遵循一些简单的指导原则,可以开发工作和行为相同的应用程序,无论是使用MX-1000移动终端,还是仅使用设备的内置摄像头。
如果没有硬件触发器,移动设备必须使用替代方法来启动条形码扫描。有三种常用的范例:
cmbSDK支持所有这三种方法,其中任何一种(或多种)都可以在应用程序中使用。
移动设备,不考虑专用扫描仪,没有内置瞄准器。条形码瞄准通常是通过在移动设备显示器上提供来自摄像头的实时流预览来实现的:然后用户可以重新定位设备,直到条形码出现在视野中并被解码。cmbSDK极大地简化了这个任务,因为它提供了一个内置的预览控件,可以显示全屏、部分屏幕以及纵向或横向。cmbSDK还支持“被动”瞄准器:连接到移动设备或移动设备外壳的设备,使用设备的LED闪光灯作为光源来投射瞄准/瞄准模式。这些瞄准器的优点是不再需要在屏幕上预览(因为移动设备现在可以投射类似于专用扫描仪的瞄准器模式)。然而,被动瞄准器的一个限制是,由于移动设备闪光灯用于瞄准器,使用LED闪光灯进行一般扫描照明是不可用的。
除了“被动”瞄准器,cmbSDK支持“主动”瞄准器,即MX-100条形码阅读器。该设备通过移动设备外壳连接到移动设备上,内置led用于照明和瞄准(投影一个绿色点以帮助读取条形码)。
移动设备支持开发纵向、横向或两者之间自动旋转的应用程序。cmbSDK完全支持条形码预览和扫描方向的所有三个选项。如前所述,无论应用程序和/或移动设备的方向如何,大多数条形码都可以由移动设备扫描。
不过在某些情况下,使用横向可能是有利的,甚至是必要的。在人像模式下,移动相机沿着图像的“高度”有更高的分辨率。例如,常用的分辨率是1280x720。当以纵向模式扫描条形码时,这意味着沿水平轴有720像素的数据可用于条形码解码。如果扫描一个特别长的或密集的条形码(例如一个大的PDF417),使用横向方向在水平扫描线上提供1280个像素。在扫描二维码、数据矩阵和MaxiCode等“方阵”条形码时,方向几乎没有影响。
如今的智能手机和平板电脑拥有强大的计算能力。通过多核cpu和专用图像处理器,它们为具有成本效益和高效的条形码解码提供了理想的平台。尽管这些设备功能强大,但仍然建议开发人员考虑优化他们的条形码扫描应用程序。虽然SDK已经专门针对移动环境进行了优化,但图像分析和条形码解码仍然是一个CPU密集型活动:由于这些进程必须与操作系统、服务和其他应用程序共享移动设备CPU,因此开发人员应该限制其应用程序只使用满足其需求的SDK特性。
应用程序优化包括以下内容:
由于这些原因,在初始化cmbSDK以与移动设备的内置摄像头一起使用时,默认情况下不启用条形码符号:应用程序必须显式启用所需的符号。由于大多数条形码扫描应用程序只需要扫描少量符号,因此这种行为引导开发人员以一种有效的方式使用SDK。
启用符号是一个非常简单的过程,本文稍后将对此进行解释。
安装iOS cmbSDK的操作步骤如下:
下载最新资料XCode for iOS开发。
下载康耐视移动条码SDK for iOS。
执行以下步骤来设置您的应用程序使用iOS cmbSDK:
打开XCode,开始一个新项目。
* SystemConfiguration.framework * AVFoundation.framework * CoreGraphics.framework * coredia .framework * CoreVideo.framework * MediaPlayer.framework * Security.framework * AudioToolbox.framework * libDataManSDK.a
你可能需要将CocoaAsyncSocket.framework(位于cmbSDK zip文件的依赖项中)添加到Xcode General选项卡的“Embedded Binaries”部分,以防你想使用设备发现。
3.去你的项目Info.plist文件,并添加Privacy - CameraUsageDescription或NSCameraUsageDescription。这是iOS要求的,用于显示一条消息,解释应用程序对用户设备摄像头的使用情况。
如果您计划使用cmbSDK在智能手机或平板电脑(没有MX移动终端)上进行移动扫描,那么SDK需要安装许可密钥。
如果没有许可证密钥,SDK仍将运行,尽管扫描结果将被混淆(SDK将随机地用星号替换扫描结果中的字符)。
请与您的康耐视销售代表联系,了解如何获取许可证密钥,包括可用于30天评估SDK的试用许可证。
获得许可密钥后,将其作为字符串添加到应用程序的信息中。Plist文件,在键下MX_MOBILE_LICENSE。
cmbSDK旨在为支持的扫描设备提供高级抽象接口。这不仅包括MX系列移动终端,还包括打算使用移动设备相机作为成像设备的应用程序。与这些设备通信和管理的复杂性被封装在SDK本身中:让应用程序连接到所选择的设备,然后使用它。
应用程序和受支持的条形码扫描设备之间的主要接口是CMBReaderDevice类。该类代表设备本身的抽象层,处理所有通信以及任何必要的硬件管理(例如,智能手机扫描)。
cmbSDK的使用方法如下:
为要使用的设备类型(MX阅读器或相机阅读器)初始化一个阅读器设备。
连接阅读器设备。
配置读取器(如果需要)。
开始扫描。
初始化、连接和配置通常只需要在应用程序中执行一次,除了以下情况:
cmbSDK提供了两种不同的读取器类初始化器:一种用于使用MX移动终端(如MX- 1000或MX-1502)进行扫描,另一种用于使用移动设备(iphone、ipad等)的内置摄像头进行扫描。
初始化MX移动终端(如MX-1000或MX-1502)使用的阅读器设备很容易:只需使用MX设备方法创建阅读器设备(不需要参数),并设置适当的委托(通常是self):
让readerDevice:CMBReaderDevice = CMBReaderDevice. readerofmx () readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfMXDevice];readerDevice.delegate = self;
MX移动终端的可用性可能会在设备打开或关闭时发生变化,或者在闪电电缆连接或断开时发生变化。您可以使用以下CMBReaderDeviceDelegate方法处理这些更改。
func availabilityDidChange(ofReader reader: CMBReaderDevice)
- (void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader
使用移动设备的内置摄像头进行条形码扫描可能比使用MX移动终端更复杂。cmbSDK支持多种配置,以提供最大的灵活性。这包括支持可选的外部瞄准器/照明,以及自定义直播预览外观的能力。
要使用MX-100或移动设备的内置摄像头扫描条形码,请使用readerOfDeviceCameraWithCameraMode静态方法初始化CMBReaderDevice对象。相机读取器初始化时有几个选项。需要配置以下参数:
* CDMCameraMode * CDMPreviewOption * UIView
的CameraMode参数为CDMCameraMode类型(定义在CDMDataManSystem.h),并接受以下值之一:
以上所有模式都为读者提供以下默认设置:
根据所选择的模式,将设置以下附加选项和行为:
previewOptions参数类型为CDMPreviewOption,定义为CDMDataManSystem.h)用于更改读取器的默认值或覆盖从所选CameraMode派生的默认值。在传递参数时,可以通过OR-ing指定多个选项。可用的选项如下:
UIView类型的最后一个参数是可选的,用于相机预览的容器。如果参数为空,将使用全屏预览。
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
let readerDevice:CMBReaderDevice = CMBReaderDevice。readerOfDeviceCamera (: CDMCameraMode。noAimer previewOptions: CDMPreviewOption。init(rawValue: 0), previewView:nil) readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:kCDMCameraModeNoAimer previewOptions:kCDMPreviewOptionDefaults previewView:nil];readerDevice.delegate = self;
创建一个没有瞄准器,没有缩放按钮,并使用模拟触发器的阅读器:
let readerDevice:CMBReaderDevice = CMBReaderDevice。readerOfDeviceCamera (: CDMCameraMode。noAimer previewOptions: [CDMPreviewOption。noZoomBtn CDMPreviewOption。hwTrigger], previewView:nil) readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:kCDMCameraModeNoAimer previewOptions:(kCDMPreviewOptionNoZoomBtn | kCDMPreviewOptionHwTrigger) previewView:nil];readerDevice.delegate = self;
在初始化Reader设备并设置一个委托来处理Reader的响应之后,你就可以使用connectWithCompletion来连接了:
//如果self.readerDevice.availability == CMBReaderAvailibilityAvailable{//在readerDevice对象和设备self.readerDevice. available之间创建连接,则确保设备已经打开并准备就绪。连接(完成:{(错误:错误?)在if错误!= nil{//处理连接错误}})}
//如果(readerDevice.)可用性== CMBReaderAvailibilityAvailable){//创建readerDevice对象和设备之间的连接[readerDevice connectWithCompletion:^(NSError *error) {if (error){//处理连接错误}}];}
如果一切都做对了,connectionStateDidChangeOfReader在委托中将被调用,您可以在阅读器设备的connectionState参数中检查连接状态。它应该是cmbconnectionstateconnconnected,这意味着您已经成功地连接到阅读器设备,并且可以开始使用康耐视移动条码SDK。
连接到扫描设备后,您可能希望(或需要)更改其某些设置。cmbSDK提供了一组高级的、独立于设备的api,用于设置和检索设备的当前配置。
与初始化读取设备的情况一样,使用MX读取器和使用相机读取器进行扫描之间存在一些区别。下面几节将详细介绍这些差异。
MX系列移动终端提供了复杂的设备配置和管理,包括保存在设备本身上的配置。一般来说,这些设备来自康耐视,预配置为一个特殊的开箱即用的体验,大多数符号和功能准备使用。
当需要自定义重新配置时,通常使用DataMan Setup Tool或Cognex Quick Setup完成,因为这些工具可用于将保存的配置轻松分发到多个设备,从而大大简化配置管理。
然而,它仍然是可能的(有时是可取的)移动应用程序本身配置MX设备:
与MX移动终端非常相似,cmbSDK使用移动设备的内置摄像头进行条形码读取的默认选项集,提供了良好的开箱即用体验。然而,有两个重要的区别需要记住:
MX-100是一个设备外壳附件,为内置相机提供额外的功能,如瞄准和更好的照明控制。作为MX设备和内置扫描仪的混合体,它有自己的瞄准器强度设置,照明强度和瞄准器调制存储在设备本身,其余的设置,如符号,存储在cmbSDK中。
以下是使用MX-100设备时要记住的一些事情:
可以使用Reader Device对象的以下方法启用单个符号:
-(void) setSymbology:(CMBSymbology) symbolology enabled:(bool)enabled completion:(void (^)(NSError *error))completionBlock;
此方法中用于symbolology参数的所有符号都可以在CMBReaderDevice.h中找到。
例子
self.readerDevice。setsymbsymbologyqr (CMBSymbologyQR, enabled: true, completion: {(_ error: error ?) -> Void in if error != nil{//启用该符号失败,可能原因是:阅读器断开,电池或电缆未插,或当前阅读器设备不支持符号}})
[readerDevice setsymbsymbologyqr enabled:YES completion:^(NSError *error){if (error){//启用该符号失败,可能原因为:reader断开连接,电池或电缆未插拔,或当前readerDevice不支持符号}}];
同样的方法也可以用来关闭符号:
self.readerDevice。setsymbsymbologyupcean (CMBSymbologyUpcEan, enabled: false, completion: {(_ error: error ?) -> Void in if error != nil{//启用该符号失败,可能原因为:阅读器未连接,电池或电缆未插拔,或当前阅读器设备不支持符号}})
[readerDevice setsymbsymbologyupcean enabled:NO completion:^(NSError *error){if (error){//启用该符号失败,可能原因为:reader断开连接,电池或电缆未插拔,或当前readerDevice不支持符号}}];
如果您的阅读设备配备了照明灯(例如led),您可以在扫描开始时使用阅读设备对象的以下方法控制它们是打开还是关闭:
self.readerDevice.setLightsON(true){(错误:错误?)in if error != nil{//启动照明失败,可能原因是:阅读器断开,电池或电缆未插电,或设备没有照明灯}}
[readerDevice setLightsON:YES completion:^(NSError *error) {if (error){//开启照明失败,可能原因是:阅读器断开,电池没电或电缆未插电,或设备没有照明灯}}];
请记住,并非cmbSDK支持的所有设备和设备模式都允许照明控制。例如,如果使用内置相机在被动瞄准模式,照明是不可用的,因为LED是用于瞄准。
如果内置摄像头用作阅读器设备,您可以配置缩放级别并定义使用这些缩放级别的方式。
手机摄像头有3个缩放级别,分别是:
你可以用“SET CAMERA”来定义这些缩放级别。ZOOM-PERCENT [100-MAX] [100-MAX]命令。它配置两个级别将放大的百分比。100是不变焦的,MAX(达到1000)将放大到设备能够放大的范围。第一个参数用于设置1级缩放,第二个参数用于设置2级缩放。
当你想检查当前设置时,你可以使用“GET CAMERA”。zoom - percent”,返回两个值:一级缩放和二级缩放。
例子
readerDevice.dataManSystem() ?。sendCommand(“设置相机。缩放比例250 500")
[readerDevice。dataManSystem sendCommand:@“SET CAMERA.”Zoom-percent 250 500";
下面是另一个命令,设置你想要使用的缩放级别或返回实际设置:"GET/SET CAMERA. "变焦0 - 2”。
SET命令的取值包括:
您可以在扫描之前或甚至在扫描期间调用此命令,缩放将上升到配置的级别。
如果扫描完成,则值重置为正常行为(0)。
例子
readerDevice.dataManSystem() ?。sendCommand(“设置相机。放大2”)
[readerDevice。dataManSystem sendCommand:@“SET CAMERA.”放大2”);
cmbSDK包括一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置(不是出厂默认值),而在内置摄像头的情况下,这些是在附录B,其中不启用任何符号。方法如下:
self.readerDevice.resetConfig {(error: error ?) in if error != nil{//重置配置失败,可能原因:阅读器断开,电池没电或线缆未插拔}}
[readerDevice resetConfigWithCompletion:^(NSError *error) {if (error){//重置配置失败,可能原因为:reader断连,电池没电或线缆未插接}}];
每个康耐视扫描设备都实现了DataMan控制命令(DMCC),这是一种配置和控制设备的方法。实际上,该设备的所有功能都可以使用这种基于文本的语言进行控制。API提供了向设备发送DMCC命令的方法。存在用于设置和查询配置属性的命令。
附录A包括完整的DMCC参考使用相机阅读器。其他受支持设备(例如MX-1000)的DMCC命令包含在该特定设备的文档中。
附录B提供与相应DMCC设置相关的相机读取器配置设置的默认值。
下面的示例显示了将不同的DMCC命令发送到设备以进行更高级的配置。将扫描方向改为全向:
self.readerDevice.dataManSystem() ?。sendCommand(“设置解码器。1D-SYMBOLORIENTATION 0", withCallback: { (response:CDMResponse?) in if response?.status == DMCC_STATUS_NO_ERROR { // Command was executed successfully } else { // Command failed, handle errors here } })
[readerDevice。dataManSystem sendCommand:@"SET DECODER.1D-SYMBOLORIENTATION 0" withCallback:^(CDMResponse *response){if (response. 0)status == DMCC_STATUS_NO_ERROR){//命令执行成功}else{//命令执行失败,处理错误}}];
修改直播预览扫描超时时间为10秒:
self.readerDevice.dataManSystem() ?。sendCommand(“设置解码器。MAX-SCAN-TIMEOUT10", withCallback: { (response:CDMResponse?) in if response?.status == DMCC_STATUS_NO_ERROR { // Command was executed successfully } else { // Command failed, handle errors here } })
[readerDevice。dataManSystem sendCommand:@"SET DECODER. "MAX-SCAN-TIMEOUT10" withCallback:^(CDMResponse *response){ if (response.status == DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } }];
获取连接设备的类型:
self.readerDevice.dataManSystem() ?。sendCommand(“设备。类型", withCallback: { (response:CDMResponse?) in if response?.status == DMCC_STATUS_NO_ERROR { // Command was executed successfully let deviceType:String = response?.payload } else { // Command failed, handle errors here } })
[readerDevice。dataManSystem sendCommand:@"获取设备。类型" withCallback:^(CDMResponse *response){ if (response.status == DMCC_STATUS_NO_ERROR) { // Command was executed successfully NSString *deviceType = response.payload; } else { // Command failed, handle errors here } }];
当使用移动摄像头时,cmbSDK允许您在预览容器中或全屏查看摄像头预览。这个预览也包含一个覆盖,可以自定义在许多方面。cmbSDK相机覆盖层由用于缩放、闪光和关闭扫描仪(全屏)的按钮、指示扫描超时的进度条以及相机预览角上的线条构建而成。
使用cmbSDK v2.0中使用的传统相机覆盖。在初始化readerDevice之前,使用MWOverlay中的这个属性:
MWOverlay.setOverlayMode (Int32 (OM_LEGACY.rawValue))
[MWOverlay setOverlayMode OM_LEGACY):;
LEGACY覆盖层具有有限的可定制性,因此首选使用CMB覆盖层。
当使用CMB覆盖时,您可以将Resources/layout目录中的布局文件复制到您的项目中,并根据需要修改它们。必威随行版官网这些文件是:CMBScannerPartialView.xib当扫描程序在容器内启动时使用(部分视图),以及CMBScannerView.xib当扫描仪全屏启动时。
在复制你需要的布局或两个布局后,你可以修改它们,例如通过改变视图的大小、位置或颜色,删除视图,甚至添加自己的视图,如叠加图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角落上绘制线条的视图和进度条)由sdk使用标签属性,所以当您可以更改关于这些视图的所有内容时,请确保标签属性保持不变,否则cmbSDK将无法识别这些视图,并继续发挥作用,就好像这些视图被删除了一样。
CMB和LEGACY覆盖都允许您更改缩放和闪光按钮上使用的图像。要做到这一点,首先复制assets文件夹MWBScannerImages.xcassets从资源目录进入您的必威随行版官网项目。在XCode中,你可以查看这个资产文件夹中包含的图像,并在保持图像名称不变的情况下将它们替换为你自己的图像。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay.setLocationLineUIColor (UIColor.yellow) MWOverlay.setLocationLineWidth (5)
[MWOverlay setLocationLineUIColor UIColor.yellowColor):;[MWOverlay setLocationLineWidth: 5];
有了正确配置的读取器,现在就可以扫描条形码了。方法可以简单地实现这一点startScanning ()方法。接下来会发生什么取决于阅读器设备的类型以及它的配置方式,但一般来说:
当满足下列条件之一时,扫描停止:
当一个条形码被成功解码(第一种情况),你将在你的阅读器设备的委托中收到一个CMBReadResults数组,使用以下CMBReaderDeviceDelegate方法:
func didReceiveReadResult(fromReader reader: CMBReaderDevice, results readResults: CMBReadResults!)
- (void)didReceiveReadResultFromReader:(CMBReaderDevice *)reader results:(CMBReadResults *)readResults;
下面是扫描条形码后简单显示ReadResult的示例:
func didReceiveReadResult(fromReader reader: CMBReaderDevice, results readResults: CMBReadResults!) {if readResults.readResults.count > 0 {let readResult:CMBReadResult = readResults.readResults?首先是!如果readResult. CMBReadResult。图像!= nil { self.ivPreview.image = readResult.image } if readResult.readString != nil { self.lblCode.text = readResult.readString } } }
- (void)didReceiveReadResultFromReader:(CMBReaderDevice *)reader results:(CMBReadResults *)readResults {if (readResults.readResults. resultfromreader)count > 0) {CMBReadResult *readResult = readResults.readResults.firstObject;if (readResult.image) {self.ivPreview.image = readResult.image;} if (readResult.readString) {self.lblCode.text = readResult.readString;}}}
在上面的例子中,ivPreview是一个UIImageView用于显示扫描条形码的图像,和lblCode是一个UILabel,用于显示条形码的结果。你也可以使用BOOL fromreadResult.goodRead检查扫描是否成功。
当条码读取成功时,aCMBReadResult对象由didReceiveReadResultFromReader:results:方法创建并返回。在单个图像/帧上成功读取多个条形码的情况下,多个CMBReadResult返回对象。这就是为什么CMBReadResults类的数组CMBReadResult对象,其中包含所有结果。
的CMBReadResult类具有描述条形码读取结果的属性:
当扫描结束而未成功读取时,aCMBReadResult返回时,goodRead属性设置为false。这通常发生在扫描被取消或超时时。
以启用映像和imageGraphics属性CMBReadResult对象,则必须设置相应的CMBReaderDevice对象的imageResultEnabled和/或SVGResultEnabled属性。
要查看关于如何并行使用和显示图像和SVG图形的示例,请参阅SDK包中提供的示例应用程序。
要从扫描的条形码中访问原始字节,可以使用XML属性。字节被存储为“full_string”标签下的Base64字符串。下面是一个如何使用iOS XML解析器从XML属性中提取原始字节的示例。
解析XML并提取Base64字符串是使用XMLParser完成的
// XMLParserDelegate var currentElement = "" var base64String = "" func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qName:字符串?,attributes attributeDict: [String : String] = [:]) { currentElement = elementName } func parser(_ parser: XMLParser, foundCharacters string: String) { if currentElement == "full_string" { base64String = string } }
#pragma NSXMLParserDelegate;NSString * base64String;- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {currentElement = elementName;} - (void)解析器:(NSXMLParser *)解析器foundCharacters:(NSString *)字符串{if ([currentElement isEqualToString:@"full_string"]) {base64String =字符串;}}
在将XMLParserDelegate设置为从XML结果中提取base64字符串之后,您需要创建一个XMLParser对象并使用该委托解析result. XML。这可以在CMBReaderDeviceDelegate中接收扫描结果时完成,或者在访问CMBReadResult对象时完成。下面是你如何使用你之前创建的委托来获取原始字节:
let xmlParser: xmlParser = xmlParser。init(data: result.xml) xmlParser.delegate = self if xmlParser.parse(){//通过变量let bytes访问原始字节:data ?=数据。初始化(base64Encoded: base64String)}
NSXMLParser *xmlParser = [NSXMLParser。]alloc initWithData result.XML):;xmlParser.delegate = self;if ([xmlParser parse]){//通过变量NSData *bytes = [NSData. parse]访问原始字节。alloc initWithBase64EncodedString:base64String options:0];}
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,CMBReadResults不会在相应的属性中包含任何数据。
要启用图像结果,请使用以下方法从CMBReaderDevice类中设置imageResultEnabled属性:
self.readerDevice.imageResultEnabled = true
[readerDevice setImageResultEnabled:是的);
要启用SVG结果,请使用以下方法从CMBReaderDevice类设置imageResultEnabled属性:
self.readerDevice.svgResultEnabled = true
[readerDevice setSVGResultEnabled:是的);
可能会出现由于电池电量不足或手动断开电缆而导致设备断开的情况。的connectionStateDidChangeOfReader回调函数可以检测到这些情况CMBReaderDeviceDelegate。
从非活动状态返回应用程序后,阅读器设备保持初始化,但没有连接。这意味着不需要重新初始化SDK,但需要重新连接。
某些iOS版本会在恢复外部附件可用的应用程序时发送“可用性”通知。你可以在CMBReaderDeviceDelegate的方法中使用这个:(void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader。在其中,当阅读器可用时,您可以连接到它。
例如:
func availabilityDidChange(ofReader阅读器:CMBReaderDevice) {if(阅读器。available == CMBReaderAvailibilityAvailable) {readerDevice. available == CMBReaderAvailibilityAvailable)连接(completion: { error in if error != nil { // handle connection error } }) } }
- (void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader {if (readerDevice.)availability == CMBReaderAvailibilityAvailable) {[readerDevice connectWithCompletion:^(NSError *error) {if (error){//处理连接错误}}];}}
有些iOS版本不会在简历上报告可用性变化,所以你必须手动处理。为此,你必须为“UIApplicationDidBecomeActiveNotification”添加一个观察者,并在连接之前做一些检查,所以当阅读器已经处于“连接”或“连接”状态时,你不会连接。例如:
override func viewDidLoad() {super.viewDidLoad() //当应用程序恢复时重新连接NotificationCenter.default.addObserver(self, selector: #selector(self. appbecameactive), name:NSNotification.Name。UIApplicationDidBecomeActive,对象:nil)} //处理应用程序恢复func appBecameActive() {if readerDevice != nil && readerDevice。availability == CMBReaderAvailibilityAvailable && reader设备。连接ionState != CMBConnectionStateConnecting && readerDevice.connectionState != CMBConnectionStateConnected { readerDevice.connect(completion: { error in if error != nil { // handle connection error } }) } }
- (void)viewDidLoad{//当应用程序恢复时重新连接[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appBecameActive) name:UIApplicationDidBecomeActiveNotification object:nil];} //处理应用程序恢复-(无效)appBecameActive {if (readerDevice != nil && readerDevice.}availability == CMBReaderAvailibilityAvailable && reader设备。连接ionState != CMBConnectionStateConnecting && readerDevice.connectionState != CMBConnectionStateConnected) { [readerDevice connectWithCompletion:^(NSError *error) { if (error) { // handle connection error } }]; } }
下表列出了使用内置摄像头进行条码扫描时cmbSDK支持的各种DMCC命令。
获取/设置 |
命令 |
参数(年代) |
描述 |
CameraReader |
---|---|---|---|---|
获取/设置 |
电池。负责 |
以百分比的形式返回设备的当前电量。 |
||
哔哔的声音 |
播放“哔”声(音)。 |
|||
获取/设置 |
哔哔的声音。好 |
(0 - 3) (0 - 2) |
设置嘟嘟声的数量(0-3)和嘟嘟声/音调(0- 2,低,中,高)。对于内置摄像头,只有一个单一的哔哔声,不支持螺距控制。因此,0 1将提示音关闭,11 1将提示音打开。 |
|
获取/设置 | 相机。变焦 | 0 - 2 | SET命令可能的值为:0 - normal(未缩放),1 -缩放级别1,2 -缩放级别2。此缩放级别在扫描期间使用。扫描结束时,它重置为0。 |
X |
获取/设置 | 相机。变焦-PERCENT | [100 - max] [100 - max) | 设置/返回1级缩放(iOS默认200%,Android默认150%),以及2级缩放(iOS默认400%,Android默认300%)。 注意:相机需要从sdk启动至少一次,以获得适当的最大变焦(max)值 |
X |
获取/设置 |
CODABAR。CODESIZE |
ON min max OFF min max |
接受任何长度的Codabar。 |
X |
获取/设置 |
C11。CHKCHAR |
On | off |
打开/关闭代码11检查数字。 |
X |
获取/设置 |
C11。CHKCHAR-OPTION |
1 2 |
需要单个校验和。需要双重校验和。 |
X |
获取/设置 |
C11。CODESIZE |
ON min max OFF min max |
接受任何长度代码11。 |
X |
获取/设置 |
这件。CODESIZE |
ON min max OFF min max |
接受任何长度代码25。 |
X |
获取/设置 |
C39。美国信息交换标准代码 |
On | off |
打开/关闭Code 39扩展ASCII。 |
|
获取/设置 |
C39。CODESIZE |
ON min max OFF min max |
接受任何长度代码39。 |
|
获取/设置 |
C39。CHKCHAR |
On | off |
打开/关闭代码39检查数字 |
|
获取/设置 |
C93。美国信息交换标准代码 |
On | off |
打开/关闭代码93扩展ASCII |
X |
获取/设置 |
C93。CODESIZE |
ON min max OFF min max |
接受任何长度代码93。 |
|
配置。默认的 |
将大多数相机API设置重置为默认值,除了那些未重置的设置(见附录B)。要重置所有设置,请使用DEVICE.DEFAULT。 |
|||
获取/设置 |
数据。结果类型 |
0 1 2 4 8 |
指定要返回的结果(多个值的和):无 XML数据 |
|
获取/设置 |
DATABAR。扩大 |
On | off |
打开/关闭数据库扩展符号。 |
|
获取/设置 |
DATABAR。有限的 |
On | off |
打开/关闭DataBar Limited符号。 |
|
获取/设置 |
DATABAR。RSS14 |
On | off |
打开/关闭DataBar RSS14符号。 |
X |
获取/设置 |
DATABAR。RSS14STACK |
On | off |
打开/关闭DataBar RSS14堆叠符号。 |
X |
获取/设置 |
DECODER.1D——SYMBOLORIENTATION |
0 1 2 3 |
使用全向扫描定位。 |
|
获取/设置 |
译码器。努力 |
1 - 5 |
设置图像分析/解码的努力级别。缺省值是2。请勿使用4-5进行在线扫描。 |
X |
获取/设置 |
译码器。MAX-SCAN——超时 |
1 - 120 |
设置直播预览的超时时间。当达到超时时,解码暂停;直播预览将继续在屏幕上显示。 |
X |
得到 | 译码器。MAX-THREADS | 返回设备支持的最大CPU线程数。 | X | |
获取/设置 | 译码器。线色 | (0-MAX) | 指定扫描程序在扫描过程中可以使用的最大CPU线程数。 | X |
设备。默认的 |
将相机API设置重置为默认值(参见附录B)。 |
|||
得到 |
设备。FIRMWARE-VER |
获取设备固件版本。 |
||
得到 |
设备。ID |
返回由康耐视分配给扫描设备的设备ID。 对于内置相机,SDK返回53。 对于MX-100条码扫描器,SDK返回56。 |
||
获取/设置 |
设备。的名字 |
返回分配给设备的名称。默认情况下,这是“MX-”加上DEVICE.SERIAL-NUMBER的最后6位数字。 |
||
得到 |
设备。串行-数 |
返回设备的序列号。对于内置相机,SDK分配一个伪随机数。 |
||
得到 |
设备。类型 |
返回由康耐视分配给扫描设备的设备名称。 对于内置相机,SDK返回“MX-Mobile”。 如果MX-100可用,SDK返回“MX-100”。 |
||
获取/设置 |
的焦点。FOCUSTIME |
清廉 |
设置相机的自动对焦周期(相机应该尝试重新对焦的频率)。 默认值是3,但是MX-100是1。 |
|
获取/设置 |
I2O5。CHKCHAR |
On | off |
将交错的5个检查数字中的2个打开/关闭。 |
|
获取/设置 |
I205。CODESIZE |
ON min max OFF min max |
接受任意长度交错2 / 5。 |
X |
获取/设置 |
的形象。格式 |
0 1 2 |
扫描器以位图格式返回图像结果。扫描器以JPEG格式返回图像结果。扫描仪返回PNG格式的图像结果。 |
|
获取/设置 |
的形象。质量 |
10、15、20、……90 |
指定JPEG图像质量。 |
|
获取/设置 |
的形象。大小 |
0 1 2 3 |
扫描仪返回全尺寸图像。扫描仪返回1 / 4大小的图像。扫描仪返回1/16大小的图像。扫描仪返回1/62大小的图像。 |
|
获取/设置 |
光。瞄准手 |
0 - 1 |
禁用/启用瞄准器(当扫描仪启动时)。 |
|
集 | 光。瞄准手-CONFIG | [32-100] [0-15] [32-100] | 设置MX-100的配置;参数有瞄准器强度,瞄准器调制,照明强度 | X |
得到 | 光。瞄准手-CONFIG | 0 | | 一次性获得所有MX-100配置参数(见上文)。使用选项0从缓存中读取设置;使用选项1总是从设备读取。 | X |
获取/设置 | 光。瞄准手-INTENSITY | 32 - 100 | 设置/获取瞄准器LED的强度(以百分比表示) | X |
获取/设置 | 光。瞄准手-MODULATION | 0-15 | 设置/获取瞄准器LED的调制(眨眼频率);参数为毫秒 | X |
获取/设置 |
光。瞄准手-TIMEOUT |
0 - 600 |
瞄准手的超时时间(秒)。 这个值总是被DECODER覆盖。MAX-SCAN——超时。 |
|
获取/设置 |
光。内部,使 |
On | off |
启用/禁用照明(当扫描仪启动时)。 |
|
获取/设置 |
MSI。CHKCHAR |
On | off |
打开/关闭MSI Plessey检查数字。 |
|
获取/设置 |
MSI。CHKCHAR-OPTION |
0 1 2 3 4 5 |
使用mod 10校验和 |
X |
获取/设置 |
MSI。CODESIZE |
ON min max OFF min max |
接受任何长度的MSI Plessey。 |
X |
获取/设置 |
的象征。AZTECCODE |
On | off |
打开/关闭阿兹特克代码符号。 |
|
获取/设置 |
的象征。CODABAR |
On | off |
打开/关闭Codabar符号。 |
|
获取/设置 |
的象征。C11 |
On | off |
打开/关闭代码11符号。 |
X |
获取/设置 |
的象征。C128 |
On | off |
打开/关闭代码128符号。 |
|
获取/设置 |
的象征。这件 |
On | off |
打开/关闭Code 25符号(标准)。 |
|
获取/设置 |
的象征。C39 |
On | off |
打开/关闭Code 39符号。 |
|
获取/设置 |
的象征。C93 |
On | off |
打开/关闭代码93符号。 |
|
获取/设置 |
的象征。鸡笼 |
On | off |
打开/关闭COOP符号(代码25变体)。 |
X |
获取/设置 |
的象征。DATAMATRIX |
On | off |
打开/关闭数据矩阵符号。 |
|
获取/设置 |
的象征。DATABAR |
On | off |
打开/关闭数据库扩展和限制符号。 |
|
获取/设置 |
的象征。DOTCODE |
On | off |
打开/关闭DotCode符号。 |
|
获取/设置 |
的象征。国际航空运输协会 |
On | off |
打开/关闭IATA符号(代码25变体)。 |
X |
获取/设置 |
的象征。倒 |
On | off |
打开/关闭反转符号(代码25变体)。 |
X |
获取/设置 |
的象征。ITF14 |
On | off |
打开/关闭ITF-14符号(代码25变体)。 |
X |
获取/设置 |
的象征。UPC-EAN |
On | off |
开启/关闭UPC-A、UPC-E、EAN-8和EAN-13符号。 |
|
获取/设置 |
的象征。矩阵 |
On | off |
打开/关闭矩阵符号(代码25变体)。 |
X |
获取/设置 |
的象征。MAXICODE |
On | off |
打开/关闭MaxiCode符号。 |
X |
获取/设置 |
的象征。MSI |
On | off |
打开/关闭MSI Plessey符号。 |
|
获取/设置 |
的象征。PDF417 |
On | off |
打开/关闭PDF417符号。 |
|
获取/设置 |
的象征。地球 |
On | off |
打开/关闭PLANET符号。 |
|
获取/设置 |
的象征。POSTNET |
On | off |
打开/关闭POSTNET符号。 |
|
获取/设置 |
SYMBOL.4STATE-IMB |
On | off |
打开/关闭智能邮件条形码符号。 |
|
获取/设置 |
SYMBOL.4STATE-RMC |
On | off |
打开/关闭皇家邮政编码符号。 |
|
获取/设置 |
的象征。QR |
On | off |
打开/关闭QR和MicroQR符号。 |
|
获取/设置 |
触发器。类型 |
0 1 2 3 4 5 |
不支持不支持手动(默认)不支持不支持连续 |
|
获取/设置 |
UPC-EAN。EAN13 |
On | off |
打开/关闭EAN-13符号。 |
X |
获取/设置 |
UPC-EAN。EAN8 |
On | off |
打开/关闭EAN-8符号。 |
X |
获取/设置 |
UPC-EAN。UPC-A |
On | off |
打开/关闭UPC-A符号。 |
X |
获取/设置 |
UPC-EAN。UPC-E |
On | off |
打开/关闭UPC-E符号。 |
X |
获取/设置 |
UPC-EAN。UPCE1 |
On | off |
打开/关闭UPC-E1符号。 |
|
获取/设置 |
UPCE——一个。补充 |
0 1 - 4 |
关闭UPC补充代码。打开UPC补充代码。 |
|
获取/设置 | 振动。好 | On | off | 设置/获取读取代码时是否震动(默认为ON) |
下表列出了SDK在相机读取器启动时使用的默认值。
设置 |
默认值 |
只复位设备? |
---|---|---|
哔哔的声音。好 |
11 1(打开哔声) |
|
C11。CHKCHAR |
从 |
|
C11。CHKCHAR-OPTION |
1 |
|
C39。美国信息交换标准代码 |
从 |
|
C39。CHKCHAR |
从 |
|
C93。美国信息交换标准代码 |
从 |
|
COM。DMCC-HEADER |
1(包括结果ID) |
Y |
COM。DMCC-RESPONSE |
0(扩展) |
Y |
数据。结果类型 |
1 |
Y |
DECODER.1D-SYMBOLORIENTATION |
1 |
|
译码器。努力 |
2 |
|
译码器。MAX-SCAN-TIMEOUT |
60 |
|
设备。的名字 |
“MX-”+ DEVICE的后六位数字。序列号 |
|
象征学(象征。*) |
关闭(所有符号都被禁用) |
|
符号子类型(组):DATABAR。扩大 UPC-EAN。EAN8UPC-EAN。UPC-AUPC-EAN。UPC-EUPCE——一个。UPCE1 |
停,停,停,停,停 |
|
的焦点。FOCUSTIME |
3. |
|
I2O5。CHKCHAR |
从 |
|
的形象。格式 |
1 (JPEG) |
|
的形象。质量 |
50 |
|
的形象。大小 |
1(1/4号) |
|
光。瞄准手 |
默认基于cameraMode: 0: NoAimer和FrontCamera |
Y |
光。瞄准手-TIMEOUT |
60 |
|
光。INTERNAL-ENABLE |
从 |
附录B -相机阅读器默认值
设置 |
默认值 |
只复位设备? |
最小/最大代码长度 |
4 40 |
|
MSI。CHKCHAR |
从 |
|
MSI。CHKCHAR-OPTION |
0 |
|
触发器。类型 |
2(手动) |
|
UPC-EAN。补充 |
0 |
在安装康耐视产品时,请遵守以下注意事项,以减少人身伤害或设备损坏的风险: