์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- BFS
- Lv2
- designpattern
- Kuring
- SwiftUI
- rxcocoa
- visionOS
- Swfit
- XCTest
- MVVM
- TCA
- RxSwift
- swift
- SnapKit
- ๋ฐฑ์ค
- Flutter
- tableView
- Xcode
- raywenderlich
- ํ๋ก๊ทธ๋๋จธ์ค
- CollectionView
- UIKit
- node.js
- arkit
- realm
- ios
- combine
- ํจ์คํธ์บ ํผ์ค
- BOJ
- reactorkit
- Today
- Total
lgvv98
[iOS14] Touch ID ์ฌ์ฉ๋ฒ ๋ณธ๋ฌธ
[iOS14] Touch ID ์ฌ์ฉ๋ฒ
๐ฅ ์บ๋ฟ๋งจ 2021. 4. 24. 02:12ํฐ์น ์์ด๋๋ iOS๊ฐ ์ ๊ณตํ๋ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์์ด๋ ํจ์ค์๋ ์ ๋ ฅ์ ํตํด ์ฒ๋ฆฌ๋๋ ๋ก์ปฌ ์ธ์ฆ์ ์ง๋ฌธ ์ธ์๋ง์ผ๋ก ๋์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ง ๊ธฐ๋ฅ
iOS7๋ถํฐ ์ผ๋ถ ์์ฒด์ฑ์ ํตํด ๊ธฐ๋ฅ์ ๊ณต๊ฐํ๊ธฐ ์์ํ์ฌ, ํนํ ์ฑ์คํ ์ด๋ ์์ดํด๋ผ์ฐ๋ ๋ฑ์์๋ ์ต์ด 1ํ๋ง ์์ด๋/ํจ์ค์๋๋ก ๋ก๊ทธ์ธ ํ๊ณ ๋๋ฉด ์ดํ ๋ถํฐ๋ ํฐ์น ์์ด๋๋ฅผ ํตํด ์ธ์ฆํ ์ ์๊ฒ ๋์๋ค.
iOS8๋ถํฐ๋ ์ผ๋ฐ ์ฑ์์๋ ํฐ์น ์์ด๋ API๋ฅผ ์ด์ฉํ ๋ก์ปฌ ์ธ์ฆ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
ํฐ์น ์์ด๋์ API๋ LocalAuthentication์ด๋ผ๋ ํ๋ ์์ํฌ๋ฅผ ํตํด ์ ๊ณต๋๋ค.
์ด ํ๋ ์์ํฌ๋ ์ฐ๋ฆฌ๊ฐ ์ง๋ฌธ ์ธ์์์ ํํ ๋ณด๊ฒ ๋๋, ์์ดํฐ ๋ฒํผ์ ์๊ฐ๋ฝ ๋๊ณ ์ค์บํ๊ธฐ์ ๋ํ ๊ธฐ๋ณธ ํ๋ฉด์ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ ์ง๋ฌธ ์ธ์์ด ์คํจํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ์ฐฝ๊ณผ ๊ฐ์ ๋ณ๋์ ์ธ์ฆ ๊ธฐ๋ฅ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
๋ํ ์ธ์ฆ์ด ํ์ํ ์ด์ ๋ฅผ ๋ฉ์์ง๋ก ์ถ๋ ฅํ ์ ์๊ฒ๋ ํด์ค๋ค.
ํฐ์น ์์ด๋๋ฅผ ํตํ ์ธ์ฆ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ ์๊ฐ๋ณด๋ค ๋ง๊ธฐ ๋๋ฌธ์ LocalAuthentication ํ๋ ์์ํฌ๋ ํฐ์น ์์ด๋์ ์ค๋ฅ ํ์ ์ LAError.Code ์ด๊ฑฐํ์ผ๋ก ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฐ ๊ฒฝ์ฐ์ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋๋ก ์ง์
LAError.Code์ ๊ตฌ์กฐ
enum LAError.Code : Int {
case authenticationFailed
case userCancel
case userFallback
case systemCancel
case passcodeNotSet
case touchIDNotAvailable
case touchIDNotEnrolled
... ์ดํ ์๋ต ...
}
์ฃผ์ ํญ๋ชฉ์ ์๋ฏธ๋ฅผ ๊ฐ๋จํ ์์๋ณด์๋ฉด
case authenticationFailed : ์ฌ์ฉ์๊ฐ ๋ฑ๋ก๋์ง ์์ ์ง๋ฌธ์ ์ฌ์ฉํ๋ ๋ฑ, ์ฌ๋ฐ๋ฅธ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์์ ๋ ๋ฐ์ํ๋ค
case userCancel : ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ์ทจ์ํ์ ๋ ๋ฐ์ํ๋ค
case userFallback : ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ ์๊ฒฉ ์ฆ๋ช
๋ฐฉ์์ผ๋ก ๋์๊ฐ๊ณ ์ ํ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค
case systemCancel : ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ์ฑํ๋์ด ์์คํ
์ด ๊ฐ์ ๋ก ์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ์ ๋ ๋ฐ์ํ๋ค
case passcodeNotSet : ์ค๋งํธํฐ ๊ธฐ๊ธฐ์์ ์ฌ์ฉ์๊ฐ ์ํธ๋ฅผ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
case touchIDNotAvailable : ์ค๋งํธํฐ ๊ธฐ๊ธฐ๊ฐ ํฐ์น ์์ด๋๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
case touchIDNotEnrolled : ํฐ์น ์์ด๋๊ฐ ์ง์๋์ง๋ง ๋ฑ๋ก๋ ์ง๋ฌธ์ด ์์ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค. ๋ค๋ง, ์ด ๊ฐ์ iOS11๋ถํฐ๋ biometryNotEnrolled๋ก ๋์ฒด๋๋ค.
import LocalAuthentication // ๋ก์ปฌ์ธ์ฆ ํ๋ ์์ํฌ ๋ฐ์
let context = LAContext() // ์ธ์ฆ ์ปจํ
์คํธ๋ฅผ ์ ์. ์ธ์ฆ์ ๊ดํ ์ข
ํฉ ์ ๋ณด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์
// ์ค๋ฅ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ๋ณ์์ ํฐ์น ์์ด๋ ์ธ์ฆ์ฐฝ์ ๋ค์ด๊ฐ ๋ฉ์์ง ์ ์
var error: NSError? // ์ค๋ฅ๊ฐ ์์ ์๋ ์์ด์ ์ต์
๋ ํ์
์ด์ด์ผ ํ๋ค.
let msg = "๋ก๊ทธ์ธ์ ์ํด ์ธ์ฆ์ด ํ์ํฉ๋๋ค"
/* ๋ค์์ผ๋ก ํ ์ผ์ canEvaluatePolicy ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ, ํฐ์น ์์ด๋ ์ธ์ฆ์ ์ฌ์ฉํ ์ ์๋์ง ํ๋ ์์ํฌ์
๋ฌธ์ํ๋ ๊ฒ
ํ๋ผ๋ฏธํฐ 1 : LAPolicy ๋ผ๋ ์ด๊ฑฐํ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ค์ค ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์กฑ๋๋์ง ์ฒดํฌ
- ํด๋น๊ธฐ๊ธฐ๊ฐ ํฐ์น ์์ด๋ ์ธ์ฆ์ ์ง์ํ๋๊ฐ?
- ํด๋น ๊ธฐ๊ธฐ ์ค์ ์์ ํฐ์น ์์ด๋๊ฐ ํ์ฉ๋์ด ์๋๊ฐ?
- ํจ์ค ์ฝ๋๊ฐ ์ค์ ๋์ด ์๋๊ฐ?
- ์ต์ํ ํ๋ ์ด์์ ์ง๋ฌธ์ด ๋ฑ๋ก๋์ด ์๋๊ฐ?
์ด์ค ํ๋๋ผ๋ ๋ง์กฑ๋ชปํ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
์ด ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ2๋ก ์ค๋ฅ ์ฝ๋๊ฐ ์ ๋ฌ๋๋ฏ๋ก ์ด๋ฅผ ๋ถ์ํ์ฌ ์ค๋ฅ์ ์์ธ์ ํ์ธํ๊ณ ๊ทธ์ ๋ง๋ ์ฒ๋ฆฌ.
๋ง์ฝ true๋ฅผ ๋ฐํํ๋ฉด ์ด๋ค ์ธ์ฆ ์ ์ฑ
์ ๋ชจ๋ ์ ์ฉํ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก evaluatePolicy ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋ค.
evaluatePolicy ๋ฉ์๋๋ ์ธ์๊ฐ 3๊ฐ๊ฐ ์ฌ์ฉ๋๋ค.
ํ๋ผ๋ฏธํฐ 1 : ๋ฐฉ๊ธ ์ ์ ์ฌ์ฉํ๋ ์ธ์ฆ ์ ์ฑ
์กฐ๊ฑด
ํ๋ผ๋ฏธํฐ 2 : ์ธ์ฆ์ฐฝ์ ํ์๋ ์ธ์ฆ ์ฌ์ ๋ฉ์์ง
ํ๋ผ๋ฏธํฐ 3 : ์๋ฃ ์ฒ๋ฆฌ ํด๋ก์ ๋ก ์ฑ๊ณต ์ฌ๋ถ์ ๋ํ Bool ํ์
์ ์ธ์๊ฐ๊ณผ ์ค๋ฅ ์์ธ์ด ๊ธฐ๋ก๋
NSError ํ์
์ ์ธ์๊ฐ์ด ํจ๊ป ์ ๋ฌ๋๋ค.
์ค์ง์ ์ผ๋ก ์ธ์ฆ ํ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ชจ๋ ์๋ฃ ํด๋ก์ ๋ด๋ถ์ ๊ตฌํ๋๋ค.
์คํจํ ๊ฒฝ์ฐ์์ ์ฃผ์๊น๊ฒ ๋ด์ผํ๋๋ฐ _code ์์ฑ์ ๊ฐ์ด ์ ์ํ์ด๋ผ๋ ๊ฒ์ธ๋ฐ
enum์ผ๋ก ์ ์๋์ด ์์ด์ rawValue๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์๋ก ๊ฐ์ ๋ณํํ ํ์ ๋น๊ตํด์ผ ํ๋ค.
๋ํ UI๋ณ๊ฒฝ์ด ํ์ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ์๋ OperationQueue.main ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ ์
์๋๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ๋ ์์ง ๋ง์.
ํน์ ์ด์ ์ ์ฌํ DispatchQueue.main ๋ธ๋ก์ ์ฌ์ฉํด๋ ๋๋ค.
if context.canEvaluatePolicy() ์กฐ๊ฑด์ ํต๊ณผํ์ง ๋ชปํ ์ค๋ฅ๋ค์
else ๋ธ๋ก์ ํตํด ์ฒ๋ฆฌํด ์ฃผ์ด์ผ ํ๋ค.
ํฐ์น ์์ด๋๋ฅผ ์ง์ํ์ง ์๋ ๊ธฐ๊ธฐ๊ฑฐ๋ ์ง์ํ๋๋ผ๋ ์ง๋ฌธ์ด ๋ฑ๋ก๋์ด ์์ง ์๊ฑฐ๋ ๋ฑ๋ฑ
์ด๋์๋ ์ค๋ฅ๊ฐ ๋ฌด์์ด๋ ๊ฐ์ ์ฌ์ฉ์๊ฐ ์์ด๋์ ํจ์ค์๋๋ฅผ ์
๋ ฅํ ์ ์๋๋ก ํ๋ฉด์ ์ ํํด ์ฃผ๋๊ฒ์ด ์ ์ ํ๋ค.
*/
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error){
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason : msg ,
reply: {(success, e) in
if success {
// ์ฑ๊ณต์ ๋ํ ์ฒ๋ฆฌ
} else {
// ์คํจ์ ๋ํ ์ฒ๋ฆฌ
print(e!.localizedDescription)
switch (e!._code) {
case LAError.systemCancel.rawValue :
print("์์คํ
์๋ฌ")
... ๋ค๋ฅธ ์ผ์ด์ค๋ ์๋ต ...
}
})
}
... ์ฃผ์์ ๊ผญ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค ํฐ์น ์์ด๋์ ๊ฐ๋ ์ด ์๊ฐ๋ณด๋ค ์ฒด๊ณ์ ์ด๊ณ ์ดํดํ๊ธฐ๊ฐ ์ฝ๋ค.!!!
ํฌ๊ฒ ๋ณด๋ฉด ํฐ์น ์์ด๋ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ ํญ๋ชฉ์ ๋๊ฐ๋ก ๋๋ ์ ์๋๋ฐ
ํ๋๋ ์ธ์ฆ์ฐฝ์ด ์์ ์คํ๋์ง ๋ชปํ๋ ์ํ์ ๊ด๋ จ๋ ์ค๋ฅ
๋ค๋ฅธ ํ๋๋ ์ธ์ฆ์ฐฝ์ ์คํ๋์์ง๋ง ๊ทธ ๊ณผ์ ์์ ๋ค์ํ ์ํฉ์ผ๋ก ์ธํด ์ธ์ฆ์ด ์คํจํ ๊ฒฝ์ฐ
์ ์์ ๊ฒฝ์ฐ๋ ์ค๋ฅ ๋ด์ฉ์ ์๊ด์์ด ์ธ์ฆ์ ๋์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋์์ฃผ๋ ๊ฒ์ด ์ ์ ํ ๋ฐ๋ฉด
ํ์์ ๊ฒฝ์ฐ์๋ ์ผ์ด์ค๋ณ๋ก ๋ฐ์ ธ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ๊ฐ๋ฅผ ๊ณ ๋ฏผํด์ผ ํ๋ค.
** ํค์ฒด์ธ & ๋ก์ปฌ์ธ์ฆ
iOS์์๋ ๋ก์ปฌ ์ธ์ฆ๋ง์ผ๋ก ์ด ์ ์๋ ํค ์ฒด์ธ ์ ์ฅ ์์ฑ์ ์ ๊ณต.
์ด๋ฅผ ์ด์ฉํ๋ฉด ์ ์ฝ๋๋ฅผ ๊ตฌํํ์ง ์๊ณ ๋ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฝ์ด์ค๊ธฐ ์ํด ์๋์ผ๋ก ๋ก์ปฌ ์ธ์ฆ์ ์ฌ์ฉํ ์ ์์.
์์์ ๋ก์ปฌ ์ธ์ฆ์ด ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์์ด๋ผ๋ฉด, ํค ์ฒด์ธ ์ฐ๋ ๋ก์ปฌ ์ธ์ฆ์ ํค ์ฒด์ธ๋ง์ ์ํด ์ต์ ํ๋ ํํ์ ๋ก์ปฌ ์ธ์ฆ์ด๋ผ๊ณ ํ ์ ์์,
ํค ์ฒด์ธ ์ฐ๋ ๋ก์ปฌ ์ธ์ฆ์ ํค ์ฒด์ธ์ ๊ฐ์ ์ ์ฅ ์ ๋ก์ปฌ ์ธ์ฆ ์์ฑ์ ์ค์ ํ๋ ๊ฒ์์ ์์
์ฐ์ ์ ํฐ์น ์์ด๋๋ง ํ๊ณ ํฐ์น ์์ด๋๋ฅผ ์์ฑํ ํ์ ํ์ด์ค ์์ด๋๋ ์ ๋ณตํด๋ณด๋๋ก ํ์~!
'โ ๏ธ deprecated โ ๏ธ > ๊ผผ๊ผผํ ์ฌ์์จ(์ค์ )' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ ํฐ ๊ฐฑ์ ๊ณผ OAuth 2.0 ์ธ์ฆ (0) | 2021.04.24 |
---|---|
[iOS14] ํค ์ฒด์ธ(key Chain) (0) | 2021.04.23 |
[iOS14] Unwind ์ธ๊ทธ์จ์ด๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด ์ด๋ํ๊ธฐ (0) | 2021.04.23 |
Alamofire ๋ผ์ด๋ธ๋ฌ๋ฆฌ ( + CocoaPods ๊ฐ๋ ) ์ค์น ๋ฐ ์ฌ์ฉ๋ฒ (0) | 2021.04.23 |
[iOS14] ATS์ ๊ด๋ จํ์ฌ (0) | 2021.04.23 |