スマートデータキャプチャを今すぐ統合しよう

高速で正確なバーコード、パスポート、IDスキャン。事前構築されたスキャンUIとARオーバーレイ。規模に合わせて拡張可能で、各段階でサポートを提供します。

開発者に信頼されています。フォーチュン500社にも選ばれています。

フォーチュン500企業のトップ10のうち6社の開発チームは、比類のないパフォーマンス、広範なデバイス対応、セキュリティ、開発者サポートを提供するScanditを信頼しています。

バーコードスキャン

比類のない速度と精度を誇る強力で多機能なSDK、受賞歴のある目的別ミニワークフロー、そしてARオーバーレイを提供します。

MS Find demo app

ARで特定のものを探す機能

MatrixScan Findは複数のアイテムをスキャンし、ARを使用して正しいアイテムを強調表示します。

private func setupRecognition() {

  context = DataCaptureContext.licensed

  camera = Camera.default
  context.setFrameSource(camera, completionHandler: nil)

  let cameraSettings = BarcodeCapture.recommendedCameraSettings
  cameraSettings.preferredResolution = .fullHD
  camera?.apply(cameraSettings, completionHandler: nil)

  let settings = BarcodeCaptureSettings()

  settings.set(symbology: .ean13UPCA, enabled: true)
  settings.set(symbology: .ean8, enabled: true)
  settings.set(symbology: .upce, enabled: true)
  settings.set(symbology: .code39, enabled: true)
  settings.set(symbology: .code128, enabled: true)
  settings.set(symbology: .dataMatrix, enabled: true)

  settings.locationSelection = RadiusLocationSelection(radius: .zero)

  settings.codeDuplicateFilter = 1

  barcodeCapture = BarcodeCapture(context: context, settings: settings)

  barcodeCapture.addListener(self)

  captureView = DataCaptureView(context: context, frame: view.bounds)
  captureView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  view.addSubview(captureView)

  overlay = BarcodeCaptureOverlay(barcodeCapture: barcodeCapture, view: captureView, style: .frame)
  overlay.brush = Brush.scanned
  overlay.viewfinder = AimerViewfinder()
}

最適化された高速バーコードスキャン(Spark Scan)

SparkScanは、わずかなコードで最高のパフォーマンスと最適化されたUXを提供します。

private lazy var sparkScan: SparkScan = {
  let settings = SparkScanSettings()
  Set<Symbology>([.ean8, .ean13UPCA, .upce, .code39, .code128, .interleavedTwoOfFive]).forEach {
    settings.set(symbology: $0, enabled: true)
  }
  settings.settings(for: .code39).activeSymbolCounts = Set(7...20)

  let mode = SparkScan(settings: settings)
  return mode
}()

private var sparkScanView: SparkScanView!

private var items = [Item]()

override func viewDidLoad() {
  super.viewDidLoad()
  self.title = "List Building"
  setupRecognition()
  setupUI()
}

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  sparkScanView.prepareScanning()
}

override func viewWillDisappear(_ animated: Bool) {
  super.viewWillDisappear(animated)
  sparkScanView.stopScanning()
}

extension ViewController {
  private func clearItems() {
    // Retrieve all the indexPaths, since we've to clear the whole list.
    let indexPaths = items.indexPaths
    // Update the model.
    items = []
    // Update the view.
    itemsTableViewHeader.itemsCount = items.totalCount
    tableView.deleteRows(
      at: indexPaths,
      with: .automatic
    )
  }

  private func addItem(_ item: Item) {
    // Retrieve the indexPath for the item to be added.
    let indexPath = items.addItemIndexPath
    // Update the model.
    items.insert(item, at: indexPath.row)
    // Update the view.
    itemsTableViewHeader.itemsCount = items.totalCount
    tableView.insertRows(
      at: [indexPath],
      with: .right
    )
  }
}

在庫をカウントする機能

MatrixScan Countは、複数のアイテムを同時にスキャンしてカウントします。

func setupRecognition() {

  context = DataCaptureContext.licensed

  camera = Camera.default
  context.setFrameSource(camera, completionHandler: nil)

  let recommendedCameraSettings = BarcodeCount.recommendedCameraSettings
  camera?.apply(recommendedCameraSettings)

  let settings = BarcodeCountSettings()

  settings.set(symbology: .ean13UPCA, enabled: true)
  settings.set(symbology: .ean8, enabled: true)
  settings.set(symbology: .upce, enabled: true)
  settings.set(symbology: .code39, enabled: true)
  settings.set(symbology: .code128, enabled: true)

  barcodeCount = BarcodeCount(context: context, settings: settings)

  barcodeCount.addListener(self)

  barcodeCountView = BarcodeCountView(
    frame: view.bounds, context: context, barcodeCount: barcodeCount)
  barcodeCountView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  view.addSubview(barcodeCountView)
  barcodeCountView.uiDelegate = self
}

private func prepareScannedItemsList(
  trackedBarcodes: [TrackedBarcode],
  previousBarcodes: [Barcode]
) -> [ScannedItem] {
  var tempMap: [String: ScannedItem] = [:]
  var allBarcodes = trackedBarcodes.compactMap { $0.barcode }
  allBarcodes.append(contentsOf: previousBarcodes)
  for barcode in allBarcodes {
    guard let barcodeData = barcode.data else {
      continue
    }
    if var item = tempMap[barcodeData] {
      item.quantity += 1
      tempMap[barcodeData] = item
    } else {
      let newItem = ScannedItem(
        symbology: barcode.symbology.description.uppercased(),
        data: barcodeData,
        quantity: 1)
      tempMap[barcodeData] = newItem
    }
  }

  return Array(tempMap.values)
}
label scanning illustration

Automated label scanning

Smart Label Capture extracts both barcode and text data from labels.

class SmartLabelCaptureViewController: UIViewController {

    private var context: DataCaptureContext!
    private var camera: Camera?
    private var labelCapture: LabelCapture!
    private var captureView: DataCaptureView!
    private var overlay: LabelCaptureValidationFlowOverlay!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupRecognition()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        labelCapture.isEnabled = true
        camera?.switch(toDesiredState: .on)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        labelCapture.isEnabled = false
        camera?.switch(toDesiredState: .off)
    }

    private func setupRecognition() {
        // 1. Context & Camera
        DataCaptureContext.initialize(licenseKey: "-- ENTER YOUR SCANDIT LICENSE KEY HERE --")
        DataCaptureContext.shared
        camera = Camera.default
        context.setFrameSource(camera, completionHandler: nil)
        camera?.apply(LabelCapture.recommendedCameraSettings)

        // 2. Settings (Pre-made definition)
        let settings = try! LabelCaptureSettings {
            LabelDefinition.priceCapture(withName: "price-label")
        }

        // 3. Mode
        labelCapture = LabelCapture(context: context, settings: settings)

        // 4. View
        captureView = DataCaptureView(context: context, frame: view.bounds)
        captureView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(captureView)

        // 5. Validation Overlay (UI & Logic)
        overlay = LabelCaptureValidationFlowOverlay(labelCapture: labelCapture, view: captureView)
        overlay.delegate = self
    }
}

パスポートと身分証明書のスキャン

高速で正確、かつ安全な身分証明書のスキャンと検証を行うためのSDK。

ウェブサイトにIDスキャン機能を迅速に実装できます

ID Boltは、Scanditが開発した確実で信頼性の高いパスポートまたはIDスキャンのワークフローです。

import {
	DocumentSelection,
	IdBoltSession,
	Region,
	Passport,
	ReturnDataMode,
	Validators,
} from "@scandit/web-id-bolt";

const ID_BOLT_URL = "https://app.id-scanning.com";

const LICENSE_KEY = "-- YOUR LICENSE KEY HERE --";

async function startIdBolt() {
	// define which documents are allowed to be scanned. More complex rules can be added.
	const documentSelection = DocumentSelection.create({
		accepted: [new Passport(Region.Any)],
	});
	// initialization of the ID Bolt session
	const idBoltSession = IdBoltSession.create(ID_BOLT_URL, {
		licenseKey: LICENSE_KEY,
		documentSelection,
		// define what data you expect in the onCompletion listener (set below)
		returnDataMode: ReturnDataMode.Full,
		// add validation rules on the scanned document
		validation: [Validators.notExpired()],
		locale: "en",
	});
	// open the pop-up
	await idBoltSession.start();

	// register some listeners:
	idBoltSession.onCancellation = (reason) => {
		// the ID Bolt pop-up has been closed by the user without finishing the scan process.
	};
	idBoltSession.onCompletion = (result) => {
		// the ID has been captured and validation was successful. In this example the result
		// will contain the document data because `returnDataMode` was set to RETURN_DATA_MODE.FULL.
	};
}

// open ID Bolt when some button is clicked
const someButton = document.getElementById("someButton") as HTMLButtonElement;
someButton.addEventListener("click", startIdBolt);

IDデータを正確に取得します

ID Scanは、パスポート、IDカード、ビザステッカー、運転免許証、軍用IDなどのデータを抽出することができます。

private func setupModeCollection() {
  let layout = UICollectionViewFlowLayout()
  layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
  layout.minimumInteritemSpacing = 10
  layout.scrollDirection = .horizontal
  let modeCollection = ModeCollectionViewController(collectionViewLayout: layout)
  modeCollection.items = Mode.allCases.map(\.rawValue)
  addChild(modeCollection)
  view.addSubview(modeCollection.view)
  modeCollection.view.translatesAutoresizingMaskIntoConstraints = false
  modeCollection.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
  modeCollection.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
  modeCollection.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
  modeCollection.view.heightAnchor.constraint(equalToConstant: Constants.modeCollectionHeight)
    .isActive = true
  modeCollection.delegate = self
  modeCollection.selectItem(atIndex: 0)
}

private func configure(mode: IdCaptureViewController.Mode) {
  context.removeAllModes()
  idCapture?.removeListener(self)
  if overlay != nil {
    captureView?.removeOverlay(overlay)
  }

  let settings = IdCaptureSettings()
  switch mode {
  case .barcode:
    configureBarcodeMode(settings: settings)
  case .mrz:
    configureMRZMode(settings: settings)
  case .viz:
    configureVIZMode(settings: settings)
  }

  idCapture = IdCapture(context: context, settings: settings)
  idCapture.addListener(self)

  overlay = IdCaptureOverlay(idCapture: idCapture, view: captureView)
  overlay.idLayoutStyle = .rounded
}

private func configureBarcodeMode(settings: IdCaptureSettings) {
  settings.supportedDocuments = [.aamvaBarcode]
}

private func configureVIZMode(settings: IdCaptureSettings) {
  settings.supportedDocuments = [.dlVIZ, .idCardVIZ]
  settings.supportedSides = .frontAndBack
}

private func configureMRZMode(settings: IdCaptureSettings) {
  settings.supportedDocuments = [.passportMRZ]
}

偽造IDを検出します。

ID Validateは、身分証明書の真偽と有効性を確認し、偽造された書類を検出します。

final class DLScanningVerificationRunner {
  typealias Result = Swift.Result<DLScanningVerificationResult, Error>

  let barcodeVerifier: AamvaBarcodeVerifier
  let vizBarcodeComparisonVerifier: AAMVAVizBarcodeComparisonVerifier

  init(_ context: DataCaptureContext) {
    self.barcodeVerifier = AamvaBarcodeVerifier(context: context)
    self.vizBarcodeComparisonVerifier = AAMVAVizBarcodeComparisonVerifier(context: context)
  }

  func verify(capturedId: CapturedId, _ completion: @escaping (Result) -> Void) {

    let vizBarcodeComparisonResult = vizBarcodeComparisonVerifier.verify(capturedId)
    guard vizBarcodeComparisonResult.checksPassed else {
      let mismatchImage = vizBarcodeComparisonResult.frontMismatchImage
      let showWarning = !vizBarcodeComparisonResult.mismatchHighlightingEnabled
      let warningText =
        showWarning ? "Your license does not support highlighting discrepancies" : nil
      completion(
        .success(
          DLScanningVerificationResult(
            status: .frontBackDoesNotMatch,
            image: mismatchImage,
            altText: warningText)))
      return
    }

    guard capturedId.isExpired == nil || !capturedId.isExpired! else {
      completion(.success(DLScanningVerificationResult(status: .expired)))
      return
    }

    runAAMVABarcodeVerification(capturedId, completion)
  }

  private func runAAMVABarcodeVerification(
    _ capturedId: CapturedId,
    _ completion: @escaping (Result) -> Void
  ) {
    barcodeVerifier.verify(capturedId) { result, error in
      if let result = result {
        switch result.status {
        case AamvaBarcodeVerificationStatus.authentic:
          completion(.success(DLScanningVerificationResult(status: .success)))
        case AamvaBarcodeVerificationStatus.likelyForged:
          completion(.success(DLScanningVerificationResult(status: .likelyForged)))
        case AamvaBarcodeVerificationStatus.forged:
          completion(.success(DLScanningVerificationResult(status: .forged)))
        }
      } else if let error = error {
        completion(.failure(error))
      }
    }
  }
}

Scandit Express(スキャンディット・エクスプレス)アプリ

iOSまたはAndroid用のスタンドアロンバーコードスキャンアプリ。高性能なスキャン機能と、バッチスキャンやARを含む高度な機能に即座にアクセスできます。

  • ターンキーアプリで、開発時間は不要です。
  • ソフトウェアの変更は一切不要です。
  • MDMまたはEMMシステムを通じて展開可能です。

エンタープライズサポート

評価中でも、統合中でも、導入段階でも、Scanditのエンタープライズサクセスチームは、数百社におよぶ企業のSmart Data Capture導入を支援してきました。

エンタープライズレベルの成功

評価

Scanditの機能理解のサポート、拡張されたテスト・評価オプション、そしてハードウェア選定のガイダンスを提供します。

統合と展開

モバイル開発コンサルタント、UXの専門家、ソリューションコンサルタントによる、エンドツーエンドの統合サポートを提供します。

日々の運営

SLAに基づいたサポートプラン、定期的なソフトウェアのアップデート、およびカスタマーサクセスサポートを提供し、KPIの達成とScanditの最大限の活用をサポートします。

すべての主要なバーコードおよびIDタイプのサポート

ArUco symbology

ArUco

Symbology Aztec Code

Aztec Code

Symbology Codabar

Codabar

Driver's licenses

Symbology Code 11

Code 11

Symbology Code 128

Code 128

Symbology Code 25

Code 25

Symbology Code 32 Italian Pharmacode

CODE 32 Italian Pharmacode

パスポート

Symbology Code 39

Code 39

Symbology Code 93

Code 93

Symbology Micro Datamatrix

Data Matrix

Symbology DotCode

DotCode

Symbology EAN code

EAN Code

Symbology GS1 Composite code type c

GS1 Composite Codes

Symbology GS1 databar

GS1 Databar

Symbology iata 2 of 5

IATA 2 of 5

ID cards

Symbology ITF

Interleaved 2 of 5 (ITF)

Symbology KIX

KIX

Symbology Matrix 2 of 5

Matrix 2 of 5

Symbology Maxicode

Maxicode

Symbology Micro QR code

Micro QR Code

MICROPDF417

Military IDs

Symbology MSI

MSI Plessey

Symbology PDF417

PDF417バーコード

Symbology posi lapa

ポジLAPA 4のステートコード

Symbology QR code

QRコード

居住許可証

symbology rectangular micro qr code

長方形のマイクロQRコード

Symbology RM4SCC

RM4SCC

Symbology UPC

UPCコード

UPU (Universal Postage Union) S18 4-State

UPU S18 4-State

Symbology USPS IM

USPSインテリジェントメール

ビザ

すべての主要なフレームワークやプログラミング言語のサポート

30日間の無料トライアル

今すぐ、すべての機能が使える無料トライアルを始めましょう

Loading search...

Please wait a moment