Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能
前言
從最初做應(yīng)用開始,我就密切關(guān)注用戶的反饋和評(píng)論。有時(shí)他們的要求確實(shí)并不合理,但當(dāng)大多數(shù)人提到一項(xiàng)功能時(shí),就該我們做產(chǎn)品的人反思了。 私密保護(hù)功能是用戶在評(píng)論中提到的,恰好像OneDay這樣比較私密的內(nèi)容確實(shí)可以增加這項(xiàng)功能。
指紋識(shí)別和面部識(shí)別雖然是兩個(gè)很不相同的交互,但從開發(fā)的角度他們卻只需要一套代碼就可以搞定。在做之前我先解釋下整個(gè)實(shí)現(xiàn)過程的重要環(huán)節(jié):
原理圖
1.我們需要一個(gè)數(shù)據(jù)來保存開關(guān)數(shù)據(jù),在設(shè)置中心,用戶根據(jù)喜好選擇是否開啟保護(hù)
2.一旦用戶打開應(yīng)用,通過判斷是否保護(hù)來加載遮擋頁面
3.在遮擋頁面自動(dòng)實(shí)現(xiàn)解鎖過程,同時(shí)用戶也可以點(diǎn)擊后解鎖
4.根據(jù)機(jī)型的不同,在設(shè)置中心需要顯示不同的解鎖名稱
一、基礎(chǔ)配置工作
實(shí)現(xiàn)指紋識(shí)別與面部識(shí)別,都是通過添加LocalAuthentication Framework來實(shí)現(xiàn)的。
導(dǎo)入LocalAuthentication Framework
之后在需要用到認(rèn)證的頁面,導(dǎo)入LocalAuthentication即可:
import LocalAuthentication
二、遮蓋頁創(chuàng)建與設(shè)置中心開關(guān)創(chuàng)建
在設(shè)置中心增加一欄開關(guān),暫且叫做Touch ID,最后會(huì)進(jìn)行標(biāo)題文字的修復(fù)。 創(chuàng)建一個(gè)單獨(dú)的遮蓋頁,只需要放置一句話及按鈕即可,按鈕將調(diào)用認(rèn)證過程,文件為LockViewContrller.swift。
為了方便調(diào)用,給遮蓋頁設(shè)置了StoryBoard ID為LockController。
四、設(shè)置中心實(shí)現(xiàn)數(shù)據(jù)的修改
利用CoreData將開關(guān)的數(shù)據(jù)存儲(chǔ)在ifProtect中,0表示開,1表示關(guān)。 設(shè)置數(shù)據(jù)的過程不會(huì)像其他數(shù)據(jù)那樣直接改變,必須判斷是否為用戶本人進(jìn)行開關(guān)。所以在SettingViewController.swift中,需要添加認(rèn)證的相關(guān)函數(shù)。
1.先導(dǎo)入LocalAuthentication:
import LocalAuthentication
2.操作函數(shù):
func touchID(){
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
// 開始進(jìn)入識(shí)別狀態(tài),以閉包形式返回結(jié)果。閉包的 success 是布爾值,代表識(shí)別成功與否。error 為錯(cuò)誤信息。
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "請(qǐng)用指紋解鎖", reply: {success, error in
if success {
// 成功之后的邏輯, 通常使用多線程來實(shí)現(xiàn)跳轉(zhuǎn)邏輯。
print("解鎖成功 success,允許設(shè)置")
if self.appDelegate.mysetting.ifProtect == Int64(1){
self.appDelegate.mysetting.ifProtect = Int64(0)
}else{
self.appDelegate.mysetting.ifProtect = Int64(1)
}
self.appDelegate.saveContext()
}else {
if let error = error as? NSError {
// 獲取錯(cuò)誤信息
let message = self.errorMessageForLAErrorCode(errorCode: error.code)
print(message)
}
//失敗之后
print("失敗了")
}
self.SettingTableView.reloadData()
})
}
}
當(dāng)是用戶本人且認(rèn)證成功時(shí),開關(guān)數(shù)據(jù)被改變;當(dāng)不是用戶本人或認(rèn)證不成功,開關(guān)數(shù)據(jù)不會(huì)改變。 為了保持頁面與數(shù)據(jù)統(tǒng)一,函數(shù)執(zhí)行后我們需要刷新頁面self.SettingTableView.reloadData() 。
3.獲取錯(cuò)誤情況:
func errorMessageForLAErrorCode(errorCode: Int) -> String {
var message = ""
switch errorCode {
case LAError.appCancel.rawValue:
message = "Authentication was cancelled by application"
case LAError.authenticationFailed.rawValue:
message = "The user failed to provide valid credentials"
case LAError.invalidContext.rawValue:
message = "The context is invalid"
case LAError.passcodeNotSet.rawValue:
message = "Passcode is not set on the device"
case LAError.systemCancel.rawValue:
message = "Authentication was cancelled by the system"
case LAError.touchIDLockout.rawValue:
message = "Too many failed attempts."
case LAError.touchIDNotAvailable.rawValue:
message = "TouchID is not available on the device"
// showPassWordInput()
case LAError.userCancel.rawValue:
message = "The user did cancel"
case LAError.userFallback.rawValue:
message = "The user chose to use the fallback"
default:
message = "Did not find error code on LAError object"
}
return message
}
五、首頁加載遮蓋頁
來到首頁HomeViewController,在viewDidLoad中加入下面代碼,來判斷每一次打開應(yīng)用是否需要認(rèn)證解鎖。 如果不需要,首頁可以正常顯示; 如果需要,將直接跳轉(zhuǎn)到LockController。
if self.appDelegate.mysetting.ifProtect == Int64(1){
print(self.appDelegate.mysetting.ifProtect)
print("需要解鎖")
if let lockVC = storyboard?.instantiateViewController(withIdentifier: "LockController") as? LockViewController {
self.present(lockVC,animated: false,completion: nil)
}else{
}
}else{
print("不需要解鎖")
}
六、在遮蓋頁中實(shí)現(xiàn)認(rèn)證
遮蓋頁LockController的背景通過虛化處理,可以到達(dá)遮蓋的目的。同時(shí)擁有認(rèn)證函數(shù),當(dāng)認(rèn)證成功后頁面自動(dòng)消失返回首頁。 因?yàn)樾枰J(rèn)證過程,因此也需要三個(gè)核心步驟。
1.導(dǎo)入LocalAuthentication:
import LocalAuthentication
2.操作函數(shù):
func touchID(){
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
// 開始進(jìn)入識(shí)別狀態(tài),以閉包形式返回結(jié)果。閉包的 success 是布爾值,代表識(shí)別成功與否。error 為錯(cuò)誤信息。
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "請(qǐng)用指紋解鎖", reply: {success, error in
if success {
// 成功之后的邏輯, 通常使用多線程來實(shí)現(xiàn)跳轉(zhuǎn)邏輯。
print("解鎖成功 success")
self.dismiss(animated: true, completion: nil)
}else {
if let error = error as? NSError {
// 獲取錯(cuò)誤信息
let message = self.errorMessageForLAErrorCode(errorCode: error.code)
print(message)
}
//失敗之后
print("失敗了")
}
})
}
}
認(rèn)證過程成功后,頁面會(huì)自動(dòng)消失:self.dismiss(animated: true, completion: nil)
3.當(dāng)用戶進(jìn)入頁面時(shí)自動(dòng)調(diào)取認(rèn)證過程:
override func viewWillAppear(_ animated: Bool) {
touchID()
}
4.或者通過手動(dòng)點(diǎn)擊開始認(rèn)證:
@IBAction func AuthenAction(_ sender: Any) {
touchID()
}
5.捕獲錯(cuò)誤跟設(shè)置頁面一樣。
七、根據(jù)屏幕尺寸修改開關(guān)標(biāo)題
最后,我們來修復(fù)設(shè)置中心按鈕的標(biāo)題文字。當(dāng)判斷手機(jī)為iPhone X時(shí),文字顯示為“面部識(shí)別”或“Touch ID”;當(dāng)不是iPhone X時(shí),顯示為“指紋識(shí)別”或“Touch ID”。這里我們用到了UIDevice來獲取了屏幕的高度:
if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
cell.SwitchTitle.text = "Face ID"
cell.SwitchImage.image = UIImage(named: "btn_setting_faceid")?.withRenderingMode(.alwaysTemplate)
}else{
cell.SwitchTitle.text = "Touch ID"
cell.SwitchImage.image = UIImage(named: "btn_setting_touchid")?.withRenderingMode(.alwaysTemplate)
}
以上的過程便可實(shí)現(xiàn)私密保護(hù),不過不會(huì)像系統(tǒng)解鎖那樣可以通過密碼解鎖。要實(shí)現(xiàn)密碼解鎖,還需要單獨(dú)開發(fā)該功能。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)我們的支持。
欄 目:Swift
本文標(biāo)題:Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能
本文地址:http://www.jygsgssxh.com/a1/Swift/11958.html
您可能感興趣的文章
- 01-11swift中defer幾個(gè)簡單的使用場景詳解
- 01-11Swift利用Decodable解析JSON的一個(gè)小問題詳解
- 01-11Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
- 01-11Swift中初始化init的方法小結(jié)
- 01-11Swift中定義單例的方法實(shí)例
- 01-11Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼
- 01-11Swift中排序算法的簡單取舍詳解
- 01-11Swift如何為設(shè)置中心添加常用功能
- 01-11Swift Json實(shí)例詳細(xì)解析
- 01-11Swift 4.0中如何引用3.0的第三方庫


閱讀排行
本欄相關(guān)
- 01-11Swift利用Decodable解析JSON的一個(gè)小問題
- 01-11swift中defer幾個(gè)簡單的使用場景詳解
- 01-11Swift中初始化init的方法小結(jié)
- 01-11Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
- 01-11Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼
- 01-11Swift中定義單例的方法實(shí)例
- 01-11Swift中排序算法的簡單取舍詳解
- 01-11Swift Json實(shí)例詳細(xì)解析
- 01-11Swift如何為設(shè)置中心添加常用功能
- 01-11Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?


