麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Swift > 正文

Swift利用指紋識(shí)別或面部識(shí)別為應(yīng)用添加私密保護(hù)功能

2020-03-09 17:41:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

從最初做應(yīng)用開(kāi)始,我就密切關(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è)很不相同的交互,但從開(kāi)發(fā)的角度他們卻只需要一套代碼就可以搞定。在做之前我先解釋下整個(gè)實(shí)現(xiàn)過(guò)程的重要環(huán)節(jié):

swift,指紋識(shí)別,人臉識(shí)別,應(yīng)用

原理圖

1.我們需要一個(gè)數(shù)據(jù)來(lái)保存開(kāi)關(guān)數(shù)據(jù),在設(shè)置中心,用戶根據(jù)喜好選擇是否開(kāi)啟保護(hù)

2.一旦用戶打開(kāi)應(yīng)用,通過(guò)判斷是否保護(hù)來(lái)加載遮擋頁(yè)面

3.在遮擋頁(yè)面自動(dòng)實(shí)現(xiàn)解鎖過(guò)程,同時(shí)用戶也可以點(diǎn)擊后解鎖

4.根據(jù)機(jī)型的不同,在設(shè)置中心需要顯示不同的解鎖名稱

一、基礎(chǔ)配置工作

實(shí)現(xiàn)指紋識(shí)別與面部識(shí)別,都是通過(guò)添加LocalAuthentication Framework來(lái)實(shí)現(xiàn)的。

導(dǎo)入LocalAuthentication Framework

之后在需要用到認(rèn)證的頁(yè)面,導(dǎo)入LocalAuthentication即可:

import LocalAuthentication

二、遮蓋頁(yè)創(chuàng)建與設(shè)置中心開(kāi)關(guān)創(chuàng)建

在設(shè)置中心增加一欄開(kāi)關(guān),暫且叫做Touch ID,最后會(huì)進(jìn)行標(biāo)題文字的修復(fù)。 創(chuàng)建一個(gè)單獨(dú)的遮蓋頁(yè),只需要放置一句話及按鈕即可,按鈕將調(diào)用認(rèn)證過(guò)程,文件為L(zhǎng)ockViewContrller.swift/292074.html">swift/269454.html">swift。

swift,指紋識(shí)別,人臉識(shí)別,應(yīng)用

為了方便調(diào)用,給遮蓋頁(yè)設(shè)置了StoryBoard ID為L(zhǎng)ockController。

swift,指紋識(shí)別,人臉識(shí)別,應(yīng)用

四、設(shè)置中心實(shí)現(xiàn)數(shù)據(jù)的修改

利用CoreData將開(kāi)關(guān)的數(shù)據(jù)存儲(chǔ)在ifProtect中,0表示開(kāi),1表示關(guān)。 設(shè)置數(shù)據(jù)的過(guò)程不會(huì)像其他數(shù)據(jù)那樣直接改變,必須判斷是否為用戶本人進(jìn)行開(kāi)關(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) {   // 開(kāi)始進(jìn)入識(shí)別狀態(tài),以閉包形式返回結(jié)果。閉包的 success 是布爾值,代表識(shí)別成功與否。error 為錯(cuò)誤信息。   context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "請(qǐng)用指紋解鎖", reply: {success, error in    if success {     // 成功之后的邏輯, 通常使用多線程來(lái)實(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í),開(kāi)關(guān)數(shù)據(jù)被改變;當(dāng)不是用戶本人或認(rèn)證不成功,開(kāi)關(guān)數(shù)據(jù)不會(huì)改變。 為了保持頁(yè)面與數(shù)據(jù)統(tǒng)一,函數(shù)執(zhí)行后我們需要刷新頁(yè)面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 }

swift,指紋識(shí)別,人臉識(shí)別,應(yīng)用

五、首頁(yè)加載遮蓋頁(yè)

來(lái)到首頁(yè)HomeViewController,在viewDidLoad中加入下面代碼,來(lái)判斷每一次打開(kāi)應(yīng)用是否需要認(rèn)證解鎖。 如果不需要,首頁(yè)可以正常顯示; 如果需要,將直接跳轉(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("不需要解鎖")}

六、在遮蓋頁(yè)中實(shí)現(xiàn)認(rèn)證

遮蓋頁(yè)LockController的背景通過(guò)虛化處理,可以到達(dá)遮蓋的目的。同時(shí)擁有認(rèn)證函數(shù),當(dāng)認(rèn)證成功后頁(yè)面自動(dòng)消失返回首頁(yè)。 因?yàn)樾枰J(rèn)證過(guò)程,因此也需要三個(gè)核心步驟。

1.導(dǎo)入LocalAuthentication:

import LocalAuthentication

2.操作函數(shù):

func touchID(){ let context = LAContext() var error: NSError? if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {  // 開(kāi)始進(jìn)入識(shí)別狀態(tài),以閉包形式返回結(jié)果。閉包的 success 是布爾值,代表識(shí)別成功與否。error 為錯(cuò)誤信息。  context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "請(qǐng)用指紋解鎖", reply: {success, error in   if success {    // 成功之后的邏輯, 通常使用多線程來(lái)實(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)證過(guò)程成功后,頁(yè)面會(huì)自動(dòng)消失:self.dismiss(animated: true, completion: nil)

3.當(dāng)用戶進(jìn)入頁(yè)面時(shí)自動(dòng)調(diào)取認(rèn)證過(guò)程:

override func viewWillAppear(_ animated: Bool) {  touchID()}

4.或者通過(guò)手動(dòng)點(diǎn)擊開(kāi)始認(rèn)證:

@IBAction func AuthenAction(_ sender: Any) {  touchID()}

5.捕獲錯(cuò)誤跟設(shè)置頁(yè)面一樣。

swift,指紋識(shí)別,人臉識(shí)別,應(yīng)用

七、根據(jù)屏幕尺寸修改開(kāi)關(guān)標(biāo)題

最后,我們來(lái)修復(fù)設(shè)置中心按鈕的標(biāo)題文字。當(dāng)判斷手機(jī)為iPhone X時(shí),文字顯示為“面部識(shí)別”或“Touch ID”;當(dāng)不是iPhone X時(shí),顯示為“指紋識(shí)別”或“Touch ID”。這里我們用到了UIDevice來(lái)獲取了屏幕的高度:

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)}

以上的過(guò)程便可實(shí)現(xiàn)私密保護(hù),不過(guò)不會(huì)像系統(tǒng)解鎖那樣可以通過(guò)密碼解鎖。要實(shí)現(xiàn)密碼解鎖,還需要單獨(dú)開(kāi)發(fā)該功能。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品剧情一区二区三区 | 99爱视频 | 免费a级黄色片 | 久久思思爱 | 国产免费资源 | 黄色网址在线免费播放 | 欧美一级精品片在线看 | 欧美一a一片一级一片 | 欧美毛片 | 久久性生活免费视频 | 久久男人天堂 | 国产午夜精品一区二区三区视频 | 国产精品福利一区 | 牛牛a级毛片在线播放 | 日本黄色免费观看视频 | 欧美中文字幕一区二区 | 激情久久婷婷 | 天天碰夜夜操 | 久久精品视频网址 | 福利在线免费视频 | 综合网日日天干夜夜久久 | 国产精品一区二区羞羞答答 | 国内一区| 成人做爰s片免费看网站 | 久久精品亚洲欧美日韩精品中文字幕 | 国产午夜免费不卡精品理论片 | 久草在线免费资源站 | chinese乱子伦xxxx国语对白 | 成人情欲视频在线看免费 | 成人福利在线免费观看 | 国产一区二区不卡视频 | 欧洲成人一区二区 | 成人免费福利视频 | 国产色91 | 成人午夜激情网 | 亚洲精品久久久久久 | 日韩不卡一区二区 | 国产一区二区在线观看视频 | 日韩精品中文字幕在线观看 | 国产精品一区二区羞羞答答 | 免费看搡女人无遮挡的视频 |