iOS 開發keychain 使用與多個APP之間共享keychain數據的使用


keychain的作用:


keychain,相當于MAC OS中的鑰匙串,但在iOS中相對于功能非常簡單.在iOS開發中如果寫數據到手機沙盒中,但不管是Caches 還是NSUserDefaults 當應用刪除時所有數據都會清除.如果你想在應用刪除后還保存一些信息在手機里,這時就要用過keychain了.

#import<Security/Security.h> //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)

下載地址:?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 = @"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 讀取一個密碼

_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 = @"test@qq.com";

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];

讀取結果:



新浪微博 @火柴大男人

代碼下載地址:?keychain??

最新更新代碼 兼容 xcode 7打開工程?








最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容