iOS Touch ID 身份認(rèn)證
iOS Touch ID 身份認(rèn)證
iOS 8 及以后錄了指紋的設(shè)備可以使用 touch ID 進(jìn)行身份認(rèn)證,指紋符合錄入的指紋才能認(rèn)證成功。
步驟
- 導(dǎo)入 LocalAuthentication 框架:import LocalAuthentication
- 初始化 LAContext 對(duì)象:let context = LAContext()
- 調(diào)用 LAContext 對(duì)象的 canEvaluatePolicy(_ policy: LAPolicy, error: NSErrorPointer) -> Bool方法
- 上一步如果返回 false,表示不能進(jìn)行認(rèn)證,執(zhí)行相應(yīng)的失敗操作;如果返回 true,調(diào)用 LAContext 對(duì)象的evaluatePolicy(_ policy: LAPolicy, localizedReason: String, reply: @escaping (Bool, Error?) -> Void)方法,在 reply 中判斷是否認(rèn)證成功來(lái)執(zhí)行相應(yīng)的操作(如果認(rèn)證失敗,可以獲取錯(cuò)誤碼 code,看看屬于 LAError.Code 的哪種類型錯(cuò)誤來(lái)執(zhí)行相應(yīng)的失敗操作)
調(diào)用 LAContext 對(duì)象的 canEvaluatePolicy 和 evaluatePolicy 方法都要傳入 LAPolicy 枚舉類型的值,目前有兩種取值:deviceOwnerAuthenticationWithBiometrics 和 deviceOwnerAuthentication。前一種 deviceOwnerAuthenticationWithBiometrics 是進(jìn)行指紋認(rèn)證。后一種 deviceOwnerAuthentication 是 iOS 9.0 及以后才能使用,先進(jìn)行指紋認(rèn)證,如果指紋認(rèn)證失敗可以通過(guò)輸入密碼進(jìn)行認(rèn)證。
調(diào)用 LAContext 對(duì)象的 evaluatePolicy 方法會(huì)彈出指紋認(rèn)證對(duì)話框。對(duì)話框會(huì)顯示需要進(jìn)行認(rèn)證的原因(String),就是 localizedReason 參數(shù)的值。對(duì)話框有取消按鈕,iOS 10.0 及以后可以設(shè)置 LAContext 對(duì)象的 localizedCancelTitle 的值來(lái)改變?nèi)∠粹o顯示的字。如果指紋認(rèn)證失敗,對(duì)話框還會(huì)顯示 fallback 按鈕,可以設(shè)置 LAContext 對(duì)象的 localizedFallbackTitle 的值來(lái)改變 fallback 按鈕顯示的字。
需要注意,evaluatePolicy 方法的 reply 回調(diào)不在主線程。如果需要更新 UI 的話,要調(diào)用主線程再更新。
代碼示例
代碼已上傳GitHub:https://github.com/Silence-GitHub/TouchIDDemo
在控制器中放置一個(gè) label 顯示認(rèn)證返回結(jié)果。
指紋認(rèn)證代碼
let context = LAContext()
context.localizedFallbackTitle = "Fall back button"
if #available(iOS 10.0, *) {
context.localizedCancelTitle = "Cancel button"
}
var authError: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) {
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Localized reason for authentication with biometrics", reply: { (success, evaluateError) in
// NOT in main thread
DispatchQueue.main.async {
if success {
self.label.text = "Success"
// Do something success
} else if let error = evaluateError {
self.label.text = error.localizedDescription
// Deal with error
if let code = LAError.Code(rawValue: (error as NSError).code) {
switch code {
case .userFallback:
print("fall back button clicked")
default:
break
}
}
}
}
})
} else if let error = authError {
label.text = error.localizedDescription
// Deal with error
}
指紋和密碼認(rèn)證代碼
if #available(iOS 9.0, *) {
let context = LAContext()
context.localizedFallbackTitle = "Fall back button"
if #available(iOS 10.0, *) {
context.localizedCancelTitle = "Cancel button"
}
var authError: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Localized reason for authentication", reply: { (success, evaluateError) in
// NOT in main thread
DispatchQueue.main.async {
if success {
self.label.text = "Success"
// Do something success
} else if let error = evaluateError {
self.label.text = error.localizedDescription
// When fall back button clicked, user is required to enter PIN. Error code will not be "userFallback"
// Deal with error
}
}
})
} else if let error = authError {
label.text = error.localizedDescription
// Deal with error
}
} else {
let alert = UIAlertController(title: nil, message: "Authentication is available on iOS 9.0 or later", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alert, animated: true, completion: nil)
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Flutter Widgets粘合劑CustomScrollView NestedScrollVie
這篇文章主要為大家介紹了Flutter Widgets粘合劑CustomScrollView NestedScrollView滾動(dòng)控件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
iOS開發(fā)之如何通過(guò)PUT請(qǐng)求上傳數(shù)據(jù)
眾所周知一般的服務(wù)器上傳數(shù)據(jù)都是用POST請(qǐng)求,這樣通過(guò)AFNetworking的POST請(qǐng)求穩(wěn)穩(wěn)的,但是有一天遇到一個(gè)問(wèn)題,服務(wù)器上傳數(shù)據(jù)用的是PUT請(qǐng)求,發(fā)現(xiàn)用AFNetworking并不是那么好用,下面這篇文章就來(lái)講一下如何通過(guò)PUT請(qǐng)求上傳數(shù)據(jù)。有需要的朋友們可以參考借鑒。2016-11-11
iOS開發(fā)中實(shí)現(xiàn)hook消息機(jī)制的方法探究
這篇文章主要介紹了iOS開發(fā)中實(shí)現(xiàn)hook消息機(jī)制的方法探究,這里用到了一個(gè)Method Swizzling原理,需要的朋友可以參考下2015-10-10
深入學(xué)習(xí)iOS7自定義導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了iOS7自定義導(dǎo)航轉(zhuǎn)場(chǎng)動(dòng)畫的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-02-02
iOS實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)的改變
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)的改變的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08
iOS開發(fā)技巧之狀態(tài)欄字體顏色的設(shè)置方法
有時(shí)候我們需要根據(jù)不同的背景修改狀態(tài)欄字體的顏色,下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)技巧之狀態(tài)欄字體顏色的設(shè)置方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧2018-08-08
ios開發(fā)加載webview顯示進(jìn)度條實(shí)例
本篇文章主要介紹了ios開發(fā)加載webview顯示進(jìn)度條實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
在iOS應(yīng)用中使用UIWebView創(chuàng)建簡(jiǎn)單的網(wǎng)頁(yè)瀏覽器界面
這篇文章主要介紹了在iOS應(yīng)用中使用UIWebView創(chuàng)建簡(jiǎn)單的網(wǎng)頁(yè)瀏覽器界面的方法,包括動(dòng)態(tài)獲取UIWebView高度的實(shí)現(xiàn),需要的朋友可以參考下2016-01-01

