2021年6月7日 星期一

TouchID 或 FaceID 的基本應用

 今天來玩玩裝置生物識別的功能,

也就是TouchID or FaceID

雖然現在主要大多數有應用的APP基本上都是金融業居多。

但也是有部分的APP有引入此功能,

假設您的APP非一次性登入加入驗證生物識別可大大提升使用者體驗...

下面直接就來寫重點拉!

從基本設定開始,第一步先開啟info.plist

加入Privacy - Face ID Usage Description 後面字串就自行發揮吧!

例如:使用TouchID/FaceID進行登入

此加入僅限於FaceID,TouchID是不用加入該授權的。

接下來在要引用的ViewController加入import LocalAuthentication

然後宣告一個變數 並init. var context = LAContext()

接下來就是實作了,網路上我看過的範例多數都是直接寫一個Action執行,

我則是另外寫了一個方法進行,你可以依照你習慣的方式去進行不同的改變。

首先先檢查裝置是否可使用生物識別

 if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) { 

//省略

        } else {

            if let error = error {

               errorCode(error)

            }

            

        }

如果error直接跳錯誤訊息,成功則進行生物辨識,如下:

            //此文字會顯示於辨識時訊息

            let reason = "使用TouchID或FaceID進行驗證"

            // 使用哪種方法進行生物驗證

            context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { (success, error) in

                if success {

                    DispatchQueue.main.async { [unowned self] in

                        //成功直接執行login

                        showAlert(title: "成功", "您已驗證成功")

                    }

                } else {

                    DispatchQueue.main.async { [unowned self] in

                        if let error = error {

                            errorCode(error)

                        }

                        

                    }

                }

            }

reason所使用文字建議你們使用一個通用的文字..

順帶一提官方提供的生物辨識有兩種方法,deviceOwnerAuthenticationWithBiometrics

deviceOwnerAuthentication  而我引用後者,金融業都是使用前者。兩種方法玩起來不一樣,我引用的當您失敗過多次後仍然可透過裝置所設定密碼執行驗證,前者則無法...這邊再由各位自己去玩看看吧!

而驗證可直接寫在檢查裝置是否可使用生物識別的判斷內,也可跟我一樣拆開寫。看當下案子需求能做不同的變化。

在此再附上我的errorCode(錯誤有很多種可以自己完)基本上我的error因使用的是deviceOwnerAuthentication的方法照理說都用不太到,

要研究error建議使用deviceOwnerAuthenticationWithBiometrics

 func errorCode(_ error:Error) {

        switch error {

        case LAError.authenticationFailed:

            print("Authentication failed")

        case LAError.passcodeNotSet:

            showAlert(title: "錯誤", "您未設定密碼")

        case LAError.systemCancel:

            showAlert(title: "錯誤", "授權過程中被系統取消")

        case LAError.userCancel:

            showAlert(title: "錯誤", "授權被用戶取消")

        case LAError.userFallback:

            showAlert(title: "提示", "用戶取消生物辨識使用密碼驗證")

        case LAError.biometryNotAvailable:

            if context.biometryType == .faceID {

                showAlert(title: "提示", "您已關閉FaceID授權,請至系統設定中開啟。")

            } else if context.biometryType == .touchID {

                showAlert(title: "提示", "您已關閉TouchID授權,請至系統設定中開啟。")

            } else if context.biometryType == .none {

                showAlert(title: "提示", "您未授權TouchID或FaceID於APP中,請至系統設定中開啟。")

            }

        case LAError.biometryNotEnrolled:

            showAlert(title: "提示", "沒有登入生物識別,無法使用")

        case LAError.biometryLockout:

            showAlert(title: "錯誤", " 您已多次登入失敗,請使用一般登入。")

        case LAError.appCancel:

            print("APP取消驗證")

        default:

            print(error.localizedDescription)

        }

    }

錯誤訊息內你有注意到有個biometryType嗎?此方法是用來判斷它屬於哪種生物辨識驗證,至於none我個人覺得現在應該是不太會發生,因為iPhone 5s後的機種不是touchID就是FaceID所以照理說不會執行到none

以上很廢的分享文,提供您參考...希望能幫助到剛好有要使用沒玩過的朋友。