iOS開發————資料本地化儲存方式之Keychain
阿新 • • 發佈:2019-01-25
iOS的keychain服務提供了一種安全的儲存私密資訊(密碼,序列號,證書等)的方式,每個ios程式都有一個獨立的keychain儲存。相對於NSUserDefaults、檔案儲存等一般方式,keychain儲存更為安全,而且keychain裡儲存的資訊不會因App被刪除而丟失,所以在重灌App後,keychain裡的資料還能使用。從ios 3。0開始,跨程式分享keychain變得可行。
如何需要在應用裡使用使用keyChain,我們需要匯入Security.framework ,keychain的操作介面宣告在標頭檔案SecItem.h裡。直接使用SecItem.h裡方法操作keychain,需要寫的程式碼較為複雜,為減輕咱們程式設計師的開發,我們可以使用一些已經封裝好了的工具類,下面我會簡單介紹下我用過的兩個工具類:KeychainItemWrapper和SFHFKeychainUtils。
KeychainItemWrapper (下載)
KeychainItemWrapper是apple官方例子“GenericKeychain”裡一個訪問keychain常用操作的封裝類,在官網上下載了GenericKeychain專案後,只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們專案,並匯入Security.framework 。KeychainItemWrapper的用法:
如何需要在應用裡使用使用keyChain,我們需要匯入Security.framework ,keychain的操作介面宣告在標頭檔案SecItem.h裡。直接使用SecItem.h裡方法操作keychain,需要寫的程式碼較為複雜,為減輕咱們程式設計師的開發,我們可以使用一些已經封裝好了的工具類,下面我會簡單介紹下我用過的兩個工具類:KeychainItemWrapper和SFHFKeychainUtils。
KeychainItemWrapper (下載)
KeychainItemWrapper是apple官方例子“GenericKeychain”裡一個訪問keychain常用操作的封裝類,在官網上下載了GenericKeychain專案後,只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們專案,並匯入Security.framework 。KeychainItemWrapper的用法:
[html] view plaincopy /** 初始化一個儲存使用者帳號的KeychainItemWrapper */ KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"]; //儲存帳號 [wrapper setObject:@"<帳號>" forKey:(id)kSecAttrAccount]; //儲存密碼 [wrapper setObject:@"<帳號密碼>" forKey:(id)kSecValueData]; //從keychain裡取出帳號密碼 NSString *password = [wrapper objectForKey:(id)kSecValueData]; //清空設定 [wrapper resetKeychainItem]; 其中方法“- (void)setObject:(id)inObject forKey:(id)key;”裡引數“forKey”的值應該是Security.framework 裡標頭檔案“SecItem.h”裡定義好的key,用其他字串做key程式會崩潰!
另外使用方法轉載:http://blog.csdn.net/jerryvon/article/details/16843065
SFHFKeychainUtils(下載)
SFHFKeychainUtils是另一個封裝了KeyChain簡單操作的第三方類庫,使用上比KeychainItemWrapper要簡單點,SFHFKeychainUtils只提供了獲取、儲存和刪除三個方法:
[html] view plaincopy #import <UIKit/UIKit.h> @interface SFHFKeychainUtils : NSObject { } /** 從Keychain裡獲取使用者密碼 *param username 使用者名稱 *param serviceName 服務名 *return NSString 使用者名稱對應的密碼 */ + (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error; /** *把使用者的密碼儲存到Keychain裡 *@param username 使用者名稱 *@param password 要儲存的密碼 *@param serviceName 本條keychains所屬的服務(組) *return BOOL 是否儲存成功 */ + (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error; /** * 刪除某個使用者資訊 *param username 使用者名稱 *param serviceName 使用者所屬的服務(組) *return BOOL 是否刪除成功 */ + (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error; @end
使用方法: [html] view plaincopy #define ServiceName @"com.mycompany.yourAppServiceName" NSError *error; NSString *userName = @"<使用者名稱>"; NSString *password = @"<使用者密碼>"; /** 儲存使用者的密碼*/ BOOL saved = [SFHFKeychainUtils storeUsername:userName andPassword:password forServiceName:ServiceName updateExisting:YES error:&error ]; if (!saved) { NSLog(@"儲存密碼時出錯:%@", error); } error = nil; NSString *thePassword = [SFHFKeychainUtils getPasswordForUsername:userName andServiceName:ServiceName error:&error]; if(error){ NSLog(@"從Keychain裡獲取密碼出錯:%@", error); }