是否可以使用AVFoundation读取二进制编码的QR码?
我可以获得AVMetadataMachineReadableCodeObject
.type
的{{1}}个对象,但是这只有AVMetadataObjectTypeQRCode
属性,这将无效,因为QR中包含的数据代码无法转换为字符串友好表示。
我应该使用ZXing吗?
由于
答案 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,其中symbolDescriptor的errorCorrectedPayload中包含数据。
唯一的问题是该数据仍然包含QR码标题,例如ECI等...,因此您仍然需要解释这些位。
我在帖子here中进行了总结。