authme_ekyc_sdk 3.0.1
authme_ekyc_sdk: ^3.0.1 copied to clipboard
Flutter plugin for the AuthMe eKYC SDK: OCR-based identity document recognition (Taiwan + 12 other regions), liveness detection, and NFC passport verification on iOS and Android.
3.0.1 #
🔧 技術改進 #
- Android: AuthMe SDK 升級至 2.8.2。
- 三項 OCR 啟動時序相關 fatal crash(ModelRepository UnInitialized / stepFlows empty / lateinit remoteParams)收斂為正常結束 + 明確錯誤碼回傳,不再 native fatal exception。
🛡️ 強化 #
- Android Plugin:
startFeature進場除原本的isAuthMeInitialized旗標檢查外,新增AuthMe.context != null雙重保險。- 解決 process 被系統回收後 plugin instance 旗標仍為 true 但 AuthMe 內部 static context 已 null,導致 OCR Activity 啟動瞬間取不到 ModelRepository 而 crash 的 race condition。
- 搭配上方 Android SDK 兜底修正,徹底處理 OCR 啟動時序相關 crash。
📝 整合方提醒(Best Practices) #
為避免無謂的 Activity 啟動/立即 finish 閃跳,建議整合方 Flutter 端配合:
await initialize()完成才 enable OCR 入口按鈕(init 進行中或失敗時 disable 或提示重試)- OCR 進行中以
PopScope(canPop: false)攔截使用者返回,或維護自家「OCR in-progress」狀態 - 接住
startFeature拋出的PlatformException與resultStream上的{error: ...}event 做對應 UI 處理
提醒:native fatal exception 無法用 Dart 的 try-catch 攔截,必須靠 plugin 回傳 event + 整合方狀態管理這條路。
3.0.0 — 2026-05-22 #
⚠️ Breaking Changes #
- iOS: 移除 CocoaPods 安裝路徑,改為純 Swift Package Manager。
- 不再提供
authme_ekyc_sdk.podspec,原本透過AuthMe01/PodSpecs.git取得的 pod 路線停用。 - 需要 Flutter 3.32+ 且 SPM 啟用(3.32+ 預設啟用)。
- 升級指引請見 README「iOS Setup」章節。
- 不再提供
🚀 新功能與改進 #
- iOS: AuthMeSPM 升級至 2.9.20(AuthMe / AuthMeUI 2.9.20、AuthmeNFCKit 2.0.10、Algo / OpenSSL 9.0.32)。
- Android: AuthMe SDK 升級至 2.8.1(原 2.8.0-rc.200)。
- Flutter Plugin:
- Plugin 重新組織為 SPM 標準佈局(
ios/authme_ekyc_sdk/Package.swift+Sources/),PrivacyInfo.xcprivacy移入 SPM target resources。 - iOS NFC reader UI 跟著
setLocale切換語系(原本寫死繁中)。 SSLConfig在 init 階段做基本檢查,設定錯誤印警告但不擋 init。AuthmeSdk/SSLConfig/AuthmeLocale補完 Dartdoc。
- Plugin 重新組織為 SPM 標準佈局(
🔧 技術改進 #
- Android:
AuthmeFeaturerawValue 對齊 Dart enum,原本非台灣地區的 feature 在 Android 全部回 INVALID_FEATURE,現在恢復可用。onActivityResult改依 dispatched feature 選 result extractor,不再用 try/catch 當 control flow。coroutineScope.cancel()on engine detach,修 in-flight coroutine leak。
- iOS:
- ~70 個
print(...)收進#if DEBUGhelper,release build 不再 leak token prefix、device identifier 等 PII 到 NSLog。
- ~70 個
- Dart:
- Diagnostic logging 收進
kDebugMode;token logging 安全化,短 token 不再RangeError。
- Diagnostic logging 收進
- Build / CI:
publish_to_pub_dev.yml加入 pubspec / tag /android/build.gradle/ CHANGELOG 版本一致性檢查。pr_validation.yml移除pod install,新增 SPM enable step。- 新增
Customer Env Build Checkworkflow,乾淨環境驗證 plugin 能 build。 - pubspec.yaml 補
repository/issue_tracker/topics;android/build.gradle版本對齊 (3.0.0)。
🐛 修復問題 #
- iOS FlutterResult 契約:
setLocale/refreshToken補上result(nil),原本 Dart Future 永遠 hang。initialize的URL(string:)!改guard let,原本 bad serverURL 會 crash host app。AuthMeCore.build()失敗改為回INITIALIZATION_FAILED,原本錯誤被 print 吞掉。confirmScanResult的forEach改為 typedfor-in,原本 bad arg 會 double-call FlutterResult。startFeature的flow.exception改走 result stream,避免與同步result(nil)衝突 double-call。
- 兩平台:
lastOCRResult在新startFeature進場時清掉,避免舊 scan 資料被 commit。 - iOS:
coordinatorDidFinishScan補上外層 modal 的 dismiss + 結束時若無 result 交付則自動發 cancellation 解鎖。原本 Flutter host 沒 UINavigationController 時 SDK 把.pushfallback 成 modal 呈現,scan 結束後 modal 不會自己消失;另一個常見情境是使用者在 Liveness 半途點返回,SDK 不會走.canceleddelegate,Dart 端的 in-progress 鎖永遠不解、下一次 startFeature 被 silently 拒絕。兩個問題一起修。 - README 校對:刪除程式碼裡不存在的
enableDebug/setErrorHandler/customizeUI/stopNFCPassportScan;setLocale範例改為AuthmeLocale.zhHant;Liveness 結果格式說明改為忠實反映兩平台現狀。 - example app 不再寫死
client_secret,改為讀String.fromEnvironment('AUTHME_CLIENT_SECRET')。 - 移除過時腳本
create_pubspec.sh/ios/create_podspec.sh;example 的.cxx/build artifact 退 git。 - 單元測試:
test/ekyc_sdk_test.dart與AuthmeEkycSdkPluginTest.kt從 stub 換為實質覆蓋AuthmeFeaturerawValue /AuthmeLocale字串映射 /SSLConfigwire 格式。
⚠️ 已知議題 #
- iOS Liveness 結果為 raw string(
succeed/failed/unknown),與 Android 的{result: "success"}不一致,跨平台 shape 對齊列為下一個 minor 的 breaking change。建議目前用final passed = value == 'success' || value == 'succeed';同時相容。 captureTimeout參數目前兩平台都不會生效(native SDK 尚未提供對應 builder method)。
ℹ️ Migration Note #
若你下游 app 還在 Flutter <3.32 或刻意關閉了 SPM,請繼續使用 ^2.8.x,本版不相容。
2.8.21 #
🔧 技術改進 #
- Android:
- AuthMe SDK 升級至 2.8.0-rc.200
- Flutter Plugin (Android):
TWIDFraudfeature 補上TWN_IDCard_Front步驟,修正init-scan-doc回 400 的問題startFeature進場先OCRFactory.disablePlugin()清除前一輪註冊的 plugin,避免狀態殘留
🐛 修復問題 #
- 修正 host app 整合 SDK 時的多項 crash
- 修正
AgreementActivity/ConfirmPhotoActivity在非 AppCompat theme host 下的IllegalStateException - 修正 OCR 流程在 process death 後重啟導致的
UnInitialized/lateinit remoteParams/stepFlows is emptycrash - 修正
OCRResultActivity/OCRResultComposeActivity/NfcResultActivity在 intent extra 缺失時的NullPointerException
- 修正
- 修正 OCR 結果頁(如護照流程)確認按鈕初始 disabled 卡住,需點欄位才會亮起的問題
⚠️ 已知議題 #
AuthmeFeature.NFCPassport(護照 NFC 讀取)目前無法完成讀取,預計下一版修正。需要護照辨識請暫時改用AuthmeFeature.Passport(純 OCR 流程)。
2.8.19 #
2.8.17 #
2.8.9 #
🚀 新功能與改進 #
- Android 16 KB 頁面對齊支援: 啟用
useLegacyPackaging = false以支援 Android 15+ 的新頁面大小要求 - 依賴版本升級:
- Kotlin 升級至 2.1.20
- Gradle Plugin 升級至 8.13.0
- Lottie 升級至 6.3.0
- AuthMe SDK 升級至 2.8.0-rc.178 (Android) / 2.8.42 (iOS)
🔧 技術改進 #
-
Android:
- compileSdk 升級至 35
- minSdk 提升至 24 (Android 7.0+)
- 改善 NFC plugin 初始化錯誤處理
- 新增使用前檢查機制,避免未初始化錯誤
- 加入詳細的錯誤日誌記錄
-
iOS:
- 更新 AuthMe、AuthMeUI 至 2.8.42
- 更新 AuthmeNFCKit 至 1.0.19
- 修正編譯錯誤 (localizedDescription)
-
Example App:
- Java 相容性升級至 17
- 改用本地 path 依賴以便開發測試
🐛 修復問題 #
- 修正 Android NFC plugin 未初始化導致的崩潰問題
- 修正 iOS Swift 編譯錯誤
- 修正 Java 版本過時警告
2.8.0 #
🚀 新功能與改進 #
- iOS 依賴更新: 更新 AuthMe 和 AuthMeUI 到 2.8.35 版本
- 支援最新的 AuthMe SDK 功能
- 改善 iOS 平台的穩定性和效能
- 修復 XCFramework 連結問題
🔧 技術改進 #
- CocoaPods 配置優化:
- 添加 AuthMe 私有倉庫源配置
- 使用靜態框架連結方式解決依賴衝突
- 改善 iOS 編譯和連結流程
📱 平台特定改進 #
-
iOS:
- 修復 Git LFS 文件下載問題
- 優化 XCFramework 處理機制
- 改善靜態框架依賴管理
- Liveness Result 調整: 更新
LivenessResult類型引用,從AuthMeLivenessViewController.LivenessResult改為LivenessResult - 移除過時配置: 移除
captureTimeout配置項
-
Android:
- Liveness Result 調整: 更新
LivenessResult.Success為AuthMeResult.LivenessSuccess - OCR Result 調整: 修正 OCR 結果資料結構,從
result.map改為result.data - 效能優化: 改善
confirmScanResult的 coroutine 處理機制
- Liveness Result 調整: 更新
🐛 修復問題 #
- 修正 iOS 平台 XCFramework 連結錯誤
- 解決 AuthMe 依賴版本衝突問題
- 修復 Git LFS 文件未正確下載的問題
- 修復 Android 平台 OCR 結果資料結構不一致問題
- 修正 Liveness 結果處理的類型引用問題
2.7.20 #
🚀 新功能與改進 #
- Android 效能優化: 修正
confirmScanResult方法中的 suspend function 處理機制- 使用
CoroutineScope和Dispatchers.Main確保非阻塞執行 - 避免主線程阻塞,提升應用程式響應性
- 改善 UI 操作的安全性,確保所有 UI 相關操作在主線程執行
- 使用
🔧 技術改進 #
- 錯誤處理增強:
- 在 coroutine 內外都加入適當的錯誤處理機制
- 使用
withContext(Dispatchers.Main)確保錯誤回傳在主線程 - 保持原有的資源清理邏輯,避免記憶體洩漏
📱 平台特定改進 #
- Android:
- 新增
kotlinx.coroutines相關依賴 - 實作
CoroutineScope實例管理 - 優化
lastOCRResult?.confirm()的執行方式
- 新增
🐛 修復問題 #
- 修正 Android 平台在處理 OCR 確認時可能造成的 UI 凍結問題
- 改善 Flutter 與原生 Android 代碼的協調性
2.7.19 #
- 新增手動拍照開關參數。
- 修正 Android 下載 Model 錯誤的問題。
2.7.16 #
- 調整 Android Refresh Token 解析失敗處理流程。
- 修正 NFCScanActivity Theme 沒有正確設定問題。
2.7.15 #
- 加入 Android activity 自定義 result code callback 機制。
2.7.14 #
- 移除前版 iOS Map 型態不支援 dynamic 的程式碼。
- 加入 Android activity result callback filter。
2.7.13 #
- 修正 iOS Map 型態不支援 dynamic 的問題。
2.7.12 #
- 修正 iOS 出現有機率會當掉沒有任何回應,導致必須重啟APP問題。
- 修正 iOS scanConfirm 無法回傳問題。
2.7.11 #
- 調整 Result map 正反面編碼處理方式
2.7.9 #
- 移除 OCR 背面過濾沒值的機制
2.7.8 #
- 修正台灣身分證沒有拿到 back image 的問題
- 加入 Result map 可以取得正反面原圖與截圖
2.7.7 #
- 調整修正回傳 map 不為 Map<String, dynamic>
2.7.6 #
- 增加 StreamSubscription 重新註冊事件防呆
2.7.5 #
- 調整 SDK 初始化Token 雙平台接口一致
2.7.2 #
- 增加 Exception 處理機制
2.7.0 #
- 新增 Flutter bridge to Authme EKYC SDK