iOS開發(fā)關(guān)于指紋登錄和記住密碼

? ? 在涉及記住app狀態(tài)中,比如是否是第一次使用app;很多初學(xué)者選擇使用NSUserDefaults

NSUserDefaults使用方法也很簡單;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

存值

[defaults?setObject:@"123"?forKey:@"phoneNum"];

defaults setObject:@"111" forKey:@"password"];

[defaults?synchronize];

取值

NSString *phoneNum = [defaults objectForKey:@"phoneNum"];

NSString *passwordStr = [defaults objectForKey:@"password"];

? ? ?但是,使用NSUserDefaults 其實是一個 plist 文件,并不安全;只適合存儲少量并不重要的數(shù)據(jù);在用戶名和密碼存儲在客戶端上,我們可以選擇放到系統(tǒng)的KeyChain里面比較安全;

使用KeyChain鑰匙串存儲密碼

從github下載github.com/baptistefetet/KeychainItemWrapper,導(dǎo)入KeychainItemWrapper.h,KeychainItemWrapper.m文件,進行編譯,導(dǎo)入Security.framework庫;

保存

KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];

[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];

[keyWrapper setObject:@"123" forKey:(id)kSecAttrAccount];// 上面兩行用來標識一個Item

[keyWrapper setObject:@"111" forKey:(id)kSecValueData];

讀取

KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];

NSString *name =[keyWrapper? objectForKey:(id)kSecAttrAccount];

NSString *password=[keyWrapper objectForKey:(id)kSecValueData];

清空數(shù)據(jù)保存

[wrapper?resetKeychainItem];

? ? ?當然,Keychain也不是絕對安全的,而且即使用戶卸載了應(yīng)用,下次再重裝的時候,還是會能讀取到之前保存的密碼。

指紋識別登錄

? 指紋識別其實是調(diào)用手機系統(tǒng)里面的指紋,官方集成了調(diào)用方法,使用也非常簡單;具體實現(xiàn)如下;

1、導(dǎo)入系統(tǒng)頭文件LocalAuthentication/LocalAuthentication.h

2、判斷是否支持touchID;

? ? ?- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)

error__attribute__((swift_error(none)));

3、調(diào)用方法,實現(xiàn)指紋登錄

LAContext *context = [LAContext new]; //這個屬性是設(shè)置指紋輸入失敗之后的彈出框的選項

context.localizedFallbackTitle = @"再試一次";

NSError *error = nil;

if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics

error:&error])?{

NSLog(@"支持指紋識別");

[context?evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics

localizedReason:@"按Home鍵進行指紋登錄"reply:^(BOOLsuccess, NSError * _Nullable error) {

if(success)?{

NSLog(@"驗證成功?刷新主界面");

//這里寫登錄成功的方法,在這里可以調(diào)用keychin ,來獲取密碼等數(shù)據(jù)

KeychainItemWrapper *keyWrapper=[[KeychainItemWrapper alloc] initWithIdentifier:@"Keychain" accessGroup:nil];

NSString? *passwordStr=[keyWrapper objectForKey:(id)kSecValueData];//獲取指紋保存的密碼

.................//具體實現(xiàn)登錄的代碼

}else{

NSLog(@"%@",error.localizedDescription);

switch(error.code)?{

caseLAErrorSystemCancel:

{

NSLog(@"系統(tǒng)取消授權(quán),如其他APP切入");

break;

}

caseLAErrorUserCancel:

{

NSLog(@"取消驗證Touch?ID");

break;

}

caseLAErrorAuthenticationFailed:

{

NSLog(@"授權(quán)失敗");

break;

}

caseLAErrorPasscodeNotSet:

{

NSLog(@"系統(tǒng)未設(shè)置密碼");

break;

}

caseLAErrorTouchIDNotAvailable:

{

NSLog(@"設(shè)備Touch?ID不可用,例如未打開");

break;

}

caseLAErrorTouchIDNotEnrolled:

{

NSLog(@"設(shè)備Touch?ID不可用,用戶未錄入");

break;

}

caseLAErrorUserFallback:

{

[[NSOperationQueue?mainQueue]?addOperationWithBlock:^{

NSLog(@"用戶選擇輸入密碼,切換主線程處理");

}];

break;

}

default:

{

[[NSOperationQueue?mainQueue]?addOperationWithBlock:^{

NSLog(@"其他情況,切換主線程處理");

}];

break;

}

}

}

}];

}else{

NSLog(@"不支持指紋識別");

switch(error.code)?{

caseLAErrorTouchIDNotEnrolled:

{

NSLog(@"TouchID?is?not?enrolled");

break;

}

caseLAErrorPasscodeNotSet:

{

NSLog(@"A?passcode?has?not?been?set");

break;

}

default:

{

NSLog(@"TouchID?not?available");

break;

}

}

NSLog(@"%@",error.localizedDescription);

}

? ?好了,keychain的使用和指紋登錄基本就實現(xiàn)了,方法寫得很簡陋,請大家見諒!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容