GitHubリポジトリ
GitHubでソースコードとサンプルを確認できます
pub.devパッケージ
didit_sdk
ネイティブSDK: Flutterアプリにはこの方法を推奨します。このSDKはプラットフォームチャネルを介してネイティブのiOS SDKとAndroid SDKをラップしており、最適なユーザー体験、最適化されたカメラ処理、完全なNFCサポートを実現します。
要件
プラットフォーム要件
生体認証への同意にはネイティブSDK 4.10.0以降が必要です。 イリノイ州、テキサス州、コロラド州の法律が適用される人に対して、Diditは最初の顔撮影の前に明示的な生体認証への同意を求めることができます。ネイティブのiOSおよびAndroid SDKを4.10.0以降に固定指定しているFlutter SDKリリースでは、このステップが表示されます。それより前のバージョンではこのステップを表示できません。その場合、セッションは従来どおりに進行し、判定では同意は未取得として報告されます(
biometric_consent.reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK")。これらの州の人を認証する場合はアップグレードしてください。インストール
pubspec.yamlに手動で追加します。
ネイティブSDKのバリアント
didit_sdkには完全なネイティブSDKが同梱されています。
バイナリサイズを小さくしたい場合は、代わりにバリアントパッケージを依存関係として指定してください。バリアントパッケージはまったく同じDart APIを公開し、両プラットフォームで対応するネイティブSDKを固定指定します。
package:didit_sdk_core/sdk_flutter.dart。
iOSのセットアップ
このプラグインは、FlutterのiOS向け依存関係マネージャーであるSwift Package ManagerとCocoaPodsの両方に対応しています。Swift Package Manager
お使いのFlutterでSwift Package Managerのサポートが有効になっている場合(Flutter 3.24+ではflutter config --enable-swift-package-managerで有効化できます)、プラグインは自動的にSwiftパッケージとして利用されます。
Podfileの設定は不要です。ネイティブのDiditSDK依存関係はGitHubから自動的に解決されます。
Xcodeで、アプリのiOSデプロイメントターゲット(Runnerターゲットとプロジェクト)を、選択したパッケージの最小バージョンに設定してください。didit_sdkとdidit_sdk_nfcは15.0、didit_sdk_coreとdidit_sdk_autodetectionは13.0です。
CocoaPods
didit_sdkを使用する場合、プラグインはアプリのios/Podfileで設定するRubyのグローバル変数$DiditSdkIosVariantに基づいて、ネイティブiOS SDKのバリアントを選択します(DiditSDKのpodはCocoaPods trunkには公開されていません)。
didit_sdk_core、didit_sdk_autodetection、didit_sdk_nfc)を使用する場合、そのパッケージがネイティブのsubspecを直接固定指定し、$DiditSdkIosVariantは無視されます。Podfileのpod行とデプロイメントターゲットは、そのバリアントに合わせてください(例: pod 'DiditSDK/Core', :podspec => ...とplatform :ios, '13.0')。
allとnfcのバリアントには、iOS 15.0+のデプロイメントターゲットが必要です。coreとautodetectionはiOS 13.0をターゲットにできます。バリアントを切り替える際は、以前のSDKバリアントが再利用されないよう、先にCocoaPodsをクリーンアップしてください(rm -rf Pods Podfile.lock)。Androidのセットアップ
デフォルトでは、プラグインはNFCを含む完全なAndroid SDKに依存します。NFCなしでビルドするには、android/gradle.propertiesに次を追加します。
me.didit:didit-sdkからme.didit:didit-sdk-coreに切り替わり、NFCリーダーモジュールと、それが依存するJMRTD/SCUBA/BouncyCastleが除外されます。
NFCが有効な場合(デフォルト)は、BouncyCastle由来のメタデータファイルの重複を解消するため、android/app/build.gradle.ktsに次のパッケージングルールを追加してください。
mergeDebugJavaResourceエラーで失敗します。diditSdkAndroidNfcEnabled=falseの場合、このルールは不要です。
AndroidのネイティブSDKは、リモートのGitHub Mavenリポジトリから解決されます(プラグイン3.4.0以降)。アプリ側でMavenを手動で設定する必要はありません。
権限
iOS
アプリのInfo.plistに次のキーを追加します。
NFCの設定
チップ付きのパスポートやIDカードのNFC読み取りを有効にするには、次の手順を行います。-
XcodeでNFC機能を追加します。
- ターゲットを選択し、Signing & Capabilities > + Capability > Near Field Communication Tag Readingの順に選択します
-
Info.plistにISO7816識別子を追加します。
D392F000260100000001を追加すると、SDKはJPKIを通じて日本のマイナンバーカードを読み取れるようになります。この識別子がないと、iOSはカードをSDKに通知しません。マイナンバーカードの読み取りは本番環境ではまだ有効になっていませんが、この識別子は他の書類には影響しないため、今のうちに追加しておけます。
- NFCタグ読み取りを有効にしたentitlementsファイルを追加します。
com.apple.developer.nfc.readersession.formats entitlementがないというエラーでXcodeによる署名が失敗します。
このNFC設定は、coreまたはautodetectionバリアント($DiditSdkIosVariant)や、didit_sdk_core / didit_sdk_autodetectionパッケージでは不要です。これらはいずれもチップを読み取りません。
Android
次の権限はSDKのAndroidManifest.xmlで宣言されており、自動的にマージされます。
カメラとNFCのハードウェア機能は任意(
android:required="false")として宣言されているため、これらの機能を持たない端末にもアプリをインストールできます。diditSdkAndroidNfcEnabled=falseの場合、SDKはAndroidのNFC権限と機能を追加しません。
ランタイム権限
SDKはAndroidのランタイム権限のリクエストを自動的に処理します。ユーザーがカメラへのアクセスを必要とするステップに到達すると、次のように動作します。- カメラ権限がまだ付与されていない場合、SDKが権限を求めます
- ユーザーが権限を拒否した場合、Try Againボタン付きのエラーメッセージが表示されます
- ユーザーが権限を許可した場合、検証フローが続行されます
startVerification()を呼び出す前にアプリのコードでカメラ権限をリクエストする必要はありません。SDKが内部で管理します。
クイックスタート
連携方法
SDKは2つの連携方法をサポートしています。方法1: セッショントークン(本番環境で推奨)
検証セッション作成APIを使ってバックエンドでセッションを作成し、トークンをSDKに渡します。- セッションとユーザーの紐付け(
vendor_data) - カスタムメタデータの設定
- セッションごとのコールバックの設定
方法2: ワークフローID(より簡単な連携)
より簡単な連携の場合、SDKはワークフローIDを使って直接セッションを作成できます。バックエンドは不要です。高度なセッションパラメーター(
contact_details、expected_details、metadata)は、セッショントークン方式でのみサポートされます。この方式では、バックエンドがすべてのパラメーターに対応したセッション作成APIを呼び出します。返されたsession_tokenをDiditSdk.startVerification()に渡してください。設定
DiditConfigオブジェクトを渡すことで、SDKの動作をカスタマイズできます。
startVerificationWithWorkflowでは、configを名前付きパラメーターとして渡します。
設定オプション
カメラオプション
カメラオプションはWeb SDKのカメラオプションと同じです。 各レンズにはCameraLens.frontまたはCameraLens.backを指定できます。
指定したレンズがデバイスにない場合、SDKはデバイスにある最初のカメラを使用します。
カメラが1台しかないデバイスでも、カメラ切り替えボタンは非表示になります。
切り替えボタンのオプションをfalseに設定すると、ユーザーはそのステップのデフォルトレンズに固定されます。
テーマとカラー: カラー、背景、イントロ画面の設定は、SDKの設定ではなく、Didit Consoleのホワイトラベル設定で行います。これにより、すべてのプラットフォームで一貫したブランディングが保たれます。
言語サポート
SDKは54言語に対応しています。言語が指定されていない場合、SDKはデバイスのロケールを使用し、フォールバックとして英語を使用します。高度なセッションパラメーター
contact_details、expected_details、metadataなどのパラメーターは、セッショントークン方式でのみサポートされています。バックエンドがすべてのパラメーターに対応したPOST /v3/session/を呼び出し、返されたsession_tokenをSDKに渡します。
Dartの
startVerificationWithWorkflowメソッドが受け付けるのはworkflowId、vendorData、configのみです。3.4.0より前のバージョンではcontactDetails、expectedDetails、metadataパラメーターが公開されていましたが、Unilinkエンドポイントがこれらのパラメーターを無視するため削除されました。結果の処理
startVerificationとstartVerificationWithWorkflowはどちらもFuture<VerificationResult>を返します。結果はsealedクラスなので、パターンマッチングを使って結果を判定してください。
結果のケース
SessionDataのプロパティ
エラーの種類
VerificationErrorType列挙型には次のケースがあります。
接続が切れた場合
認証中にデバイスの接続が切れると、SDKはステップを読み込み中のままにせず、フローの上に「No internet connection」画面を表示します。 SDKはバックグラウンドで接続の確認を続け、Diditに再び接続できるようになるとすぐに自動的に画面を閉じます。ユーザーは中断したステップから再開できます。 この画面にはTry Againと、閉じるボタンが無効になっていない限りExit Verificationが表示されます。 終了すると、エラーの種類がnetworkErrorであるVerificationFailedの結果で認証が終了するため、ユーザーが接続の問題で離脱したことをアプリ側で把握できます。
結果処理の完全な例
エンドツーエンドの例 (バックエンドのセッション → Flutter SDK → Webhook)
本番環境に対応した連携では、バックエンドがセッションを作成し、Flutterアプリがsession_tokenを受け取り、SDKがフローを実行します。最終的な判定はWebhook経由でバックエンドに配信されます。クライアント側の結果だけを信頼しないでください。