最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中指紋識(shí)別常見(jiàn)問(wèn)題匯總

 更新時(shí)間:2016年12月08日 10:29:04   作者:zzzzzdddddxxxxx  
最近在公司做了一個(gè)app要使用指紋支付的功能,在實(shí)現(xiàn)過(guò)程中遇到各種坑,今天小編抽抗給大家總結(jié)把遇到問(wèn)題匯總特此分享到腳本之家平臺(tái),需要的朋友參考下

最近公司的 app 要使用指紋支付了;總體來(lái)說(shuō)還是蠻順利的;但是中間有遇到一些坑;下面就對(duì)坑進(jìn)行匯總;

一.基本知識(shí)

點(diǎn)開(kāi)這個(gè)LocalAuthentication.framework,發(fā)現(xiàn)里面主要有這么幾個(gè)東西

LocalAuthentication.framework
- LAContext.h
- LAError.h
- LAPublicDefines.h
- LocalAuthentication.h
LocalAuthentication.h

這個(gè)沒(méi)什么可講的吧,代碼就兩行,一行導(dǎo)入LAContext.h,一行導(dǎo)入LAError.h,這個(gè)LocalAuthentication類是暴露出來(lái)方便開(kāi)發(fā)者調(diào)用的類。

LAPublicDefines.h

先從簡(jiǎn)單的開(kāi)始講吧,首先是LAPublicDefines.h,從名字上來(lái)看是公共宏定義類,里面包含了許多定義好的宏,這些宏會(huì)在LAContext.h得到使用。

//
// LAPublicDefines.h
// LocalAuthentication
//
// Copyright (c) 2014 Apple. All rights reserved.
//
#ifndef LocalAuthentication_LAPublicDefines_h
#define LocalAuthentication_LAPublicDefines_h
// Policies
#define kLAPolicyDeviceOwnerAuthenticationWithBiometrics 1
#define kLAPolicyDeviceOwnerAuthentication 2
// Options
#define kLAOptionUserFallback 1
#define kLAOptionAuthenticationReason 2
// Credential types
#define kLACredentialTypePasscode -1
#define kLACredentialTypePassphrase -2
#define kLACredentialCTKPIN -3
// Error codes
#define kLAErrorAuthenticationFailed -1
#define kLAErrorUserCancel -2
#define kLAErrorUserFallback -3
#define kLAErrorSystemCancel -4
#define kLAErrorPasscodeNotSet -5
#define kLAErrorTouchIDNotAvailable -6
#define kLAErrorTouchIDNotEnrolled -7
#define kLAErrorTouchIDLockout -8
#define kLAErrorAppCancel -9
#define kLAErrorInvalidContext -10
// Error domain
#define kLAErrorDomain "com.apple.LocalAuthentication"
#endif

LAError.h

這個(gè)類其實(shí)也不用贅述,就是一個(gè)枚舉,里面寫的是錯(cuò)誤的類型,其實(shí)就是把上面的kLAError宏寫進(jìn)這個(gè)枚舉了,具體代碼注釋寫的很清晰,大概翻譯了一下

typedef NS_ENUM(NSInteger, LAError)
{
LAErrorAuthenticationFailed, // 驗(yàn)證信息出錯(cuò),就是說(shuō)你指紋不對(duì)
LAErrorUserCancel // 用戶取消了驗(yàn)證
LAErrorUserFallback // 用戶點(diǎn)擊了手動(dòng)輸入密碼的按鈕,所以被取消了
LAErrorSystemCancel // 被系統(tǒng)取消,就是說(shuō)你現(xiàn)在進(jìn)入別的應(yīng)用了,不在剛剛那個(gè)頁(yè)面,所以沒(méi)法驗(yàn)證
LAErrorPasscodeNotSet // 用戶沒(méi)有設(shè)置TouchID
LAErrorTouchIDNotAvailable // 用戶設(shè)備不支持TouchID
LAErrorTouchIDNotEnrolled // 用戶沒(méi)有設(shè)置手指指紋
LAErrorTouchIDLockout // 用戶錯(cuò)誤次數(shù)太多,現(xiàn)在被鎖住了
LAErrorAppCancel // 在驗(yàn)證中被其他app中斷
LAErrorInvalidContext // 請(qǐng)求驗(yàn)證出錯(cuò)
} NS_ENUM_AVAILABLE(10_10, 8_0);

LAContext.h

重頭戲來(lái)了,想在自己的項(xiàng)目中使用TouchID,就要用到LAContext這個(gè)類里面的方法首先映入眼簾的是一個(gè)NS_ENUM枚舉LAPolicy。

typedef NS_ENUM(NSInteger, LAPolicy)
{
LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,
LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication
} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);

第一個(gè)枚舉LAPolicyDeviceOwnerAuthenticationWithBiometrics就是說(shuō),用的是手指指紋去驗(yàn)證的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用

第二個(gè)枚舉LAPolicyDeviceOwnerAuthentication少了WithBiometrics則是使用TouchID或者密碼驗(yàn)證,默認(rèn)是錯(cuò)誤兩次指紋或者鎖定后,彈出輸入密碼界面;NS_ENUM_AVAILABLE(10_11, 9_0)iOS 9可用

首先暴露出來(lái)的幾個(gè)方法,注意這里都是實(shí)例方法,所以需要?jiǎng)?chuàng)建一個(gè)實(shí)例對(duì)象去才能調(diào)用,使用LAContext *context = [LAContext alloc] init];創(chuàng)建一個(gè)LAContext對(duì)象。

canEvaluatePolicy:error:方法用來(lái)檢查當(dāng)前設(shè)備是否可用touchID,返回一個(gè)BOOL值

evaluatePolicy:localizedReason:reply:調(diào)用驗(yàn)證方法,注意這里的三個(gè)參數(shù):

第一個(gè)參數(shù)policy是要使用上面那個(gè)LAPolicy的枚舉
第二個(gè)參數(shù)localizedReason是NSString類型的驗(yàn)證理由
第三個(gè)參數(shù)reply則是一個(gè)回調(diào)Block,block內(nèi)有一個(gè)BOOL類型的success判斷是否成功驗(yàn)證,還有一個(gè)用于判斷錯(cuò)誤信息的NSError類型的error

invalidate方法用來(lái)廢止這個(gè)context

第一次touchID 樣式

錯(cuò)誤后 touchID 樣式

- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
- (void)invalidate;

枚舉LACredentialType,LAAccessControlOperation,這個(gè)東西和下面的幾個(gè)方法我查了很久也沒(méi)弄明白用在哪,蘋果官方文檔也看的不太懂,枚舉中只有一個(gè)LACredentialTypeApplicationPassword。

不過(guò)通過(guò)這個(gè)NS_ENUM_AVAILABLE(10_11, 9_0)還有方法后面的NS_AVAILABLE(10_11, 9_0)知道這個(gè)枚舉和這兩個(gè)方法只能在OS X 10.11和iOS 9.0以上版本使用,所以可能是比較新的東西,后面蘋果還會(huì)對(duì)他擴(kuò)充吧。

下面是方法的說(shuō)明:

// 目前額外加密就一種就是應(yīng)用密碼
// 輸入進(jìn)去將會(huì)是 UTF-8 的字符串
typedef NS_ENUM(NSInteger, LACredentialType)
{
LACredentialTypeApplicationPassword = 0,
} NS_ENUM_AVAILABLE(10_11, 9_0);
// 以下方法據(jù)我理解應(yīng)該是:可以在驗(yàn)證Touch ID之后額外加密?
// 設(shè)置解鎖額外加密憑證
- (BOOL)setCredential:(nullable NSData *)credential
type:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);
// 判斷加密憑證是否設(shè)置成功
- (BOOL)isCredentialSet:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);
// 通過(guò)Touch ID來(lái)驗(yàn)證加密憑證是否通過(guò)
- (void)evaluateAccessControl:(SecAccessControlRef)accessControl
operation:(LAAccessControlOperation)operation
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply
NS_AVAILABLE(10_11, 9_0);
typedef NS_ENUM(NSInteger, LAAccessControlOperation)
{
// 創(chuàng)建額外加密
LAAccessControlOperationCreateItem,
// 使用額外加密
LAAccessControlOperationUseItem,
// 創(chuàng)建額外加密key
LAAccessControlOperationCreateKey,
// 使用額外加密key簽名
LAAccessControlOperationUseKeySign
} NS_ENUM_AVAILABLE(10_11, 9_0);

屬性的話,這里有5個(gè)

@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(NA, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

localizedFallbackTitle可以設(shè)置驗(yàn)證TouchID時(shí)彈出Alert的輸入密碼按鈕的標(biāo)題

localizedCancelTitle可以設(shè)置驗(yàn)證TouchID時(shí)彈出Alert的取消按鈕的標(biāo)題(iOS10才有)

maxBiometryFailures 最大指紋嘗試錯(cuò)誤次數(shù)。 這個(gè)屬性我們可以看到他后面寫了NS_DEPRECATED_IOS(8_3, 9_0),說(shuō)明這個(gè)屬性在iOS 8.3被引入,在iOS 9.0被廢棄,所以如果系統(tǒng)版本高于9.0是無(wú)法使用的。

evalueatedPolicyDomainState這個(gè)跟可以檢測(cè)你的指紋數(shù)據(jù)庫(kù)的變化,增加或者刪除指紋這個(gè)屬性會(huì)做出相應(yīng)的反應(yīng)

touchIDAuthenticationAllowableReuseDuration這個(gè)屬性應(yīng)該是類似于支付寶的指紋開(kāi)啟應(yīng)用,如果你打開(kāi)他解鎖之后,按Home鍵返回桌面,再次進(jìn)入支付寶是不需要錄入指紋的。因?yàn)檫@個(gè)屬性可以設(shè)置一個(gè)時(shí)間間隔,在時(shí)間間隔內(nèi)是不需要再次錄入。默認(rèn)是0秒,最長(zhǎng)可以設(shè)置5分鐘。

二.常見(jiàn)問(wèn)題

1. 指紋識(shí)別的版本問(wèn)題

iOS 9 之前是沒(méi)有LAErrorTouchIDLockout鎖定這個(gè)選項(xiàng)的,默認(rèn)錯(cuò)誤5次后;第6次驗(yàn)證是自動(dòng)彈出輸入密碼界面;

iOS 9 之后鎖定指紋識(shí)別之后,如果需要立即彈出輸入密碼界面需要使用LAPolicyDeviceOwnerAuthentication這個(gè)屬性重新發(fā)起驗(yàn)證

如果輸入了鎖屏密碼,指紋解密鎖定會(huì)默認(rèn)解除

iOS 8 錯(cuò)誤5次鎖定后,第6次驗(yàn)證需要密碼

支付寶微信對(duì)于鎖定的不同處理

2. 指紋識(shí)別的LAPolicy

第一個(gè)枚舉LAPolicyDeviceOwnerAuthenticationWithBiometrics就是說(shuō),用的是手指指紋去驗(yàn)證的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用

第二個(gè)枚舉LAPolicyDeviceOwnerAuthentication少了WithBiometrics則是使用TouchID或者密碼驗(yàn)證,默認(rèn)是錯(cuò)誤兩次指紋或者鎖定后,彈出輸入密碼界面;NS_ENUM_AVAILABLE(10_11, 9_0)

iOS 9可用

3. 指紋識(shí)別LAContext的方法

canEvaluatePolicy:error:方法用來(lái)檢查當(dāng)前設(shè)備是否可用touchID,返回一個(gè)BOOL值;不會(huì)彈驗(yàn)證指紋密碼框

evaluatePolicy:localizedReason:reply:調(diào)用驗(yàn)證方法,會(huì)彈驗(yàn)證指紋密碼框

4. feedback按鈕顯示

默認(rèn)第一次識(shí)別只有取消按鈕

錯(cuò)誤一次之后,會(huì)顯示 feedBack 按鈕

如果不想顯示 feedback 按鈕;可以設(shè)置 feedBackTitle = @""

設(shè)置 feedbackTitle 為@""

設(shè)置 feedbackTitle 為@"驗(yàn)證登錄密碼"

5. CancelTitle按鈕顯示

該屬性, iOS 10 才可以進(jìn)行設(shè)置,iOS 以前是不可以進(jìn)行設(shè)置的

6. 指紋識(shí)別慢的問(wèn)題

我的 iphone 7 Plus指紋識(shí)別啟動(dòng)過(guò)程需要2s 左右的時(shí)間;如果發(fā)現(xiàn)啟動(dòng)比較慢,這個(gè)是正?,F(xiàn)象

支付寶和微信為了消除用戶的緊張情緒,在開(kāi)啟指紋識(shí)別的時(shí)候都有放 HUD

指紋識(shí)別完成后,需要返回主線程進(jìn)行相應(yīng)的 操作;否者你會(huì)發(fā)現(xiàn)有時(shí)候識(shí)別完4-5秒才有反應(yīng)

微信支付 HUD顯示案例

demo的 HUD顯示案例

[SVProgressHUD show];
LAContext *context = [[LAContext alloc]init];//使用 new 不會(huì)給一些屬性初始化賦值
context.localizedFallbackTitle = @"";//這樣可以不讓 feedBack 按鈕顯示
//LAPolicyDeviceOwnerAuthenticationWithBiometrics
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請(qǐng)驗(yàn)證已有指紋" reply:^(BOOL success, NSError * _Nullable error) {
[SVProgressHUD dismiss];
//SVProgressHUD dismiss 需要 0.15才會(huì)消失;所以dismiss 后進(jìn)行下一步操作;但是0.3是適當(dāng)延長(zhǎng)時(shí)間;留點(diǎn)余量
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (success)
{
NSLog(@"指紋識(shí)別成功");
// 指紋識(shí)別成功,回主線程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//成功操作
});
}
if (error) {
//指紋識(shí)別失敗,回主線程更新UI
NSLog(@"指紋識(shí)別成功");
dispatch_async(dispatch_get_main_queue(), ^{
//失敗操作
});
}
});
}];

7.彈窗顯示級(jí)別問(wèn)題

指紋識(shí)別的彈窗的級(jí)別非常之高,高到離譜,經(jīng)過(guò)驗(yàn)證應(yīng)用程序內(nèi)部沒(méi)有比指紋識(shí)別的window的級(jí)別更高的UIWindowLevel,也就說(shuō)了他是系統(tǒng)級(jí)的彈窗。需要注意的是,如果指紋彈窗顯示和消失應(yīng)用程序會(huì)調(diào)用:

- (void)applicationWillResignActive:(UIApplication *)application;
- (void)applicationDidBecomeActive:(UIApplication *)application;

所以應(yīng)用程序內(nèi)部無(wú)法獲取。不知道越獄之后的手機(jī)能否獲取到,如果能獲取到,那就不可描述了,所以推薦各位看官?zèng)]什么剛需不要越獄。

8.檢測(cè)指紋庫(kù)中指紋是否發(fā)生改變

蘋果官方文檔解釋如下

This property returns a value only when the canEvaluatePolicy(:error:) method succeeds for a biometric policy or the evaluatePolicy(:localizedReason:reply:) method is called and a successful Touch ID authentication is performed. Otherwise, nil is returned.
The returned data is an opaque structure. It can be used to compare with other values returned by this property to determine whether the database of authorized fingerprints has been updated. However, the nature of the change cannot be determined from this data.

總結(jié)來(lái)說(shuō):

當(dāng)你增加或者刪除指紋時(shí)候,你在使用使用canEvaluatePolicy(_:error:)或者evaluatePolicy(_:localizedReason:reply:)方法驗(yàn)證;成功后evaluatedPolicyDomainState屬性會(huì)返回一個(gè) NSData 對(duì)象;否則返回 nil;
但是返回的evaluatedPolicyDomainState屬性并不能說(shuō)明發(fā)生了什么樣子的改變;只是告訴你發(fā)生了改變

根據(jù)上面的信息,我們就可以每次使用指紋的時(shí)候檢測(cè)指紋數(shù)據(jù)庫(kù)是否發(fā)生改變并作出相應(yīng)的操作;下面是stackOverFlow 做的一個(gè)相應(yīng)示例

demo

TouchIDDemo

以上所述是小編給大家介紹的iOS中指紋識(shí)別常見(jiàn)問(wèn)題匯總,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • IOS 中KVC的使用方法實(shí)例詳解

    IOS 中KVC的使用方法實(shí)例詳解

    這篇文章主要介紹了IOS 中KVC的使用方法實(shí)例詳解的相關(guān)資料,這提供具體使用方法,希望能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • iOS10 推送最新特性研究

    iOS10 推送最新特性研究

    這篇文章主要為大家詳細(xì)研究了iOS10 推送的最新特性,推送內(nèi)容更加豐富,感興趣的小伙伴們可以參考一下
    2016-09-09
  • IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法

    IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法

    這篇文章主要介紹了IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法的相關(guān)資料,這里主要介紹了IOS 10如何通過(guò)設(shè)置來(lái)實(shí)現(xiàn)禁止縮放及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • iOS鍵盤自適應(yīng)彈出效果

    iOS鍵盤自適應(yīng)彈出效果

    這篇文章主要為大家詳細(xì)介紹了iOS鍵盤自適應(yīng)彈出效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • iOS自帶動(dòng)畫效果的實(shí)例代碼

    iOS自帶動(dòng)畫效果的實(shí)例代碼

    本文給大家分享ios自帶動(dòng)畫效果的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2016-12-12
  • IOS代碼筆記之左右滑動(dòng)效果

    IOS代碼筆記之左右滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了IOS代碼筆記之左右滑動(dòng)效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 實(shí)例講解設(shè)計(jì)模式中的命令模式在iOS App開(kāi)發(fā)中的運(yùn)用

    實(shí)例講解設(shè)計(jì)模式中的命令模式在iOS App開(kāi)發(fā)中的運(yùn)用

    這篇文章主要介紹了設(shè)計(jì)模式中的命令模式在iOS App開(kāi)發(fā)中的運(yùn)用,文中還講到了Cocoa框架下使用的例子,實(shí)例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-03-03
  • iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼

    iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼

    這篇文章主要介紹了iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • IOS多線程編程N(yùn)SThread的使用方法

    IOS多線程編程N(yùn)SThread的使用方法

    這篇文章主要介紹了IOS多線程編程N(yùn)SThread的使用方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解使用多線程的方法,需要的朋友可以參考下
    2017-10-10
  • iOS中tableView cell分割線的一些設(shè)置技巧

    iOS中tableView cell分割線的一些設(shè)置技巧

    在項(xiàng)目開(kāi)發(fā)中我們會(huì)常常遇到tableView 的cell分割線顯示不全,左邊會(huì)空出一截像素,更有甚者想改變系統(tǒng)的分割線,下面通過(guò)這篇文章來(lái)一起學(xué)習(xí)學(xué)習(xí)在iOS中tableView cell分割線的一些設(shè)置技巧,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05

最新評(píng)論

且末县| 马公市| 尼玛县| 宜州市| 霍城县| 紫金县| 旅游| 自贡市| 自贡市| 巢湖市| 绥化市| 二手房| 都匀市| 上饶市| 灵武市| 东平县| 申扎县| 忻州市| 南召县| SHOW| 舒兰市| 罗山县| 新宁县| 桑日县| 崇文区| 乌拉特前旗| 顺昌县| 巨野县| 阿巴嘎旗| 孟津县| 邢台县| 河曲县| 靖西县| 玉环县| 河北区| 鲁山县| 阿合奇县| 天津市| 安岳县| 丹阳市| 武威市|