iOS General Example

Creating Barkoder Configuration #

The createBarkoderConfig method is responsible for setting up the configuration required to initiate barcode scanning. This configuration includes the license key necessary for validating and activating the SDK. 

If the license key is invalid or missing, the scan results will contain an "UNLICENSED" prefix and random asterisks.

                   private func createBarkoderConfig() {
        // In order to perform scanning, config property need to be set before
        // If license key is not valid you will receive results with asterisks inside
        barkoderView.config = BarkoderConfig(licenseKey: "LICENSE_KEY") { licenseResult in
            print("Licensing SDK: \(licenseResult)")
        }
    }
            

Enabling Symbologies #

Here’s a detailed and refined explanation of how you can enable individual symbologies for barcode scanning using both direct configuration and JSON configuration in Swift

Enabling Symbologies Directly #

You can enable individual symbologies directly by setting the enabled property of each symbology in the decoderConfig object. Here’s a method that demonstrates how to do this:

                private func setActiveBarcodeTypes() {
    guard let decoderConfig = barkoderView.config?.decoderConfig else { return }
    decoderConfig.ean13.enabled = true
    decoderConfig.upcA.enabled = true
    decoderConfig.qr.enabled = true
 }
            

Enabling Symbologies via JSON Configuration #

Alternatively, you can enable symbologies using a JSON configuration. This approach allows you to define the symbology settings in a more structured and flexible manner. Here’s how you can do it:

                private func setActiveBarcodeTypes() {
    guard let config = barkoderView.config else { return }
    let json: [String: Any] = [
      “decoder”: [
        “QR”: [
          “enabled”: true
        ],
        “Aztec”: [
          “enabled”: true
        ],
        “Aztec Compact”: [
          “enabled”: true
        ],
        “QR Micro”: [
          “enabled”: true
        ]
      ]
    ]
    do {
      let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
      BarkoderHelper.applyConfigSettingsFromJson(config, jsonData: jsonData) { updatedConfig, error in
        if let error {
          print(“\(error.localizedDescription)“)
        }
      }
    } catch {
      print(“Error converting dictionary to JSON data: \(error)“)
    }
  }
Starting scan
  func startScanning() {
    do {
      try barkoderView.startScanning(self)
    } catch {
      print(error.localizedDescription)
    }
  }

            

Setting barkoder settings #

The setBarkoderSettings method 

Next define a function setBarkoderSettings where we will update our settings for the barcode scanner view (bkdView).

In our case we will enable image results and include barcode location within the image, also make the region of interest visible and enable pinch-to-zoom functionality.

Finally, configure the ROI to cover the central 90% of the scanner view.

These configurations enhance the user experience by providing more detailed scan results, interactive zooming, and visual feedback about the scan area.

                    private func setBarkoderSettings() {
        guard let config = barkoderView.config else { return }
            
        // These are optional settings, otherwise default values will be used
        config.imageResultEnabled = true
        config.locationInImageResultEnabled = true
        config.regionOfInterestVisible = true
        config.pinchToZoomEnabled = true
        try? config.setRegionOfInterest(CGRect(x: 5, y: 5, width: 90, height: 90))
    }
            

Starting Scan #

The startScanning method initiates the scanning process. If there is an error during the start process, the error message is printed for debugging. 

                func startScanning() {
    if !scanningInProcess {
        try? barkoderView.startScanning(self)
    } else {
        barkoderView.stopScanning()
    }
    
    resetResult()
    scanningInProcess.toggle()
 }
            

Handling Results #

Implementing the BarkoderResultDelegate allows your view controller to receive scanning results. The scanningFinished method is called when scanning is complete, providing the results, optional thumbnails, and the captured image.

                func scanningFinished(_ decoderResults: [DecoderResult], thumbnails: [UIImage]?, image: UIImage?) {
    if let decoderResult = decoderResults.first, let thumbnail = thumbnails.first {
        showResult(decoderResult, thumbnail: thumbnail, image: image)
    }
       
    scanningInProcess = false
}

            

showResult #

The showResult function updates the UI based on the state of the scanning process and the results obtained

                private func showResult(_ decoderResult: DecoderResult, thumbnail: UIImage?, image: UIImage?) {
    resultImageView.image = image
    thumbnailImageView.image = thumbnail

    typeResultLabel.text = decoderResult.barcodeTypeName
        
    resultValueLabel.text = decoderResult.textualData
    resultFromScanning = decoderResult.textualData
        
    let extras: [String] = decoderResult.extra.map {
        return "\($0): \($1)"
    }
        
    extrasResultLabel.text = extras.joined(separator: "\n")
}
            

Complete solution #

In the end, let's merge all of these functions and implement them within our main view controller.

This code would go in your view controller, and of course it will be different for your project, but generally it's a good starting point to have.

                import UIKit
import BarkoderSDK

final class ViewController: UIViewController {

    // MARK: - IBOutlets
    
    @IBOutlet private weak var barkoderView: BarkoderView!
    @IBOutlet private weak var resultImageView: UIImageView!
    @IBOutlet private weak var thumbnailImageView: UIImageView!
    @IBOutlet private weak var introLabel: UILabel!
    @IBOutlet private weak var typeHolderView: UIView!
    @IBOutlet private weak var resultHolderView: UIView!
    @IBOutlet private weak var extrasHolderView: UIView!
    @IBOutlet private weak var scanButton: ScanButton!
    
    @IBOutlet private weak var typeResultLabel: UILabel!
    @IBOutlet private weak var resultValueLabel: UILabel!
    @IBOutlet private weak var extrasResultLabel: UILabel!
    
    // MARK: - Constants
    
    private let holderViewBackgroundColor: UIColor = .white
    private let barkoderBackgroundColor: UIColor = UIColor(red: 230/255.0, green: 230/255.0, blue: 230/255.0, alpha: 1)
    private let resultsMaximumLines = 2
    private let holderViewCornerRadius = 16.0
    
    private var resultFromScanning: String?
    
    // MARK: - Life cycle
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()
        createBarkoderConfig()
        setActiveBarcodeTypes()
        setBarkoderSettings()
    }

    // MARK: - Private methods
    
    private func setupUI() {
        title = "Barkoder Sample (v\(iBarkoder.GetVersion()))"

        view.backgroundColor = UIColor(red: 0.96, green: 0.96, blue: 0.96, alpha: 1.00)
        
        barkoderView.backgroundColor = barkoderBackgroundColor
        
        typeHolderView.backgroundColor = holderViewBackgroundColor
        typeHolderView.layer.cornerRadius = holderViewCornerRadius
        
        resultHolderView.backgroundColor = holderViewBackgroundColor
        resultHolderView.layer.cornerRadius = holderViewCornerRadius
        resultHolderView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapViewAllResult)))
        
        extrasHolderView.backgroundColor = holderViewBackgroundColor
        extrasHolderView.layer.cornerRadius = holderViewCornerRadius
        
        var configuration = UIButton.Configuration.filled()
        configuration.image = UIImage(named: "btn_ffa")
        configuration.baseBackgroundColor = UIColor(red: 0.07, green: 0.07, blue: 0.07, alpha: 1.00)
        configuration.cornerStyle = .capsule
        scanButton.configuration = configuration
        scanButton.layer.shadowColor = UIColor(red: 0.07, green: 0.07, blue: 0.07, alpha: 1.00).cgColor
        scanButton.layer.shadowOpacity = 0.05
        scanButton.layer.shadowOffset = .zero
        scanButton.layer.shadowRadius = 10

        typeResultLabel.numberOfLines = resultsMaximumLines
        resultValueLabel.numberOfLines = resultsMaximumLines
        extrasResultLabel.numberOfLines = resultsMaximumLines
    }
    
    private func createBarkoderConfig() {
        // In order to perform scanning, config property need to be set before
        // If license key is not valid you will receive results with asterisks inside
        barkoderView.config = BarkoderConfig(licenseKey: "LICENSE_KEY") { licenseResult in
            print("Licensing SDK: \(licenseResult)")
        }
    }
    
    private func setActiveBarcodeTypes() {
        guard let decoderConfig = barkoderView.config?.decoderConfig else { return }
        decoderConfig.ean13.enabled = true
        decoderConfig.upcA.enabled = true
        decoderConfig.qr.enabled = true
    }
    
    private func setBarkoderSettings() {
        guard let config = barkoderView.config else { return }
            
        // These are optional settings, otherwise default values will be used
        config.imageResultEnabled = true
        config.locationInImageResultEnabled = true
        config.regionOfInterestVisible = true
        config.closeSessionOnResultEnabled = true

        try? config.setRegionOfInterest(CGRect(x: 5, y: 5, width: 90, height: 90))
    }
    
    private func showResult(_ decoderResult: DecoderResult, thumbnail: UIImage?, image: UIImage?) {
        resultImageView.image = image
        thumbnailImageView.image = thumbnail

        typeResultLabel.text = decoderResult.barcodeTypeName
        
        resultValueLabel.text = decoderResult.textualData
        resultFromScanning = decoderResult.textualData
        
        let extras: [String] = decoderResult.extra.map {
            return "\($0): \($1)"
        }
        
        extrasResultLabel.text = extras.description
    }
    
    // MARK: - IBActions
    
    @IBAction private func didTapScanButton(_ sender: Any) {
        introLabel.isHidden = true
        startScanning()
    }
    
    @objc private func didTapViewAllResult() {
        guard (resultFromScanning != nil) else { return }
        
        let alert = UIAlertController(title: "Full result", message: resultFromScanning, preferredStyle: .alert)
        let continueAction = UIAlertAction(title: "Continue", style: .default)
        alert.addAction(continueAction)
        DispatchQueue.main.async {
            self.present(alert, animated: true)
        }
    }
    
}

class ScanButton: UIButton {
    var isScanning: Bool {
        set {
            self.isSelected = newValue
        }
        get {
            return self.isSelected
        }
    }
}

extension ViewController: BarkoderResultDelegate {

    func scanningFinished(_ decoderResults: [DecoderResult], thumbnails: [UIImage]?, image: UIImage?) {
        if let decoderResult = decoderResults.first, let thumbnail = decoderResults.first {
            showResult(decoderResult, thumbnail: thumbnail, image: image)
        }
        
        scanButton.isScanning = false
    }

    func startScanning() {
        let isScanning = scanButton.isScanning
        if !isScanning {
            resultImageView.image = nil
            try? barkoderView.startScanning(self)
        } else {
            barkoderView.stopScanning()
        }
        
        scanButton.isScanning.toggle()
    }

}

            

To try this example you can get our SDK directly from our github repository

However, as mentioned, the SDK will work without a license but the results will be filled with Asterisks (*). To get full results one would need a license key, which can be obtained from our Developer Portal.  

Page Contents

History:

close