keychain的作用:
keychain,相當(dāng)于MAC OS中的鑰匙串,但在iOS中相對于功能非常簡單.在iOS開發(fā)中如果寫數(shù)據(jù)到手機(jī)沙盒中,但不管是Caches 還是NSUserDefaults 當(dāng)應(yīng)用刪除時(shí)所有數(shù)據(jù)都會清除.如果你想在應(yīng)用刪除后還保存一些信息在手機(jī)里,這時(shí)就要用過keychain了.
#import<Security/Security.h> //keychain 管理的類
keychain的使用一(原生):
如果使用apple自帶操作有以下四個(gè) (增刪改查)方法 C語言的
OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result);?
KeyChain中的ItemOSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);
KeyChain中的ItemOSStatus SecItemDelete(CFDictionaryRef query)
keychain的使用二(三方框架 KeychainItemWrapper):
KeychainItemWrapper? 就兩個(gè)文件(KeychainItemWrapper.h? KeychainItemWrapper.m) 蘋果開發(fā)者中心可以下載
?下載地址:KeychainItemWrapper?封裝好的OC面向?qū)ο?但是代碼是MRC的,搞起來不方便,所以沒有仔細(xì)研究.有興趣的可以自已去研究下功能還是挺多的.
keychain的使用三(三方框架 SFHFKeychainUtils)
下載地址:?SFHFKeychainUtils
相對于 KeychainItemWrapper 使用起來很方便 ,而且還是ARC的
如下提供四個(gè)方法:
+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
+ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error;
+ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
+ (BOOL) purgeItemsForServiceName:(NSString *) serviceName error: (NSError **) error;
保存:?
通過.userName serviceName 保存一個(gè)密碼
self.userName = @"test@qq.com";
self.userPassword = @"1234567890";
self.serviceName = @"space.kylin.www";
NSError *error;
BOOL saved = [SFHFKeychainUtils storeUsername:self.userName andPassword:self.userPassword
forServiceName:self.serviceName updateExisting:YES error:&error];
讀取:
通過.userName serviceName 讀取一個(gè)密碼
_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];
刪除:
userName serviceName 刪除一個(gè)密碼
[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];
清空:?
通過一個(gè)serviceName清空里面所有數(shù)據(jù)
[SFHFKeychainUtils purgeItemsForServiceName:self.serviceName error:nil];
通過keychain我們可以做到保存一數(shù)據(jù)到手機(jī),不管手機(jī)是否刪除了該應(yīng)用.或者系統(tǒng)更新了.我們保存的數(shù)據(jù)都不會丟失
APP之間如何共享keychain數(shù)據(jù)
以下操作 ? 請?jiān)谡鏅C(jī)上進(jìn)行調(diào)試
之前查看了網(wǎng)上相關(guān)的資料,發(fā)現(xiàn)并沒有完整且簡單的方法.有些就文字描述了下,有些配了圖.但方法是舊的現(xiàn)在也用不了.搞了半天也沒有搞定.后天自已看了蘋果的開發(fā)文檔,蘋果開發(fā)文檔寫的也比較簡單.并沒有一步一步列舉出來.結(jié)合了之前網(wǎng)上一些資料加入蘋果開發(fā)文檔內(nèi)容,再通過自己的驗(yàn)證終于成功了!
首先他建一個(gè)工程 :saveKeyChain 打開target?
在keychain Groups 里添加你要分享的另一個(gè)APP的bundle ID?
格式為 XXXXX.com.kylin610.www.另一個(gè)工程名? 其中 XXXXX 是的你開發(fā)者ID (不是apple ID的登陸名哦) 如:123456RVYVD
實(shí)際上當(dāng)你打開keychain Sharing 里project會多出一下文件
打開一看如下 實(shí)現(xiàn)就是一個(gè)PLIST文件 這里保存你你需要分享APP的bundle ID 也就是上面keychain Groups 里面的信息.兩個(gè)地方都可以管理,所以你有多個(gè)APP里只要在這里進(jìn)行設(shè)置添加就可以了.
運(yùn)行工程寫入一個(gè)密碼 1234567890 到keychain里
點(diǎn)擊刪除與清空后可清除相關(guān)內(nèi)容 ?點(diǎn)擊讀取來檢查是否刪除成功!
如果運(yùn)行出錯(cuò)如下圖:
這是因?yàn)槟愕脑趉eychain groups里填寫其它的APP bundle ID格式有誤 ?或者 開發(fā)者ID填錯(cuò)了
其它APP怎么使用keychain里面的數(shù)據(jù):
首先創(chuàng)建一個(gè)工程 getKeyChain 為 :bundle ID為之前工程 keychain Groups 里的添加的當(dāng)然開發(fā)者ID還是同一個(gè)
在新工程使用SFHFKeychainUtils 讀取和刪除 keychain 里面數(shù)據(jù)
self.userName = @"test@qq.com";
self.serviceName = @"space.kylin.www";
_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];
這里的serviceName ,userName 要與之前保存是一致的
如果要刪除可執(zhí)行
[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];
讀取結(jié)果:
新浪微博 @火柴大男人
代碼下載地址:?keychain??
最新更新代碼 兼容 xcode 7打開工程?