? ? 在涉及記住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)了,方法寫得很簡陋,請大家見諒!