Мы используем библиотеку Vision для сканирования штрих-кода GS1.
Библиотека не распознает специальный символ «GS» в версиях iOS 16.
"GS" --> символ-разделитель групп (ASCII 29)
Мы не сталкиваемся с такой проблемой в старых версиях. Например iOS 15.6 или ниже. Ниже я загрузил пример изображения штрих-кода GS1.
После сканирования мы должны получить: {GS}10BF50001A{GS}21003032{GS}1122012722VD020
Вместо этого в iOS 16 мы получаем: 10BF50001A210030321122012722VD020.
Я также публикую пример кода того, как мы используем библиотеку. Мы не изменили наш код, и ошибка появляется только в версиях iOS 16. Нам интересно, была ли введена ошибка.
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right)
do {
try imageRequestHandler.perform([detectBarcodeRequest])
} catch {
logger.error(tag: TAG, "barcode error: \(error)")
}
}
private lazy var detectBarcodeRequest = VNDetectBarcodesRequest { [weak self] request, error in
guard error == nil else {
self?.logger.error(tag: self?.TAG, "barcode error: \(error)")
return
}
self?.processVNRequest(request)
}
private func processVNRequest(_ request: VNRequest) {
guard let barcodes = request.results else {
return
}
for barcode in barcodes {
guard let potentialBarcode = barcode as? VNBarcodeObservation else {
return
}
guard let payload = potentialBarcode.payloadStringValue else {
return
}
prepareToNotifyDetectionEvent(payload)
}
}
Заранее спасибо.





Внутренняя кодировка QR-кода сообщения в предоставленном изображении недействительна.
Содержащееся в нем сообщение кодируется как [ECI][BYTE]{GS}10BF40001A{GS}21003032{GS}1122012722VD020, где [ECI] — индикатор режима ECI, [BYTE] представляет сегмент байтового режима, а {GS} — символ-разделитель групп (ASCII 29).
Изображение сигнализирует ECI, немедленно переключается в байтовый режим, а затем кодирует буквальный символ GS. Это просто не то, как кодировать символы QR-кода, содержащие синтаксические данные идентификатора приложения GS1:
Битовый поток QR-кода GS1 должен начинаться с явного индикатора режима FNC1, который сигнализирует «FNC1 на первом месте» в сообщении. Это несовместимо с индикатором режима ECI, который присутствует на данном изображении.
Остальная часть кодирования технически верна, но весьма необычна тем, что используется кодирование в байтовом режиме, а не в типичном буквенно-цифровом режиме.
Также обратите внимание, что каноническим разделителем для завершения AI, которые не определены заранее как фиксированная длина, является символ не данных FNC1, а не символ данных GS, хотя GS по-прежнему допустим. Когда действует режим FNC1, символы-разделители FNC1 кодируются как «%» (а буквенные символы данных «%» экранируются как «%%») в буквенно-цифровом режиме и кодируются как символы GS в байтовом режиме.
Кодировщик изображения должен быть фиксированным, так как нельзя ожидать успешного декодирования указанного символа.
Что делает библиотека со следующим правильно закодированным символом?
Внутренняя кодировка вышеуказанного символа — [FNC1][ALPHA]10BF40001A%21003032%1122012722VD020, где [FNC1] — индикатор режима FNC1, а [ALPHA] представляет сегмент буквенно-цифрового режима. (Обратите внимание, что символы данных GS из вашего исходного символа правильно закодированы как «%», представляя символы FNC1, не являющиеся данными.)
@AresProductions Для других, пожалуйста, можете дать ссылку на обсуждение GitHub, на которое вы ссылаетесь. Очень неприятно обнаруживать мертвые зацепки.
@AresProductions Кроме того, чтобы быть педантичным, что на самом деле было получено при сканировании правильно закодированного символа ниже, который содержит символы FNC1, а не символы GS. В протоколе передачи для QR-кода указано, что символы-разделители FNC1 (все, кроме FNC1 в начале) должны передаваться как GS. В этом случае библиотека видения также удаляет прокси-символы GS для FNC1? (Отвечая на этот вопрос, вы не оставляете двусмысленности, которую кто-то может найти позже: «Отлично, я думаю, что нашел кого-то, кто столкнулся с моей проблемой, но что с ними случилось, когда они попробовали что-то?!»)
Извините, если я был недостаточно ясен раньше. Вот обсуждение на GitHub: github.com/xremix/SwiftGS1Barcode/issues/24 На iOS 15 оба штрих-кода (мой и ваш) работают как положено, они включают символы GS. В iOS 16 (с использованием одного и того же кода) оба штрих-кода удаляют свои символы GS.
Мы обновились до iOS 16.0.2 (20A380), и проблема все еще возникает. Не удается обнаружить разделитель FNC1.
У нас была та же проблема: после того, как мы обновили наше тестовое устройство до iOS 16.0.2, наше приложение перестало правильно считывать 2D-штрих-коды (как QR-код, так и матрицу данных). В iOS 15 не было проблем с обнаружением символа FNC1 в закодированных данных, который используется для чтения различных элементов GS1. После обновления приложение не смогло правильно определить символ FNC1, а также другие проблемы, которые привели к нарушению рабочего процесса.
Сегодня мы установили iOS 16.1 beta 3, я подтверждаю, что приложение работает должным образом, и сканер может успешно обнаружить символ FNC1. Все пришло в норму.
Вы можете зарегистрировать свое устройство в Программе бета-тестирования Apple, чтобы получать последние общедоступные бета-версии, например ту, которую мы тестировали, iOS 16.1 beta 3.
Ссылка на регистрацию:
https://beta.apple.com/sp/betaprogram/enroll#ios
Да, похоже на проблему Apple. Вроде разобрались, спасибо за сообщение! :))
Спасибо за разъяснение проблем со штрих-кодом. К сожалению, это проблема с Vision. Поскольку он не может идентифицировать символы разделителя групп на iOS 16. Проблема все еще сохраняется с вашим опубликованным изображением QR-кода. В другом обсуждении на github некоторые сказали, что он снова работает с iOS 16.1 Beta Dev. 2.