iOS 開發(fā)keychain 使用與多個APP之間共享keychain數(shù)據(jù)的使用


keychain的作用:


keychain,相當(dāng)于MAC OS中的鑰匙串,但在iOS中相對于功能非常簡單.在iOS開發(fā)中如果寫數(shù)據(jù)到手機沙盒中,但不管是Caches 還是NSUserDefaults 當(dāng)應(yīng)用刪除時所有數(shù)據(jù)都會清除.如果你想在應(yīng)用刪除后還保存一些信息在手機里,這時就要用過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) 蘋果開發(fā)者中心可以下載

?下載地址:KeychainItemWrapper?封裝好的OC面向?qū)ο?但是代碼是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清空里面所有數(shù)據(jù)

[SFHFKeychainUtils purgeItemsForServiceName:self.serviceName error:nil];

通過keychain我們可以做到保存一數(shù)據(jù)到手機,不管手機是否刪除了該應(yīng)用.或者系統(tǒng)更新了.我們保存的數(shù)據(jù)都不會丟失



APP之間如何共享keychain數(shù)據(jù)


以下操作 ? 請在真機上進行調(diào)試


之前查看了網(wǎng)上相關(guān)的資料,發(fā)現(xiàn)并沒有完整且簡單的方法.有些就文字描述了下,有些配了圖.但方法是舊的現(xiàn)在也用不了.搞了半天也沒有搞定.后天自已看了蘋果的開發(fā)文檔,蘋果開發(fā)文檔寫的也比較簡單.并沒有一步一步列舉出來.結(jié)合了之前網(wǎng)上一些資料加入蘋果開發(fā)文檔內(nèi)容,再通過自己的驗證終于成功了!

首先他建一個工程 :saveKeyChain 打開target?

在keychain Groups 里添加你要分享的另一個APP的bundle ID?

格式為 XXXXX.com.kylin610.www.另一個工程名? 其中 XXXXX 是的你開發(fā)者ID (不是apple ID的登陸名哦) 如:123456RVYVD

實際上當(dāng)你打開keychain Sharing 里project會多出一下文件


打開一看如下 實現(xiàn)就是一個PLIST文件 這里保存你你需要分享APP的bundle ID 也就是上面keychain Groups 里面的信息.兩個地方都可以管理,所以你有多個APP里只要在這里進行設(shè)置添加就可以了.


運行工程寫入一個密碼 1234567890 到keychain里


點擊刪除與清空后可清除相關(guān)內(nèi)容 ?點擊讀取來檢查是否刪除成功!

如果運行出錯如下圖:


這是因為你的在keychain groups里填寫其它的APP bundle ID格式有誤 ?或者 開發(fā)者ID填錯了


其它APP怎么使用keychain里面的數(shù)據(jù):


首先創(chuàng)建一個工程 getKeyChain 為 :bundle ID為之前工程 keychain Groups 里的添加的當(dāng)然開發(fā)者ID還是同一個


在新工程使用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打開工程?








最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容