Сканирование зрения не распознает специальный символ штрих-кода GS1 на iOS16

Мы используем библиотеку 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)
    }
}

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
302
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Внутренняя кодировка QR-кода сообщения в предоставленном изображении недействительна.

Содержащееся в нем сообщение кодируется как [ECI][BYTE]{GS}10BF40001A{GS}21003032{GS}1122012722VD020, где [ECI] — индикатор режима ECI, [BYTE] представляет сегмент байтового режима, а {GS} — символ-разделитель групп (ASCII 29).

Изображение сигнализирует ECI, немедленно переключается в байтовый режим, а затем кодирует буквальный символ GS. Это просто не то, как кодировать символы QR-кода, содержащие синтаксические данные идентификатора приложения GS1:

  • (10) БФ40001А
  • (21) 003032
  • (11) 220127
  • (22) ВД020

Битовый поток QR-кода GS1 должен начинаться с явного индикатора режима FNC1, который сигнализирует «FNC1 на первом месте» в сообщении. Это несовместимо с индикатором режима ECI, который присутствует на данном изображении.

Остальная часть кодирования технически верна, но весьма необычна тем, что используется кодирование в байтовом режиме, а не в типичном буквенно-цифровом режиме.

Также обратите внимание, что каноническим разделителем для завершения AI, которые не определены заранее как фиксированная длина, является символ не данных FNC1, а не символ данных GS, хотя GS по-прежнему допустим. Когда действует режим FNC1, символы-разделители FNC1 кодируются как «%» (а буквенные символы данных «%» экранируются как «%%») в буквенно-цифровом режиме и кодируются как символы GS в байтовом режиме.

Кодировщик изображения должен быть фиксированным, так как нельзя ожидать успешного декодирования указанного символа.

Что делает библиотека со следующим правильно закодированным символом?

Внутренняя кодировка вышеуказанного символа — [FNC1][ALPHA]10BF40001A%21003032%1122012722VD020, где [FNC1] — индикатор режима FNC1, а [ALPHA] представляет сегмент буквенно-цифрового режима. (Обратите внимание, что символы данных GS из вашего исходного символа правильно закодированы как «%», представляя символы FNC1, не являющиеся данными.)

Спасибо за разъяснение проблем со штрих-кодом. К сожалению, это проблема с Vision. Поскольку он не может идентифицировать символы разделителя групп на iOS 16. Проблема все еще сохраняется с вашим опубликованным изображением QR-кода. В другом обсуждении на github некоторые сказали, что он снова работает с iOS 16.1 Beta Dev. 2.

AresProductions 28.09.2022 11:16

@AresProductions Для других, пожалуйста, можете дать ссылку на обсуждение GitHub, на которое вы ссылаетесь. Очень неприятно обнаруживать мертвые зацепки.

Terry Burton 28.09.2022 13:57

@AresProductions Кроме того, чтобы быть педантичным, что на самом деле было получено при сканировании правильно закодированного символа ниже, который содержит символы FNC1, а не символы GS. В протоколе передачи для QR-кода указано, что символы-разделители FNC1 (все, кроме FNC1 в начале) должны передаваться как GS. В этом случае библиотека видения также удаляет прокси-символы GS для FNC1? (Отвечая на этот вопрос, вы не оставляете двусмысленности, которую кто-то может найти позже: «Отлично, я думаю, что нашел кого-то, кто столкнулся с моей проблемой, но что с ними случилось, когда они попробовали что-то?!»)

Terry Burton 28.09.2022 13:59

Извините, если я был недостаточно ясен раньше. Вот обсуждение на GitHub: github.com/xremix/SwiftGS1Barcode/issues/24 На iOS 15 оба штрих-кода (мой и ваш) работают как положено, они включают символы GS. В iOS 16 (с использованием одного и того же кода) оба штрих-кода удаляют свои символы GS.

AresProductions 28.09.2022 14:22

Мы обновились до iOS 16.0.2 (20A380), и проблема все еще возникает. Не удается обнаружить разделитель FNC1.

Robin 30.09.2022 16:06
Ответ принят как подходящий

У нас была та же проблема: после того, как мы обновили наше тестовое устройство до 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. Вроде разобрались, спасибо за сообщение! :))

AresProductions 02.10.2022 22:40

Другие вопросы по теме