iOS指紋登錄

1. 需求說明:我的頁面顯示一個(gè)指紋登錄的開關(guān)女蜈,當(dāng)用戶設(shè)置指紋登錄開關(guān)開啟的之后滔悉,用戶下次登錄在登錄頁面可以使用指紋進(jìn)行登錄型凳,當(dāng)開關(guān)關(guān)閉,則用戶登錄只能使用用戶名流酬,密碼進(jìn)行登錄币厕。使用指紋登錄時(shí)需要進(jìn)行校驗(yàn),當(dāng)指紋不匹配芽腾,未開啟指紋或設(shè)備不支持指紋登錄旦装,或者多次校驗(yàn)失敗時(shí),需要輸入解鎖密碼進(jìn)行解鎖摊滔。

2.實(shí)現(xiàn)代碼 我的—>設(shè)置界面

// 設(shè)置是指紋登錄開關(guān)顯示并關(guān)聯(lián)指紋登錄方法

(1)cellForRow的方法中:

```

let fingerCell:FingerPrintTableViewCell?? = tableview.dequeueReusableCell(withIdentifier: fingerPrintIdentifier) as? FingerPrintTableViewCell

// 更新指紋登錄開關(guān)狀態(tài)

if let isOn = UserDefaults.standard.object(forKey: kUseTouchID) as? Bool {

fingerCell?.chooseSwitch.isOn = isOn

} else {

fingerCell?.chooseSwitch.isOn = false

}

//changeTouchID為

fingerCell?.chooseSwitch.addTarget(self, action: #selector(changeTouchID(_:)), for: .valueChanged)

fingerCell?.selectionStyle = .none

return fingerCell!

```

(2)在changeTouchID中指根據(jù)開關(guān)狀態(tài)分別調(diào)用指紋開啟于關(guān)閉的方法

@objc fileprivate func changeTouchID(_ sw: UISwitch) {

if sw.isOn {

// 打開操作

debugPrint("打開操作")

self.switchIsOn(sw: sw)

}

else

{

// 關(guān)閉操作

debugPrint("關(guān)閉操作")

self.switchIsOff(sw: sw)

}

}

(3)開啟指紋方法

//驗(yàn)證指

func switchIsOn(sw: UISwitch)

{

let context = LAContext()

var message = ""

context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "通過Home鍵驗(yàn)證已有的手機(jī)指紋", reply: { (success, authenticationError) in

if success == true {

// 校驗(yàn)成功

message = "打開成功"

UserDefaults.standard.set(true, forKey: kUseTouchID)

UserDefaults.standard.synchronize()

DispatchQueue.main.async {

sw.isOn = true

}

} else {

// 校驗(yàn)失敗

/// 取消:Canceled by user.

/// 未開啟或設(shè)備不支持:No fingers are enrolled with Touch ID.

// 多次校驗(yàn)失敗? ? desc String? "Biometry is locked out." some

let desc = authenticationError?.localizedDescription

if desc?.contains("Canceled") == true {

message = ""

}else if desc?.contains("retry limit exceeded")? == true {

// 提示校驗(yàn)失敗

message = "指紋不匹配"

}else if desc?.contains("Biometry is") == true {

// 多次校驗(yàn)失敗阴绢,彈出用戶輸入密碼解鎖

context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "請(qǐng)輸入解鎖密碼", reply: { (success, error) in

if success == true {

// 密碼校驗(yàn)成功

debugPrint("密碼校驗(yàn)成功")

self.switchIsOn(sw: sw)

} else {

// 密碼校驗(yàn)失敗

debugPrint("密碼校驗(yàn)失敗")

}

})

}else {

message = "您未開啟指紋功能"

}

DispatchQueue.main.async {

sw.isOn = false

}

}

if message.characters.count > 0 {

DispatchQueue.main.async {

SVProgressHUD.showInfo(withStatus: message)

SVProgressHUD.dismiss(withDelay: 1)

}

}

debugPrint(message)

})

}

(4)關(guān)閉指紋方法

func switchIsOff(sw: UISwitch)

{

let context = LAContext()

var message = ""

context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "通過Home鍵驗(yàn)證已有的手機(jī)指紋", reply: { (success, authenticationError) in

if success == true {

// 校驗(yàn)成功

message = "關(guān)閉成功"

UserDefaults.standard.set(false, forKey: kUseTouchID)

UserDefaults.standard.synchronize()

DispatchQueue.main.async {

sw.isOn = false

}

} else {

// 校驗(yàn)失敗

/// 取消:Canceled by user.

/// 未開啟或設(shè)備不支持:No fingers are enrolled with Touch ID.

// 多次校驗(yàn)失敗? ? desc String? "Biometry is locked out." some

let desc = authenticationError?.localizedDescription

if desc?.contains("Canceled") == true {

message = ""

}else if desc?.contains("retry limit exceeded")? == true {

// 提示校驗(yàn)失敗

message = "指紋不匹配"

}else if desc?.contains("Biometry is") == true {

// 多次校驗(yàn)失敗店乐,彈出用戶輸入密碼解鎖

context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "請(qǐng)輸入解鎖密碼", reply: { (success, error) in

if success == true {

// 密碼校驗(yàn)成功

debugPrint("密碼校驗(yàn)成功")

self.switchIsOff(sw: sw)

} else {

// 密碼校驗(yàn)失敗

debugPrint("密碼校驗(yàn)失敗")

}

})

}else {

message = "指紋關(guān)閉失敗"

}

DispatchQueue.main.async {

sw.isOn = true

}

}

if message.characters.count > 0 {

DispatchQueue.main.async {

SVProgressHUD.showInfo(withStatus: message)

SVProgressHUD.dismiss(withDelay: 1)

}

}

debugPrint(message)

})

}

到此我的界面指紋開啟與關(guān)閉可以自由切換 ,下面根據(jù)“我的”界面的設(shè)置完成登錄界面是否展示使用指紋登錄

(1)在viewWillAppear通過指紋UserDefaults取出指紋開關(guān)狀態(tài)呻袭,從而設(shè)置開啟指紋登錄按鈕是否顯示

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

if let isTouchID = UserDefaults.standard.object(forKey: kUseTouchID) as? Bool {

if isTouchID == true {

// 開啟指紋

self.startFinger()

self.fingerBtn.isHidden = false

} else {

self.fingerBtn.isHidden = true

}

} else {

self.fingerBtn.isHidden = true

}

}

(2)登錄界面開啟指紋登錄方法(原理與“我的界面相同”)

func startFinger()

{

var message = ""

let context = LAContext()

context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "通過Home鍵驗(yàn)證已有的手機(jī)指紋", reply: { [weak self] (success, authenticationError) in

if success == true {

// 校驗(yàn)成功

self?.autoLogin()

} else {

// 提示

// 校驗(yàn)失敗

/// 取消:Canceled by user.

/// 未開啟或設(shè)備不支持:No fingers are enrolled with Touch ID.

// 三次校驗(yàn)失斦0恕:Application retry limit exceeded

// 多次校驗(yàn)失敗:"Biometry is locked out."

// Biometry is not available in passcode lockout

let desc = authenticationError?.localizedDescription

if desc?.contains("Canceled") == true {

message = ""

} else if desc?.contains("Biometry is") == true {

// 多次校驗(yàn)失敗左电,彈出用戶輸入密碼解鎖

context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "請(qǐng)輸入解鎖密碼", reply: { (success, error) in

if success == true {

// 密碼校驗(yàn)成功

debugPrint("密碼校驗(yàn)成功")

self?.startFinger()

} else {

// 密碼校驗(yàn)失敗

debugPrint("密碼校驗(yàn)失敗")

}

})

} else if desc?.contains("retry limit exceeded")? == true {

// 提示校驗(yàn)失敗

message = "指紋不匹配"

}

}

if message.characters.count > 0 {

DispatchQueue.main.async {

SVProgressHUD.showInfo(withStatus: message)

SVProgressHUD.dismiss(withDelay: 1)

}

}

})

}


注意:在我的界面從本地取出開關(guān)狀態(tài)的時(shí)候swift與oc 有個(gè)明顯的區(qū)別廉侧,let isOn = UserDefaults.standard.object(forKey: kUseTouchID) as? Bool ? ? ? swift在轉(zhuǎn)換類型前得到的是一個(gè) AnyObject此時(shí)我們理所當(dāng)然轉(zhuǎn)換為bool類型從而進(jìn)行判斷,而oc返回值已為bool類型券腔,但是我們?nèi)詰?yīng)用boolvalue進(jìn)行轉(zhuǎn)化,因?yàn)閛c中未加boolvalue前 我們得到的bool值是通過NSUserDefaults通過key在本地的取值拘泞,如果有值纷纫,則返回yes,如果無值陪腌,則返回no,這不是開關(guān)真實(shí)的狀態(tài)辱魁,所以一定要加boolvalue進(jìn)行強(qiáng)轉(zhuǎn)!

let lineView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: ScreenWidth, height: lineViewHeight))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗鸭,一起剝皮案震驚了整個(gè)濱河市染簇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌强岸,老刑警劉巖锻弓,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝌箍,居然都是意外死亡青灼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門妓盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杂拨,“玉大人,你說我怎么就攤上這事悯衬〉粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵筋粗,是天一觀的道長策橘。 經(jīng)常有香客問我,道長娜亿,這世上最難降的妖魔是什么役纹? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮暇唾,結(jié)果婚禮上促脉,老公的妹妹穿的比我還像新娘辰斋。我一直安慰自己,他們只是感情好瘸味,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布宫仗。 她就那樣靜靜地躺著,像睡著了一般旁仿。 火紅的嫁衣襯著肌膚如雪藕夫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天枯冈,我揣著相機(jī)與錄音毅贮,去河邊找鬼。 笑死尘奏,一個(gè)胖子當(dāng)著我的面吹牛滩褥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炫加,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼瑰煎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了俗孝?” 一聲冷哼從身側(cè)響起酒甸,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赋铝,沒想到半個(gè)月后插勤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡革骨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年饮六,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逗余,靈堂內(nèi)的尸體忽然破棺而出府蛇,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響嚎货,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔫浆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一殖属、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓦盛,春花似錦洗显、人聲如沸外潜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽处窥。三九已至,卻和暖如春玄组,著一層夾襖步出監(jiān)牢的瞬間滔驾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工俄讹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哆致,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓患膛,卻偏偏與公主長得像摊阀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剩瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • ios8以后驹溃,蘋果開放指紋城丧,指紋可以用在支付延曙,或者登錄是使用 引入頭文件 #import <LocalAuthe...
    驛路梨花處處開閱讀 1,733評(píng)論 1 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)亡哄,斷路器枝缔,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 在分布式環(huán)境中蚊惯,如何支持PC愿卸、APP(ios、android)等多端的會(huì)話共享截型,這也是所有公司都需要的解決方案趴荸,用...
    安琪拉_4b7e閱讀 1,712評(píng)論 2 7
  • 兩個(gè)目標(biāo): A、推銷品牌&產(chǎn)品&自己宦焦。 “您好发钝,先生(小姐),這幾款是根據(jù)我們眾多的市場(chǎng)調(diào)研設(shè)計(jì)出來的原創(chuàng)新品波闹,我...
    大海啊閱讀 497評(píng)論 0 0