[[[關于keychain這個東西的概念可以到這裡學習:
https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/index.html, 簡言之就是每個應用程式都有一個可以用于安全儲存一些如密碼、認證等資訊的keychain,通過對應用簽名時的一些設定,還可以利用keychain的方式實作同一開發者簽證(就是相同bundle seed)下的不同應用之間共享資訊的操作。比如你有一個開發者帳戶,并開發了兩個不同的應用A和B,然後通過對A和B的keychain access group這個東西指定共用的通路分組,就可以實作共享此keychain中的内容。而且,對比NSUserDefaults的一點不同之處就是此資訊不會随應用的删除而消失!
關于Keychain的應用,Apple提供了一個叫GenericKeychain的例子程式,在這裡:http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_h.html#//apple_ref/doc/uid/DTS40007797-Classes_KeychainItemWrapper_h-DontLinkElementID_9,其中封裝了一個簡化Keychain操作的類:KeychainItemWrapper,可以拿來直接使用,記得加入Security.framework!
]]]
參考代碼如下:
KeychainItemWrapper *wrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"password"accessGroup:nil];
// 設定資料
NSString *uuid = [[NSUUID UUID] UUIDString];
[wrapper setObject:uuid forKey:kSecAttrAccount];
// 讀取資料
NSString *uuid2 = [wrapperobjectForKey:kSecAttrAccount];
[wrapper release];
關于keychain access groups的設定,傳統方法是在Xcode項目target的Build Settings的Code Signing段中加入Code Signing Entitlements的配置檔案,加入group資訊,詳細操作如下。
1)首先,打開keychain sharing配置。
2)在build setting裡可以看到,配置檔案的索引。
3)這是配置檔案:
Keychain Access Groups是一個在不同應用見公用鑰匙串的标志。
$(AppIdentifierPrefix)是每個開發賬号的id,在member center裡可以看到。
com.icomwell:這個icomwell一般是公司名稱。
.icomwell:第二個icomwell一般是參數名稱。
不同的應用,配置相同的Groups後,就可以公用儲存的資料。
現在再看下這個示例代碼:
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"password" accessGroup:nil];
password是這個groups下的一個辨別符。一個辨別符下可以有多個參數。以字典形式儲存。
比如
// 設定資料
NSString *uuid = [[NSUUID UUID] UUIDString];
[wrapper setObject:uuid forKey:kSecAttrAccount];
[wrapper setObject:@"test" forKey:kSecAttrLabel];
這就設定了兩個key的value。每個key根據根據配置的class來,比如這個kSecClassGenericPassword包括這麼多key
// 讀取資料
NSString *uuid2 = [wrapper objectForKey:kSecAttrAccount];
[wrapper release];
當遇到奔潰時,可以查到錯誤碼:比如add時遇到–25299,這個一般是key和對應的class不比對造成的,其他的可以檢視文檔。
matching時遇到–25300,這個是查詢不到參數。
[[[經過測試有以下經驗同大家分享:
1.相同bundle下生成的程式都可以共享相同group的keyChain.
相同bundle解釋下就是:比如:2個程式分别使用的provision對應bundle是com.jv.key1和com.jv.key2,那你配置檔案肯定是{Identifer}.com.jv.{name},其中identifer是蘋果生成的随機串号,可以在申請證書時看到,複制過來即可,name可以自己取,程式中指定屬于哪個Group即可。
2.如果你在 addkey時,沒有指定group,則會預設添加你keychain-access-groups裡第一個group,如果你沒有設定Entitlements,則預設使用對應的程式的bundle name,比如com.jv.key1,表示隻能給自己程式使用。
3.如果你程式添加的group并不存在你的配置檔案中,程式會奔潰,表示無法添加。是以你隻能添加你配置檔案中支援的keychain。]]]
關于keychain,這篇文章寫的不錯,大家可以參考:http://blog.csdn.net/jerryvon/article/details/16843065