Читать двоичный QR-код с AVFoundation

Можно ли прочитать двоичный код QR-кода с помощью AVFoundation?

Я могу получить AVMetadataMachineReadableCodeObject объект .typeAVMetadataObjectTypeQRCodeОднако это имеет только stringValue свойство, которое не будет работать, потому что данные, содержащиеся в QR-коде, не могут быть преобразованы в дружественное для строки представление.

Должен ли я использовать ZXing вместо этого?

Спасибо

4 ответа

Необработанные данные существуют в вашем AVMetadataMachineReadableCodeObject, но это не доступно через публичный получатель.

Однако вы можете использовать KVO для его извлечения, но Apple может отклонить ваше приложение. Кроме того, будущие версии iOS могут изменить свои частные API, и ваш код может стать недействительным (из-за жестко закодированных закрытых ключей).

Swift:

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

Objective-C

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

Я проверял это для iOS 8 и 9.

Я смог решить эту проблему с помощью Base64 кодирования данных в QR-код. Это, очевидно, не сработает, если вы также не генерируете QR-коды, но может подойти людям, которые это делают.

Мы столкнулись с верхним пределом данных, которые можно сохранить в QR-коде, но сжимая данные (мы использовали zlib), а затем Base64, кодирующие сжатые данные, при условии, что ваши данные сжимаются до менее чем 75% от их первоначального размера Вы получаете дополнительную емкость и можете использовать stringValue Чтобы вернуть ваши данные, вам просто нужно декодировать Base64, а затем распаковать, чтобы вернуть исходные данные.

Даже если вы начинаете с двоичных данных, которые не очень сжимаемы, при условии, что вы можете справиться с накладными расходами Base64 и при этом оставаться в пределах ограничений QR-кодов, это может быть жизнеспособным вариантом, позволяющим избежать обхода факта, что AVMetadataMachineReadableCodeObject Кажется, хочет работать со строковыми значениями.

Вы можете использовать CIDetector для доступа к CIQRCodeFeature, у которого есть symbolDescriptor с errorCorrectedPayload, который содержит данные.

Единственная проблема в том, что эти данные по-прежнему включают заголовки QR-кода, такие как ECI и т. Д., Поэтому вам все равно нужно интерпретировать биты.

Я резюмировал это в своем посте здесь.

Вдохновленный предыдущими ответами и другими сайтами, я создал суть, которая позволяет извлекать двоичные файлы из QR-кода или кода Aztec без использования частных API или другой библиотеки. ЭтоAVMetadataMachineReadableCodeObjectрасширение, представляющееbinaryValue.

Однако он работает только на iOS 11 и более поздних версиях из-заCIQRCodeDescriptorиспользовать.

Он доступен здесь: https://gist.github.com/PetrusM/267e2ee8c1d8b5dca17eac085afa7d7c

Для QR-кодов работает только со 100% бинарными. Но если они содержат дополнительные части, вы можете легко адаптировать их.

Другие вопросы по тегам