GitHubリポジトリ
ソースコード、リリース、完全な変更ログをGitHubで確認できます
ネイティブSDK: iOSアプリにはこの方法を推奨します。ネイティブSDKは最適なユーザー体験、最適化されたカメラ処理、完全なNFCサポートを提供します。
要件
iOSバージョンの互換性
生体認証の同意にはネイティブSDK 4.10.0以降が必要です。 イリノイ州、テキサス州、コロラド州の法律が適用される人については、Diditは最初の顔撮影の前に明示的な生体認証の同意を求めることができます。iOS SDK 4.10.0以降はこのステップを表示します。それより前のバージョンではこのステップを表示できません。セッションは従来どおり実行され、判定では同意が未取得として報告されます(
biometric_consent.reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK")。これらの州に居住する人を認証する場合はアップグレードしてください。インストール
4.0.0以降、SDKは4種類のインストール可能なバリアントで提供されるため、アプリには使用する機能の分のバイナリサイズしか加わりません。バリアントは必ず1つだけ選択してください。CocoaPodsのサブスペック1つ、SwiftPMのライブラリプロダクト1つです。
- Core: 最小のフットプリントで、手動撮影のみに対応します。
OpenSSL.xcframework、CoreNFCランタイム、MLランタイムはいずれも含まれません。 - AutoDetection: MLベースの書類・顔の自動撮影に対応しますが、NFCチップの読み取りには対応しません。
- NFC: 自動撮影用のMLランタイムなしで、パスポートやeIDのNFCチップ読み取りに対応します。
- All: すべての機能を含みます。サブスペックやプロダクトを指定せずに
DiditSDKをインストールした場合のデフォルトです。
4.9.0で計測)は、Coreが約11.1MB、NFCが約11.7MBに加えてOpenSSLが約4MB、AutoDetectionが約16.0MB、Allが約16.6MBに加えてOpenSSLです。
検出モデル自体は実行時にダウンロードされてキャッシュされるため、アプリのダウンロードサイズには含まれません。
4.7.1以降、AutoDetectionとAllのバリアントは、4.6.0まで使われていたMediaPipeランタイムに代わり、より軽量なMLランタイムで自動撮影の推論を実行します。これはオプトインのバリアントではなく全面的な切り替えであり、4.7.1以降を使用するすべての方に無条件で適用されます。そのため、代わりにインストールできる「旧エンジン」のバリアントは別途用意されていません。リリース成果物での計測では、App Storeの圧縮済みダウンロードペイロードが-3.4MB(-28%)、アプリに同梱されるarm64バイナリが-8.5MB(-35%)削減されています(非圧縮のデバイススライスのフレームワーク自体は約12MB小さくなっています)。検出の動作は、リリース前に実機のマトリクスで旧エンジンとフレーム単位で同一であることを検証済みで、書類の推論は計測上も高速化しています。
ランタイム変更のロールバック: これはバリアントではなく切り替えであるため、元に戻すにはフラグを切り替えるのではなく、依存関係を
4.6.0に固定します(SwiftPM: 「Up to Next Major」ではなくバージョン4.6.0を選択。CocoaPods: podspec_urlを4.6.0タグに向ける)。Didit はリリース後1サイクルにわたり、このランタイムの実運用でのパフォーマンスを追跡します。リグレッションが見つかった場合の対応は、バージョン固定を促すアドバイザリと、現行ランタイムでのパッチリリースです。バリアントは存在しないため、バリアントの切り替えで対応することは決してありません。4.6.0以降、配布されるフレームワークには、Swift ABI記述子(Xcodeがすべてのアプリにコピーするものの一切読み込まないビルドメタデータ)や、そのバリアントでは再生できないチュートリアル動画が含まれなくなりました。4.5.4以前からアップグレードするだけで、コードを変更しなくてもアプリサイズが約7-8MB縮小します。
App Storeは配信時にバイナリを圧縮するため、OTAでのサイズはこれより小さくなります。デバイスごとの正確な差分は、App Store Connectのアプリサイズレポートで確認してください。
NFCとAllのバリアントには
OpenSSL.xcframework(OpenSSL 3.3.3、NFCPassportReader経由でOpenSSL-Universal 3.3.3001として配布)が同梱されています。これはNFCチップ認証に必要で、iOS 15.0+が必要です。4.0.6以前のリリースにはOpenSSL 1.1.1sが同梱されていました。4.0.7以降は、独自のプライバシーマニフェストとコード署名を備えたOpenSSL 3.3.3を同梱しています。必ず4.0.7以降をインストールしてください。なお、アップグレードによってOpenSSLのバージョンは揃いますが、埋め込みの衝突は解消されません。アプリ内の別の依存関係もOpenSSL.framework(同じファイル名、同じcom.github.krzyzanowskim.OpenSSLバンドルID)を埋め込んでいる場合、バージョンにかかわらず、埋め込みのステップで2つのコピーが衝突します。コピーは必ず1つだけにしてください。たとえば、もう一方のパッケージをSPMのIDでオーバーライドしてDidit が公開しているOpenSSL.xcframeworkを使用させ、バンドル内のバイナリがこのSDKのビルドに使われたものになるようにします。CoreとAutoDetectionのバリアントはOpenSSLを一切リンクしません。import DiditSDKは、インストールするバリアントにかかわらず同じです。
Swift Package Manager (推奨)
Xcodeを使ってプロジェクトにパッケージを追加します。- File > Add Package Dependenciesを開きます
- リポジトリのURLを入力します。
- バージョン(または
4.9.1からのUp to Next Major)を選択し、Add Packageをクリックします - プロダクトの選択を求められたら、使用するバリアントのライブラリプロダクトを必ず1つだけ選択します(上の表を参照)
Package.swiftに以下を記述します。
CocoaPods
DiditSDKはリポジトリでホストされるバイナリpodspecとして配布されており(公開のCocoaPods Trunkにはありません)、podspecのURLを参照する必要があります。サブスペックは必ず1つだけ選択してください。
CoreとAutoDetectionはiOS 13以降に対応します。NFCとAllはNFCPassportReaderの要件によりiOS 15が必要です。
次に以下を実行します。
pod installの後は、生成された.xcworkspaceを開いてください(.xcodeprojではありません)。Xcode 15+でのrsyncエラー: ビルド中に
Operation not permittedというrsyncエラーが表示される場合は、プロジェクトのBuild Settings → User Script Sandboxing(ENABLE_USER_SCRIPT_SANDBOXING)を、DebugとReleaseの両方でNoに設定してください。手動 (XCFramework)
リリースごとに、バリアントごとのXCFrameworkが1つずつ公開されます。GitHub Releasesページから使用するバリアントのzipをダウンロードし、.xcframeworkフォルダーをXcodeにドラッグしてEmbed & Signを設定してください。
権限
SDKには次の権限が必要です。アプリのInfo.plistに追加してください。
Info.plistエントリの例
NFCの設定
NFCまたはAllバリアントをインストールする場合にのみ必要です。CoreまたはAutoDetectionバリアントをインストールした場合は、このセクションをスキップしてください。 チップ付きのパスポートやIDカードのNFC読み取りを有効にするには、次の手順を行います。-
XcodeでNFC Capabilityを追加します。
- ターゲットを選択 → Signing & Capabilities → + Capability → Near Field Communication Tag Reading
-
Info.plistにISO7816識別子を追加します。
D392F000260100000001により、SDKはJPKIを通じて日本のマイナンバーカードを読み取れるようになります。この識別子がないと、iOSはカードをSDKに通知しません。マイナンバーカードの読み取りは本番環境ではまだ有効になっていませんが、この識別子は他の書類には一切影響しないため、今のうちに追加しておけます。
- Entitlementsを追加します(
.entitlementsファイル内)。
App Store審査 (NFCおよびAllバリアント): NFCまたはAllバリアントをインストールすると、NFC関連のコードがSDKバイナリに含まれるため、ワークフローでNFCを使用していない場合でも、審査中にAppleからデモ動画を求められることがあります。Appleに提出するためのNFCデモ動画は、support@didit.meにご依頼ください。これはCoreまたはAutoDetectionバリアントには該当しません。
クイックスタート
SwiftUIでの連携
UIKitでの連携
連携方法
SDKは2つの連携方法に対応しています。方法1: UniLink (最もシンプル)
バックエンドは不要です。SDKはDidit ConsoleのワークフローIDを使って、セッションを直接作成します。UniLink方式(startVerification(workflowId:))が対応しているのはvendorDataのみです。その他のセッションパラメーターを使う場合は方法2を使用してください。
UniLink経由で
vendorDataをセッションに付与するには、Didit ConsoleでVendor Dataオプションを有効にしてください。方法2: バックエンドセッション (本番環境に推奨)
バックエンドがCreate Verification Session API(POST /v3/session/)を通じて、すべてのパラメーター(contact_details、expected_details、metadata、callbackなど)を指定してセッションを作成し、session_tokenをSDKに渡します。
- セッションとユーザーの関連付け(
vendor_data) - クロスバリデーションのための連絡先情報と期待値の設定
- カスタムメタデータの設定
- セッションごとのコールバックの設定 これらのデータ(連絡先情報、期待値、メタデータ、コールバック)はCreate Verification Session APIに送信されます。
設定
DiditSdk.ConfigurationでSDKの動作をカスタマイズします。
設定オプション
カメラオプション
カメラオプションはWeb SDKのカメラオプションと同じです。 各レンズは.frontまたは.backです。
指定したレンズがデバイスにない場合、SDKはデバイスで利用可能な最初のカメラを使用します。
カメラが1つしかないデバイスでは、カメラ切り替えボタンも非表示になります。
切り替えボタンのオプションをfalseに設定すると、ユーザーはそのステップのデフォルトレンズに固定されます。
テーマとカラー:カラー、背景、イントロ画面の設定は、SDKの設定ではなく、Didit Consoleのホワイトラベル設定で行います。これにより、すべてのプラットフォームで一貫したブランディングが保たれます。
オプション
showLanguageSelector、showCloseButton、showExitConfirmation、closeOnCompleteはWeb SDKのDiditSdkConfigurationと同じです。モバイル固有のオプションlanguageLocaleとfontFamilyが存在するのは、モバイルSDKが認証UI全体をネイティブで描画するためです(Web SDKは、iframe内のホスト型フロントエンドに処理を委ねます)。言語サポート
SDKは54言語に対応しています。言語が指定されていない場合、SDKはデバイスのロケールを使用し、フォールバックとして英語を使用します。高度なセッションパラメーター
高度なセッションパラメーター(contact_details、expected_details、metadata、callback)を使用するには、Backend Session方式を使用してください。バックエンドがすべてのパラメーターを指定してCreate Verification Session APIを呼び出し、その後session_tokenをSDKに渡します。
結果の処理
VerificationResult列挙型は認証の結果を提供します。
結果のケース
SessionDataのプロパティ
エラーの種類
接続の切断
認証中にデバイスの接続が切れた場合、SDKはステップを読み込み中のままにせず、「No internet connection」画面を表示します。 SDKはバックグラウンドで接続状況の確認を続け、Diditに再び接続できるようになるとすぐにこの画面を自動で閉じます。ユーザーは中断したステップから続行できます。 この画面にはTry Againが表示され、showCloseButtonがtrue(デフォルト)の場合はExit Verificationも表示されます。
終了すると認証は.failed(error: .networkError, session:)で終了するため、ユーザーが接続の問題で離脱したことをアプリで把握できます。
結果処理の完全な例
プログラムによる認証の終了
DiditSDK 3.6.0+で利用できます。
DiditSdk.shared.dismiss()を使って、進行中の認証をプログラムで終了できます。ホスト側が画面の制御を引き継ぐ必要がある場合(たとえばアプリがバックグラウンドに移行するとき)は、この方法で認証を終了することを推奨します。
dismiss()はSDKの通常の完了処理を経由します。表示中のUIを閉じ、内部状態をリセットしたうえで、.diditVerificationハンドラーを.cancelled(session:)で呼び出します。セッションが作成済みの場合は、現在のsessionIdがこれに含まれます。進行中の認証がない場合は何も行いません。
例: アプリのバックグラウンド移行時に終了する
SDKの状態の監視
SDKの状態を監視して、独自の読み込みUIを実装できます。エンドツーエンドの例 (バックエンドのセッション → iOS SDK → 結果)
このパターンは本番環境向けの連携方法です。バックエンドがセッションを作成し、iOSアプリがsession_tokenを受け取り、SDKがフローを実行します。