Подтвердить что ты не робот

Чтение двоичного QR-кода с AVFoundation

Можно ли читать бинарный закодированный QR-код с AVFoundation?

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

Следует ли вместо этого использовать ZXing?

Спасибо

4b9b3361

Ответ 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, похоже, хочет работать со строковыми значениями.