在iOS中集成ZXing实现二维码扫描

来源:互联网 发布:kido手表软件 编辑:程序博客网 时间:2024/04/28 19:11

图片找不到了。代码也找不到了。强制必须支持arm64位之后原来的zxing也不好用了。
现在苹果原生AVCaptureSession在iOS 7以上已经提供了二维码扫描功能,不用再依赖于Zxing了。

下面的文章不看也罢……


ZXing是一个实现二维码扫描的库,花费我半天时间终于成功把它集成到我们的项目中,赶紧记下来,以免下次忘了。下面是集成步骤:


1.下载ZXing源代码

GitHub镜像地址:

https://github.com/zxing/zxing

不过好像只能下载到Android的,本人Git用的少,求大神指点。

最后我在CSDN和code4app上找到了源码,不知道是哪个版本的ZXing,反正可以用。

2.挑出iOS需要的源码

按照前辈们的说法,从Git上下载的源码是一个很大的包,但是iOS方面只要一点点。

简单来说,我们只需要保留cppiphone2个文件夹,其余的全部删掉。如下图所示:


接着我们继续裁剪,对于cpp这个目录,只保留cpp/core/src/zxing下面的内容,其余内容也可以删掉了。但是整个目录结构必须保持原样。裁剪完后,整个目录结构如下所示:


我因为是直接下载的Demo,所以已经是别人清理好的,我直接导入就好。

3.导入ZXing

把裁剪后的zxing文件目录整个移动到我们的iOS项目目录下


然后把上图中可以看到的ZXingWidget.xcodeproj文件Add到我们的iOS工程中。

4.设置与ZXing的依赖关系,并添加依赖的framework

Build PhasesàTargetDependencies,添加ZXingWedget。

Build PhasesàLinkBinary With Libraries,添加libZXingWedget.a,及以下frameworks:

a. AddressBook

b. AddressBookUI

c. AudioToolbox

d. AVFoundation

e. CoreMedia

f. CoreVideo

g. libiconv

完成之后如下图所示:


5.设置索引路径

Build SettingsàHeaderSearch Paths

添加如下路径

./zxing/iphone/ZXingWidget/Classes

./zxing/cpp/core/src

注意,第一个path要设置成循环查找子目录,而第二个不循环查找,如下图所示:


6.注入代码

在需要使用到二维码扫描的地方注入以下代码,ZXing有提供一个扫描二维码的ViewController,即ZXingWidgetController

    ZXingWidgetController *widController = [[ZXingWidgetControlleralloc]initWithDelegate:selfshowCancel:YESOneDMode:NO];

    NSMutableSet *readers= [[NSMutableSetalloc]init];

    QRCodeReader*qrcodeReader = [[QRCodeReader alloc] init];

    [readersaddObject:qrcodeReader];

    widController.readers = readers;

[self presentViewController:widControlleranimated:YEScompletion:^{}];

注意加入相应的头文件

#import <ZXingWidgetController.h>

#import <QRCodeReader.h>

6.C++兼容

此时若直接编译,会报错”iostream.h” file not found。这是因为ZXing底层是C++写的,只需要把用到ZXing的源文件扩展名由.m改成.mm即可。如图


7.std库兼容问题

接着还是编译不过,会出现20多个这样的问题:


网上有人说是因为ZXing 2.1和OpenCV 2.4.3的iOS库有一些兼容问题,他们对C++标准库的版本和编译器版本都有一些需求,造成满足一方了,另一方就编译不通过了。

——水太深,我看不明白。不过StackOverflow上有牛人给出了解决办法。

Build SettingsàC++Language DialectàCompiler Default

Build SettingsàC++Standard LibraryàCompiler Default

把iOS工程和ZXing工程的这两个地方都设置成Compiler Default。

有人说解决了,也有人说要把C++ Standard Library设置成libstdc++。可能跟Xcode版本不同还有关系的样子,我是Xcode5.1.1,设置成libstdc++解决的。

8. 其他错误

另外,我还出现过一个错误是


这是因为Xcode5.1.1自动选上了arm64架构,而网上down下来的ZXing是没有的。

建议解决办法是:

Build SettingsàValidArchitectures中却掉arm64,让其值与ZXing的相同。

然后把iOS工程和ZXing工程的BuildActive Architecture Only改为NO。
0 0
原创粉丝点击