一、在應用間利用KeyChain共享資料
我們可以把KeyChain了解為一個Dictionary,所有資料都以key-value的形式存儲,可以對這個Dictionary進行add、update、get、delete這四個操作。對于每一個應用來說,KeyChain都有兩個通路區,私有區和公共區。私有區是一個sandbox,本程式存儲的任何資料都對其他程式不可見。而要想在将存儲的内容放在公共區,需要先聲明公共區的名稱,官方文檔管這個名稱叫“keychain access group”,聲明的方法是建立一個plist檔案,名字随便起,内容如下:
“yourAppID.com.yourCompany.whatever”就是你要起的公共區名稱,除了whatever字段可以随便定之外,其他的都必須如實填寫。這個檔案的路徑要配置在 Project->build setting->Code Signing Entitlements裡,否則公共區無效,配置好後,須用你正式的證書簽名編譯才可通過,否則xcode會彈框告訴你code signing有問題。是以,蘋果限制了你隻能同公司的産品共享KeyChain資料,别的公司通路不了你公司産品的KeyChain。
二、儲存私密資訊
iOS的keychain服務提供了一種安全的儲存私密資訊(密碼,序列号,證書等)的方式,每個ios程式都有一個獨立的keychain存儲。相對于NSUserDefaults、檔案儲存等一般方式,keychain儲存更為安全,而且keychain裡儲存的資訊不會因App被删除而丢失,是以在重裝App後,keychain裡的資料還能使用。 在應用裡使用使用keyChain,我們需要導入Security.framework ,keychain的操作接口聲明在頭檔案SecItem.h裡。直接使用SecItem.h裡方法操作keychain,需要寫的代碼較為複雜,為減輕咱們程式員的開發,我們可以使用一些已經封裝好了的工具類,下面我會簡單介紹下我用過的兩個工具類:KeychainItemWrapper和SFHFKeychainUtils。
(一)KeychainItemWrapper
下載下傳位址: http://download.csdn.net/detail/u011439689/6877641
KeychainItemWrapper是apple官方例子“GenericKeychain”裡一個通路keychain常用操作的封裝類,在官網上下載下傳了GenericKeychain項目後,隻需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們項目,并導入Security.framework 。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程式會崩潰!
(二)SFHFKeychainUtils 提供了在 iOS keychain中安全的存儲密碼的工具 下載下傳位址: http://download.csdn.net/detail/u011439689/6877655 1、引入Security.frameWork架構。 2、引入頭檔案:SFHKeychainUtils.h. 3、存密碼: [SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa"forServiceName:SERVICE_NAME updateExisting:1 error:nil]; [SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil]; 4、取密碼: NSString *passWord = [SFHFKeychainUtils getPasswordForUsername:@"dd"andServiceName:SERVICE_NAME error:nil];