Я разработал приложение для iOS в Swift 4 с XCode 9.3 с минимальной версией iOS 10.0, которая генерирует QR-коды для чтения другим приложением (приложением для чтения). Приложение находится в рабочем состоянии, и данные, отображаемые в QRCode, отправляются сервером и всегда имеют моно-объектные идентификаторы (12 байтов -> 24 цифры)
Проблема в том, что иногда (действительно редко) сгенерированные QR-коды не работают (не читаются сканерами или приложением для чтения), но я не могу воспроизвести его в среде разработки. Изображения были отправлены клиентами.
Генератор QRCode:
extension String {
func toQRCode() -> UIImage?{
let data = self.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator"), let colorFilter = CIFilter(name: "CIFalseColor") {
filter.setValue(data, forKey: "inputMessage")
filter.setValue("H", forKey: "inputCorrectionLevel")
colorFilter.setValue(filter.outputImage, forKey: "inputImage")
colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1, alpha: 0), forKey: "inputColor1") // Background
colorFilter.setValue(CIColor.init(red: 0.12, green: 0.13, blue: 0.15), forKey: "inputColor0")
let transform = CGAffineTransform(scaleX: 10, y: 10)
if let output = colorFilter.outputImage?.transformed(by: transform) {
return UIImage(ciImage: output)
}
}
return nil
}
}
Использование
imageView.image = "QRCodeString".toQRCode()
Я вижу 2 возможные причины
- Сервер случайным образом отправляет в приложение неверные данные (возможно, недопустимые символы), поэтому я не могу их воспроизвести.
- Данные, отправленные сервером, в порядке, но система iOS генерирует битые QR-коды случайным образом.
Случай 1: Я пытался сгенерировать QR-коды с множеством различных возможных недопустимых символов, но ни один из них не сгенерировал недействительный QRCode
Случай 2. Я много искал о возможных ошибках в CIFilter QRCodes, но ничего не нашел.
Изображение с проблемой:
Извините за качество картинки 1 и 2, это фото телефона.
Значения сервера на изображениях выше примерно такие, как "5073c76a23ce3abf0f000001", но я не могу понять, что происходит.
Есть идеи?