在iOS中集成ZXing實現二維碼掃描

圖片找不到了。代碼也找不到了。強制必須支持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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章