圖片找不到了。代碼也找不到了。強制必須支持arm64位之後原來的zxing也不好用了。
現在蘋果原生AVCaptureSession在iOS 7以上已經提供了二維碼掃描功能,不用再依賴於Zxing了。
下面的文章不看也罷……
ZXing是一個實現二維碼掃描的庫,花費我半天時間終於成功把它集成到我們的項目中,趕緊記下來,以免下次忘了。下面是集成步驟:
1.下載ZXing源代碼
GitHub鏡像地址:
https://github.com/zxing/zxing
不過好像只能下載到Android的,本人Git用的少,求大神指點。
最後我在CSDN和code4app上找到了源碼,不知道是哪個版本的ZXing,反正可以用。
2.挑出iOS需要的源碼
按照前輩們的說法,從Git上下載的源碼是一個很大的包,但是iOS方面只要一點點。
簡單來說,我們只需要保留cpp和iphone這2個文件夾,其餘的全部刪掉。如下圖所示:
接着我們繼續裁剪,對於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。