スマートデータキャプチャを今すぐ統合しよう
高速で正確なバーコード、パスポート、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))