2015-09-07 50 views
13

是否有可能通過AVFoundation讀取二進制編碼QR碼?與AVFoundation一起閱讀二進制QR碼

我能得到的.typeAVMetadataObjectTypeQRCode一個AVMetadataMachineReadableCodeObject對象,然而,這只是有一個stringValue屬性,這是行不通的,因爲包含在QR碼中的數據不能轉換爲字符串友好的表示。

應該用ZXing嗎?

感謝

+1

您是否曾經找到過解決方案?我試圖做同樣的 – Johannes

回答

7

的原始數據確實存在在你的AVMetadataMachineReadableCodeObject,但它通過一個公共的getter是不可用的。

但是,您可以使用KVO來提取它,但Apple可能會拒絕您的應用程序。此外,未來的iOS版本可能會更改其私有API,並且您的代碼可能會失效(因爲硬編碼的私鑰)。

夫特:

readableCodeObject.valueForKeyPath("_internal.basicDescriptor")!["BarcodeRawData"] 

目標C

[readableCodeObject valueForKeyPath:@"_internal.basicDescriptor"][@"BarcodeRawData"]; 

我測試此爲iOS 8和9

+0

這對我有用,但結果是'AnyObject'類型。我可以將它轉換成更可用的類型嗎?對象中包含的數據的類型是什麼? – oelna

+1

在Swift中,您可以使用'readableCodeObject.valueForKeyPath(「_ internal.basicDescriptor」)![「BarcodeRawData」]作爲? NSData'來獲取存儲在'AVMetadataMachineReadableCodeObject'中的NSData。 – alexdmotoc

+0

非常有幫助。但是,我從原始數據中獲得的字節與測試中的參考資料不匹配。應用程序* bctester *例如返回正確的字節,它們與'AVMetadataMachineReadableCodeObject'返回的完全不同。你能爲我指出正確的方向嗎?我想我會把它作爲一個單獨的問題發佈,因爲它不是嚴格地針對這個主題。 – oelna

0

我能夠通過編碼在所述數據的Base64來解決這個問題二維碼。 這顯然不會工作,如果你不是也生成的QR碼,但可能是人的選擇。

我們遇到了可以存儲在QR碼中的數據的上限,但是通過壓縮數據(我們使用zlib),然後Base64編碼壓縮數據,只要您的數據壓縮到小於75%的原始大小,你會得到一些額外的容量,並可以使用stringValue屬性來獲取你的數據,你只需要Base64解碼,然後解壓縮以獲取原始數據。

即使您的二進制數據不是非常可壓縮的,只要您可以處理Base64的開銷並仍然處於QR代碼的限制範圍內,這可能是一個可行的選擇,可避免在事實上,AVMetadataMachineReadableCodeObject似乎想要使用字符串值。