阅读更多

 

最近做Android和iOS项目用到了ZXing进行二维码扫描,其中在iOS整合比较麻烦,遇到不少问题。

文章前半部分基础部分摘自此文章:http://blog.devtang.com/blog/2012/12/23/use-zxing-library/

写的比较清楚。

 

后面是自己在整合过程中遇到的问题和解决方案,整合后的代码可以在附件中看到(包括,iOS和Android),在此和大家进行分享。

 

ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0)。它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, Objective-C, ActionScript和Ruby。

 

iOS篇

集成步骤

首先去Google Code或Github将ZXing的代码下载下来,整个工程比较大,我们只需要其中涉及iOS的部分,所以最好做一些裁剪。简单来说,我们只需要保留cpp和iphone这2个文件夹,其余的全部删掉。如下图所示:

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

接下来,我们把裁剪后的zxing目录整个移动到我们的iOS项目的目录下,并且把上图中可以看到的ZXingWidget.xcodeproj文件拖动到我们的iOS工程中。

下一步,我们需要设置ZXing项目和我们原本的iOS项目之间的依赖关系。在我们的iOS项目的设置中,点击build phases tab,然后增加 Target Dependencies 和 Link binary,并且增加这些framework依赖:

 

a. AVFoundationb. AudioToolboxc. CoreVideod. CoreMediae. libiconvf. AddressBookg. AddressBookUI
 完成之后如下图所示:

 

最后一步,在设置中增加如下2个header search path:

  • ./zxing/iphone/ZXingWidget/Classes
  • ./zxing/cpp/core/src

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

恭喜你,完成这步之后,你就已经完成ZXing库的集成了。下面谈谈如何使用ZXing库来做二维码识别。

二维码识别

使用方法

ZXing直接提供了一个扫描二维码的View Controller,即ZXingWidgetController。在需要使用的界面代码中,加入文件依赖:

#import #import  
  然后在需要扫描的时候,调用如下代码即可:

 

- (IBAction)scanPressed:(id)sender {  ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];  NSMutableSet *readers = [[NSMutableSet alloc ] init];  QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];  [readers addObject:qrcodeReader];  [qrcodeReader release];  widController.readers = readers;  [readers release];  [self presentModalViewController:widController animated:YES];  [widController release];}
   在ZXing扫描有结果时,会调用如下回调函数:

 

@protocol ZXingDelegate- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result;- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller;@end

遇到的问题和解决方案:

我在使用中遇到了一些问题,主要是编译的问题。

  1. 一个是找不到 头文件。解决方法:把用到ZXing的源文件扩展名由.m改成.mm。
  2. 报错:Undefined symbols for architecture armv7s,解决方法:(1)把ZXingWidget的一个build target参数:”Build Active Architecture Only” 修改成 “NO”.(2)把main.m改为main.mm

  3. 报错:No such file or directory,出现该错误可能是你的Header Search Path写错了,或者就是你的zxing库的目录结构不是我上面强调的,好好检查一下吧。
  4. 如果你需要生成二维码做测试,推荐一个不错的在线生成二维码的网站:http://cli.im/
  5. 报错:IOStream File not found,解决方案把引入ZXingWidgetController的ViewController以及AppDelegate和main也需要修改成.mm,修改完后报错:Undefined symbols for architecture i386:
      "std::string::c_str() const"修改:TARGETS -> Build Settings -> Apple LLVM compiler 4.2 - Language
    设置C++ Standard Library的值为Compiler Default
    ZXingWidget项目:
    TARGETS -> Build Settings -> Architectures
    设置Architectures的值为Standard(armv7, armv7s)

  6. 报错:clang: error: invalid deployment target for -stdlib=libc++ (requires iOS 5.0 or later):解决办法:将target 中的CLANG_CXX_LIBRARY项设置为libstdc++
  7. 错误:Undefined symbols for architecture i386: "_OBJC_CLASS_$_ZXingWidgetController", referenced from: objc-class-ref in AttendanceVC.o "_OBJC_CLASS_$_QRCodeReader", referenced from: objc-class-ref in AttendanceVC.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation):解决方法:在build phase中把libZXingWidget.a加入
  8. 和PhoneGap混用的时候会出现bug(error: default initialization of an object of const type 'NSString *const):解决方法把:NSString* const CDVPageDidLoadNotification;改为extern NSString* const CDVPageDidLoadNotification;

如果大家还遇到过别的错,可以和我沟通,我们一起来解决。

整合好的iOS代码见附件,点击扫描,进入扫描功能,扫描结束后会在Console中打印出扫描出的文字。

 

Android篇

android比较简单,导入core.jar即可,整合好的代码见附件

  • TestZxingiOS.zip (987.9 KB)
  • 下载次数: 336
  • ZXingAndroidDemo.zip (625.9 KB)
  • 下载次数: 273

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  3. Android(安卓)Studio中使用过程中遇到的问题(二)--SVN的安装与使用
  4. 在Android(安卓)Studio 中加入jar 和.so 文件
  5. Android(安卓)JNI实例
  6. android 安全讲座第二层 使用AndBug调试Android(安卓)Java Bytec
  7. Android(安卓)项目上线流程总结
  8. Android如何连接MySQL数据库
  9. 关于android ListView的美化

随机推荐

  1. 分析方法论探讨
  2. Android 蓝牙设备与手机之间的数据传输
  3. 转载 Android仿今日头条详情页实现
  4. Android 内存溢出解决方案(OOM)
  5. eclipse再见,android studio 新手入门教程
  6. Android UI Design Tips(Google官方出品:A
  7. 【android基础】之编写最简单的android谷
  8. Android(安卓)集成支付宝SDK实现快捷支付
  9. 说说我招聘android技术人员的思路(eoe and
  10. Android 6.0以上权限拒绝打开权限设置界