Swift — 玩玩 Touch ID & FaceID 驗證

在你的應用中加入 Touch ID 和 Face ID 的生物識別來進行身份驗證的功能。

Jeremy Xue
Jeremy Xue ‘s Blog
6 min readApr 1, 2019

--

Photo by Yura Fresh on Unsplash

前言:

😂 依舊是為了案子因素來研究新的項目,這次需要為 App 加上 Touch ID 以及 Face ID 的身份驗證,加上之前沒有碰過生物辨識這塊,因此想藉由這次機會來閱讀一下官方文件,並且將其流程實作一輪,當作案子執行前的事前預習和準備。

在許多 App 應用中,常常會使用生物辨識方式,來取代原本使用密碼或是類似於密碼的機制,如此一來不需要透過複雜且繁複的輸入或是記憶成堆的密碼,使用者只需要輕鬆的透過指紋、人臉等等其他生物辨識方式,即可輕鬆的進行身份認證來訪問功能。

若沒有看過官方文檔或是其他文件,可以參考我這篇 Apple 官方文檔中關於 LocalAuthentication & LAContext 的中文版本:

# 實作:

⚠️ 想知道更多細節的朋友可以同時配合這篇官方文檔服用。

。 設置 Info.plist 文件

如果你的 App 有需要加入 Face ID 的話,那我們必須在 Info.plist 新增 NSFaceIDUsageDescription 的 key。

在我們使用任何生物辨識技術的專案中,我們需要在 App 中的 Info.plist 文件中加入 NSFaceIDUsageDescriptionkey。如果沒有這個 key,系統將不允許你的 App 使用 Face ID。這個 key 的值是系統在你的 App 首次嘗試使用 Face ID 時向用戶顯示的 String。此 String 應該清楚的解釋你的 App 需要訪問此身份驗證機制的原因。系統不需要 Touch ID 的類似用法說明。

NSFaceIDUsageDescription 支援 iOS 11及更高版本。

。 創建和配置上下文

你可以使用 LAContext 實例在 App 中執行生物識別身份驗證,該實例代理你的應用與 Secure Enclave 之間的交互。首先我們創建一個上下文:

* 別忘了 import 我們身份驗證的框架
import LocalAuthentication
// 創建一個上下文實例
var context = LAContext()

你可以自定義上下文使用的訊息,來引導使用者完成流程。 例如:你可以為各種警報視圖中顯示的「取消」 按鈕設置自定義訊息:

context.localizedCancelTitle = "Enter Username/Password"

這有助於使用者了解當他們點擊按鈕時,他們將恢復正常的身份驗證過程。

。 測試方案可用性

在嘗試進行身份驗證之前,請通過調用 canEvaluatePolicy 方法進行測試以確保確實能夠執行此操作:

因為該方法第二個 error 參數類型為 NSErrorPointer ,所以我們會先宣告一個 NSError? 的變數(可能為 nil)來接收返回的錯誤,若想忽略錯誤就將參數指定為 nil

如果方法失敗,它將使用此參數返回錯誤,詳細說明出錯的地方。 有關可能的錯誤代碼,請參閱 LAError.Code

。 評估指定方案

接下來我們可以透過 evaluatePolicy 方法,藉由該方法所回調中的 Success 這個 Bool 類型值來判斷方案是否執行成功,而其錯誤 error 如同上面的錯誤相同,一樣可以參考 LAError.Code

。身份驗證流程程式碼

#DEMO

接著讓我們測試一下是否能夠使用 Touch ID 進行登入吧,這邊小弟在下我是使用 iPhone 8 plus 進行 Demo:

Touch ID 登入&取消

#Github 連結:

後記:

原本以為這種生物辨識的技術寫起來會很繁複,但是實際上透過原生的 LocalAuthentication 框架實作起來好像沒有特別複雜,可見 Apple 爸爸幫我們做了多少事情,藉由一個方法就能知道身份認證是否成功。當然它不僅僅只有這種用途,他還有其他使用方式,像是可以配合 KeyChain 來使用,如果以後有機會再介紹。

關於使用 Touch ID 或是 Face ID 登入的方式,Apple 官方也有釋出官方的範例,有興趣的也能參考:

[Sample Code] Logging a User into Your App with Face ID or Touch ID

--

--

Jeremy Xue
Jeremy Xue ‘s Blog

Hi, I’m Jeremy. [好想工作室 — iOS Developer]