2015-09-07 78 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似乎想要使用字符串值。