keychain的作用:
keychain,相當于MAC OS中的鑰匙串,但在iOS中相對于功能非常簡單.在iOS開發中如果寫資料到手機沙盒中,但不管是Caches 還是NSUserDefaults 當應用删除時所有資料都會清除.如果你想在應用删除後還儲存一些資訊在手機裡,這時就要用過keychain了.#import //keychain 管理的類
keychain的使用一(原生):
如果使用apple自帶操作有以下四個 (增删改查)方法 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 就兩個檔案(KeychainItemWrapper.h KeychainItemWrapper.m) 蘋果開發者中心可以下載下傳
下載下傳位址:KeychainItemWrapper 封裝好的OC面向對象.但是代碼是MRC的,搞起來不友善,是以沒有仔細研究.有興趣的可以自已去研究下功能還是挺多的.
keychain的使用三(三方架構 SFHFKeychainUtils)
相對于 KeychainItemWrapper 使用起來很友善 ,而且還是ARC的
如下提供四個方法:+ (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 儲存一個密碼self.userName = @"[email protected]";
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 讀取一個密碼_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];
删除:
userName serviceName 删除一個密碼[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];
清空:
通過一個serviceName清空裡面所有資料[SFHFKeychainUtils purgeItemsForServiceName:self.serviceName error:nil];
通過keychain我們可以做到儲存一資料到手機,不管手機是否删除了該應用.或者系統更新了.我們儲存的資料都不會丢失
APP之間如何共享keychain資料
以下操作 請在真機上進行調試
之前檢視了網上相關的資料,發現并沒有完整且簡單的方法.有些就文字描述了下,有些配了圖.但方法是舊的現在也用不了.搞了半天也沒有搞定.後天自已看了蘋果的開發文檔,蘋果開發文檔寫的也比較簡單.并沒有一步一步列舉出來.結合了之前網上一些資料加入蘋果開發文檔内容,再通過自己的驗證終于成功了!
首先他建一個工程 :saveKeyChain 打開target
在keychain Groups 裡添加你要分享的另一個APP的bundle ID
格式為 XXXXX.com.kylin610.www.另一個工程名 其中 XXXXX 是的你開發者ID (不是apple ID的登陸名哦) 如:123456RVYVD
實際上當你打開keychain Sharing 裡project會多出一下檔案
打開一看如下 實作就是一個PLIST檔案 這裡儲存你你需要分享APP的bundle ID 也就是上面keychain Groups 裡面的資訊.兩個地方都可以管理,是以你有多個APP裡隻要在這裡進行設定添加就可以了.
運作工程寫入一個密碼 1234567890 到keychain裡
點選删除與清空後可清除相關内容 點選讀取來檢查是否删除成功!
如果運作出錯如下圖:
這是因為你的在keychain groups裡填寫其它的APP bundle ID格式有誤 或者 開發者ID填錯了
其它APP怎麼使用keychain裡面的資料:
首先建立一個工程 getKeyChain 為 :bundle ID為之前工程 keychain Groups 裡的添加的當然開發者ID還是同一個
在新工程使用SFHFKeychainUtils 讀取和删除 keychain 裡面資料self.userName = @"[email protected]";
self.serviceName = @"space.kylin.www";
_label.text = [SFHFKeychainUtils getPasswordForUsername:self.userName andServiceName:self.serviceName error:nil];
這裡的serviceName ,userName 要與之前儲存是一緻的
如果要删除可執行[SFHFKeychainUtils deleteItemForUsername:self.userName andServiceName:self.serviceName error:nil];
讀取結果:
最新更新代碼 相容 xcode 7打開工程