Чтение двоичного QR-кода с AVFoundation
Можно ли читать бинарный закодированный QR-код с AVFoundation?
Я могу получить объект AVMetadataMachineReadableCodeObject
.type
AVMetadataObjectTypeQRCode
, однако это имеет свойство stringValue
, которое не будет работать, поскольку данные, содержащиеся в QR-коде, не могут быть преобразованы в строковое дружественное представление.
Следует ли вместо этого использовать ZXing?
Спасибо
Ответы
Ответ 1
Исходные данные существуют в вашем AVMetadataMachineReadableCodeObject
, но недоступны через публичный getter.
Однако вы можете использовать KVO для его извлечения, но Apple может отклонить ваше приложение. Кроме того, будущие версии iOS могут изменить их частные API, и ваш код может стать недействительным (из-за жесткокодированных закрытых ключей).
Swift:
readableCodeObject.valueForKeyPath("_internal.basicDescriptor")!["BarcodeRawData"]
Objective-C
[readableCodeObject valueForKeyPath:@"_internal.basicDescriptor"][@"BarcodeRawData"];
Я тестировал это для iOS 8 и 9.
Ответ 2
Мне удалось решить эту проблему с помощью Base64, кодирующего данные в QR-коде.
Это, очевидно, не будет работать, если вы также не генерируете QR-коды, но можете выбрать для людей.
Мы столкнулись с верхним пределом данных, которые могут быть сохранены в QR-коде, но путем сжатия данных (мы использовали zlib), а затем Base64, кодируя сжатые данные, до тех пор, пока ваши данные сжимаются до менее чем 75% его первоначальный размер вы получаете дополнительную емкость и можете использовать свойство stringValue
, чтобы вернуть ваши данные, вам просто нужно выполнить декодирование Base64, а затем распаковать, чтобы вернуть исходные данные.
Даже если вы начинаете с двоичных данных, которые не очень сжимаются, до тех пор, пока вы можете обрабатывать накладные расходы Base64 и по-прежнему находиться в пределах ограничений QR-кодов, это может быть жизнеспособным вариантом, который не позволяет обойти факт что AVMetadataMachineReadableCodeObject
, похоже, хочет работать со строковыми значениями.