Ios 使用AVFoundation读取二进制二维码
是否可以使用AVFoundation读取二进制编码的QR码 我可以获得Ios 使用AVFoundation读取二进制二维码,ios,qr-code,Ios,Qr Code,是否可以使用AVFoundation读取二进制编码的QR码 我可以获得.typeAVMetadataObjectTypeQRCode的AVMetadataMachineReadableCodeObject对象,但是它只有stringValue属性,该属性不起作用,因为QR代码中包含的数据无法转换为字符串友好的表示形式 我应该改用ZXing吗 谢谢原始数据确实存在于您的AVMetadataMachineAdableCodeObject中,但它不能通过公共getter获得 然而,你可以使用KVO来提
.type
AVMetadataObjectTypeQRCode
的AVMetadataMachineReadableCodeObject
对象,但是它只有stringValue
属性,该属性不起作用,因为QR代码中包含的数据无法转换为字符串友好的表示形式
我应该改用ZXing吗
谢谢原始数据确实存在于您的
AVMetadataMachineAdableCodeObject
中,但它不能通过公共getter获得
然而,你可以使用KVO来提取它,但苹果可能会拒绝你的应用。此外,未来的iOS版本可能会更改其私有API,并且您的代码可能会变得无效(因为硬编码的私钥)
斯威夫特:
readableCodeObject.valueForKeyPath("_internal.basicDescriptor")!["BarcodeRawData"]
目标-C
[readableCodeObject valueForKeyPath:@"_internal.basicDescriptor"][@"BarcodeRawData"];
我在iOS 8和iOS 9上对此进行了测试。我能够通过Base64编码二维码中的数据来解决这个问题。 如果您没有生成二维码,那么这显然是行不通的,但对于正在生成二维码的人来说,这可能是一种选择 我们遇到了可以存储在QR码中的数据上限,但通过压缩数据(我们使用zlib),然后对压缩数据进行Base64编码,只要您的数据压缩到原始大小的75%以下,您就可以获得一些额外的容量,并可以使用
stringValue
属性将您的数据取回,您只需对Base64进行解码,然后解压缩即可恢复原始数据
即使你从不可压缩的二进制数据开始,只要您能够处理Base64的开销,并且仍然在QR码的限制范围内,这可能是一个可行的选择,可以避免绕过
AVMetadataMachineAdableCodeObject
似乎想要处理字符串值的事实。您可以使用CIDetector来获取包含数据
唯一的问题是,这些数据仍然包括QR码头,如ECI等。。。因此,您仍然需要解释位
我在一篇帖子中总结了这一点。你有没有找到解决办法?我正在尝试做同样的事情,但结果是类型为
AnyObject
。我可以将其转换为更可用的类型吗?对象中包含的数据类型是什么?在Swift中,您可以使用readableCodeObject.valueForKeyPath(“\u internal.basicDescriptor”)![“BarcodeRawData”]as?NSData
获取存储在AVMetadataMachineAdableCodeObject
中的NSData。非常有用。但是,我从原始数据中获得的字节与测试中的参考资料不匹配。例如,应用程序bctester返回正确的字节,它们与AVMetadataMachineAdableCodeObject所返回的字节完全不同。你能给我指一下正确的方向吗?我想我也会把它作为一个单独的问题发布,因为它不是严格意义上的主题。你可能想检查你正在读取的数据是否加密。在使用它之前,您可能需要对其进行解密。我认为数据通常是通过某种算法压缩和序列化的,因此您必须执行相反的过程:解压缩和反序列化。格式实际上是deflated(zlib)的,我已经成功地构建了一个测试用例来正确地膨胀数据,但是BarcodeRawData与其他读者返回的内容仍然有很大不同。我用实际数据和代码提出了一个新问题:谢谢,这对我来说是一个很好的解决方案。我的数据压缩到大约25%,所以我不介意Base64的额外开销。它仍然比原始数据至少小50-60%!