BarcodeDataType

public enum BarcodeDataType : Hashable
extension BarcodeDataType: CustomStringConvertible

Manages various barcode scanner implementations, providing a unified interface for applications.

BarcodeScannerManager is an ObservableObject that allows SwiftUI views to react to changes in scanner status, received barcodes, and pairing QR codes. It acts as a facade, delegating operations to the currently active scanner instance (e.g., VisionKitScanner, ProGloveScanner).

Overview

The manager holds instances of all supported scanner types. An application can select an active scanner type using setActiveScanner(_:). Once a scanner is active, the manager proxies calls like startMonitoring(), triggerScan(), getPairingQRCode(), etc., to that instance.

It also acts as a delegate (BarcodeScannerDelegate) for the active scanner, receiving status updates and barcode data, which it then publishes for the application to consume via its @Published properties or callback closures (onStatusChanged, onBarcodeScanned).

Usage

Initialization

Typically, you would use the shared singleton instance:

@StateObject private var scannerManager = BarcodeScannerManager.shared

Or, if you need custom configurations (e.g., for VisionKit):

@StateObject private var scannerManager = BarcodeScannerManager(
    recognizedDataTypes: [.barcode(symbologies: [.qr, .ean13])], // Specify symbologies for VisionKit
    recognizesMultipleItems: false, // For VisionKit: stop after first scan
    serviceUUID: "YOUR_CUSTOM_IPC_SERVICE_UUID" // Optional: For IPCMobile custom service
)

Setting Callbacks

Assign closures to onStatusChanged and onBarcodeScanned to receive updates:

.onAppear {
    scannerManager.onStatusChanged = { status in
        // Handle status change (e.g., update UI, show errors)
        if case .error(let error) = status {
            self.errorMessage = error.localizedDescription
        }
    }
    scannerManager.onBarcodeScanned = { barcodeValue in
        // Handle received barcode
        self.scannedValue = barcodeValue
        // If using VisionKit and it's a single scan, you might want to dismiss its view.
    }
}

Selecting and Activating a Scanner

Before using a scanner, it must be activated:

func activateMyScanner(type: ScannerType) async {
    do {
        try await scannerManager.setActiveScanner(type)
        // Scanner is now active and its startMonitoring() has been called.
        // Status should update to .idle, .ready, or an error.
    } catch {
        // Handle activation error (e.g., scanner.startMonitoring() failed)
        self.errorMessage = (error as? ScannerError)?.message ?? error.localizedDescription
    }
}

A platform-agnostic enum to represent data types for scanners, replacing VisionKit’s RecognizedDataType.

  • Undocumented

    Declaration

    Swift

    case barcode(symbologies: [VNBarcodeSymbology] = [])
  • Undocumented

    Declaration

    Swift

    case text
  • Declaration

    Swift

    public var description: String { get }