(一) 什么是zxing
ZXing(发音为“斑马线”)是一个开放源码的,多种格式的1D/2D条码图像处理库,用objective-c实现的,与其他语言的端口。我们的重点是使用内置的摄像头在手机上的条形码进行扫描及解码的设备,不与服务器通信。该插件可以只支持扫描二维码,不支持条形码扫描。
(二) 本实例说明
用一般网上的关于如何把zxing引入到你的ios代码中都会要求先从官网中下载最新的源码,然后根据网上给出的步骤一步步操作,但是因为官网的源码是会不断更新的,这就导致了一个问题,那就是如果你下载的版本和网上的例子中用到的官方源码版本不一致,那么在按照他的步骤讲解的过程中,有可能会出现局部地方的不同,让自己摸不着头脑,甚至会出现莫名其妙的错误,而自己又不知道如何解决。所以,在本示例中,如果你想把zxing相关的代码加到你的项目中,使之可以支持二维码扫描,那么你就从demo中拷贝就可以了,下面会有详细的讲解,这样教程和官方源码就对应了,也就容易操作了。本代码支持ios5.0以及以上,5.0以下不支持。
(三)示例代码的演示以及代码的简单讲解
1.大体用法:运行我们的demo,会出现一个界面,上面有一个‘Zxing扫描’按钮,点击一下,会跳转到另一个界面,通过这个界面进行二维码的扫描,扫描成功之后,会把成功的信息返回到第一个页面,我们就得到了这个二维码的信息。
如图所示:
,
2.调用代码说明:
在Demo代码中,起始类是ViewController.mm,当点击扫描按钮的时候,调用的是方法:
然后调用的是ZXingWidgetController这个类,也就是说这个类是与用户交互的类,如果根据项目来进行调整的话,就需要修改这个类。这个类的位置在如图所示:
箭头指向的两个类就是扫描二维码的与用户交互的两个类,其中ZXingWidgetController是控制器类,OverlayView是视图类,控制显示Camera的外观,到时候根据项目需要进行调整的话可以修改这个类。
(四) 如何把zxing引入到你的文件中
(1)关于zxing源码的结构
如图所示,
它实现的功能比较多,具体实现的功能以及源码的研究可以参考API文档,而在这里我们只需要一小块功能,就是扫描出网址来就可以了。
(2*)如何引入zxing
我们已经看到了那个调用二维码的demo了,如果我们想在我们自己的项目中使用二维码扫描功能,只需要把这个demo里的部分内容加入到我们自己的项目中。具体步骤如下:
步骤一
扫浏览示例代码testZxing,看到如下的文件夹:
,
箭头指向的就是从官网中简化出来的扫描源码。里面有两个文件夹 iphone和cpp,其中iphone文件夹中有ZXingWidget.xcodeproj,,这个一会加到你的项目中。
首先做的是复制zxing文件夹(箭头方向的)copy到你的项目中,请确保是与工程在同级目录中,这里的作用是以后在项目中找header search path更方便。比如下图:
,
testZxing是你的项目,那么zxing放在与你项目的同级目录中。
然后,你需要将ZXingWidget.xcodeproj拖拽到你的项目中,如图
,
比如ZxingTest是你的项目,那么这样拖过来即可。
步骤二:
在TARGETS中的Build Phases中加入依赖关系和要加入的库,请对照下面的文件将Target Dependencies和Link Binary with Libraries中内容点击“+”号:
首先是在Target Dependencies中加入ZXingWidget,如图所示:
然后再在Link Binary With Libraries中加入libZxingWidget.a,如图所示:
步骤三:
在Build Setting选项卡中加入Header Search Paths。(这里解决的问题是设置我们引用的类的头文件的路径,否则会出现找不到头文件的错误,”./”表示的是当前目录,这样在以后移动工程的时候我们就不用再重新设置搜索头),如图所示:
我们需要在Header Search Paths中添加几项,如图所示:
,
照着图写上这些代码即可。这样我们在调用类库中的头文件的时候就不会出现找不到头文件的错误了。
步骤四:
现在编译一下你的项目,看看是否出现错误,如果没有错误,进行下面的步骤,如果出现错误,仔细看上面的步骤,看是否哪里有不一致,在进行修改。
步骤五:
现在开始实际调用扫描码的测试代码。
1.浏览一下示例代码中ViewController.mm中的代码,在你自己的代码的适当的地方加上如下代码:
ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
NSMutableSet *readers = [[NSMutableSet alloc] init];
QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init];
[readers addObject:qrcodeReader];
widController.readers = readers;
[self presentViewController:widController animated:YES completion:^{}];
很容易理解,就是点击‘扫描’之后,调用zxing的扫描控制器。
别忘了让你的项目继承 <ZXingDelegate>委托,这是扫描完成之后的回调委托。
2.你会发现会报错,因为你需要引入几个头文件,在ViewController.h中,
#import <ZXingWidgetController.h> #import <AVFoundation/AVFoundation.h> #import <QRCodeReader.h>,
然后看看是否能通过编译。
3.如果那你发现仍然通不过编译,并且错误是 ‘iostream’ file not found
那么你需要把你引用 ZXingWidgetController 的 类的结尾的.m 改为.mm,
如同示例一样。这是因为 iostream是c++的文件,当你调用他们的时候,需要改一下
文件名的结尾才能调用。
4.此时如果还是报上面的错误,那么剪切 #import <QRCodeReader.h>,然后粘贴到结尾为mm的类中即可(具体原因不是很清楚,应该是与c++机制有关)
5.再次编译项目,会发现依然报错,但是这次的错误不再是 ‘iostream’ file not found
如果你遇到如图类似的错误:
说明我们少引用了一些类库,比如音频播放文件等,具体的你也不需要知道要引用哪一些,只需照着demo中的引入的类库,缺少的都引入。如图所示:
照着挨个引入即可。引入之后看看是否还报错。
6.经过了重重劫难,看看是否还报错呢。
我晕,依然报错,你的这次错误是不是如图所示的呢?
一看就是c++上报的错误,不过不用担心,我们有解决的方法。
将你项目中的Apple LLVM compiler 4.1 - language中的 c Language Dialect、c++ Language Dialect、c++ standard Library设置成下图所选的值:
然后在编译下,看看是否有错
7,大功告成,经过以上步骤,应该是可以使用二维码的扫描功能了,如果你依然出现错误,那么仔细检查每个步骤,看看哪里没有进行相应的修改。笔者在写这篇文档的时候,又照着这个步骤新建了一个,可以成功调用。不过前提是要ios 5.0及其以上。