Читать двоичный QR-код с AVFoundation
Можно ли прочитать двоичный код QR-кода с помощью AVFoundation?
Я могу получить AVMetadataMachineReadableCodeObject
объект .type
AVMetadataObjectTypeQRCode
Однако это имеет только 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% бинарными. Но если они содержат дополнительные части, вы можете легко адаптировать их.