スマートデータキャプチャを今すぐ統合しよう
高速で正確なバーコード、パスポート、IDスキャン。事前構築されたスキャンUIとARオーバーレイ。規模に合わせて拡張可能で、各段階でサポートを提供します。
 
 開発者に信頼されています。フォーチュン500社にも選ばれています。
フォーチュン500企業のトップ10のうち6社の開発チームは、比類のないパフォーマンス、広範なデバイス対応、セキュリティ、開発者サポートを提供するScanditを信頼しています。
バーコードスキャン
比類のない速度と精度を誇る強力で多機能なSDK、受賞歴のある目的別ミニワークフロー、そしてARオーバーレイを提供します。
 
 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)
}パスポートと身分証明書のスキャン
高速で正確、かつ安全な身分証明書のスキャンと検証を行うための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システムを通じて展開可能です。
 
 すべての主要なバーコードおよびIDタイプのサポート
ArUco
Aztec Code
Codabar
Code 11
Code 128
Code 25
CODE 32 Italian Pharmacode
Code 39
Code 93
Data Matrix
DotCode
:format(webp)) 
 Driver's licenses
EAN Code
GS1 Composite Codes
GS1 Databar
IATA 2 of 5
:format(webp)) 
 ID cards
Interleaved 2 of 5 (ITF)
KIX
Matrix 2 of 5
Maxicode
Micro QR Code
MICROPDF417
:format(webp)) 
 Military IDs
MSI Plessey
:format(webp)) 
 パスポート
PDF417バーコード
ポジLAPA 4のステートコード
QRコード
:format(webp)) 
 居住許可証
長方形のマイクロQRコード
RM4SCC
UPCコード
UPU S18 4-State
USPSインテリジェントメール
:format(webp))