使用AVFoundation读取二进制二维码

时间:2015-09-07 00:00:47

标签: ios qr-code

是否可以使用AVFoundation读取二进制编码的QR码?

我可以获得AVMetadataMachineReadableCodeObject .type的{​​{1}}个对象,但是这只有AVMetadataObjectTypeQRCode属性,这将无效,因为QR中包含的数据代码无法转换为字符串友好表示。

我应该使用ZXing吗?

由于

3 个答案:

答案 0 :(得分:8)

原始数据确实存在于您的AVMetadataMachineReadableCodeObject中,但无法通过公共获取者获取。

但是,您可以使用KVO提取它,但Apple可能会拒绝您的应用。此外,未来的iOS版本可能会更改其私有API,并且您的代码可能会变为无效(因为硬编码的私钥)。

夫特:

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

目标-C

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

我为iOS 8和9测试了这个。

答案 1 :(得分:1)

我能够通过Base64编码QR码中的数据来解决这个问题。  如果您还没有生成QR码,这显然是行不通的,但可能是人们的选择。

我们遇到了可以存储在QR码中的数据的上限,但是通过压缩数据(我们使用zlib)然后Base64编码压缩数据,只要你的数据压缩到低于75%它的原始大小可以获得一些额外的容量,并且可以使用stringValue属性来恢复数据,只需要进行Base64解码然后解压缩以获取原始数据。

即使你开始使用不太可压缩的二进制数据,只要你能处理Base64的开销并仍然在QR码的限制范围内,这可能是一个可行的选择,可以避免解决这个问题AVMetadataMachineReadableCodeObject似乎想要使用字符串值。

答案 2 :(得分:0)

您可以使用CIDetector到达CIQRCodeFeature,其中symbolDescriptorerrorCorrectedPayload中包含数据。

唯一的问题是该数据仍然包含QR码标题,例如ECI等...,因此您仍然需要解释这些位。

我在帖子here中进行了总结。