Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用AVFoundation读取二进制二维码_Ios_Qr Code - Fatal编程技术网

Ios 使用AVFoundation读取二进制二维码

Ios 使用AVFoundation读取二进制二维码,ios,qr-code,Ios,Qr Code,是否可以使用AVFoundation读取二进制编码的QR码 我可以获得.typeAVMetadataObjectTypeQRCode的AVMetadataMachineReadableCodeObject对象,但是它只有stringValue属性,该属性不起作用,因为QR代码中包含的数据无法转换为字符串友好的表示形式 我应该改用ZXing吗 谢谢原始数据确实存在于您的AVMetadataMachineAdableCodeObject中,但它不能通过公共getter获得 然而,你可以使用KVO来提

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

我可以获得
.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%!