你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> IOS開發中的KeyChain訪問

IOS開發中的KeyChain訪問

編輯:關於IOS

現在正在接觸蘋果IOS開發的項目,使用到如何通過KeyChain實現相同簽名下發布的應用之間的數據共享功能。現分享下心得。

項目是在XCODE6.2開發環境進行的。

IOS中訪問KeyChain有兩種方法,且這兩種方法不能混用,不然會出現無法共享的問題。不過獲取的方法可以通用,以下先給出Keychain訪問的函數原型。

KeyChain.h

[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. + (void)save:(NSString *)service data:(id)data;
  2. + (id)load:(NSString *)service;
  3. + (void)delete:(NSString *)service;

KeyChain.m

[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. //私有方法,搜索KeyChain數據集。
[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  2.     return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  3.             (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass,
  4.             service, (__bridge id)kSecAttrService,
  5.             service, (__bridge id)kSecAttrAccount,
  6.             (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible,
  7.             nil nil];
  8. }
[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. // 保存KeyChain數據,data裡傳遞的<span >NSMutableDictionary類型的對象,對象裡的 KEY為你需要共享數據的子KEY。</span>
  2. + (void)save:(NSString *)service data:(id)data {
  3.     //Get search dictionary
  4.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  5.     //Delete old item before add new item
  6.     SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  7.     //Add new object to search dictionary(Attention:the data format)
  8.     [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];
  9.     //Add item to keychain with the search dictionary
  10.     SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL);
  11. }
[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. //加載KeyChain數據,返回的是一個NSMutableDictionary類型的對象,通過NSMutableDictionary中objectForKey的方法,傳遞子KEY來獲取對應共享的數據。
  2. + (id)load:(NSString *)service {
  3.     id ret = nil;
  4.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  5.     //Configure the search setting
  6.     //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
  7.     [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
  8.     [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
  9.     CFDataRef keyData = NULL;
  10.     if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  11.         @try {
  12.             ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  13.         } @catch (NSException *e) {
  14.             NSLog(@"Unarchive of %@ failed: %@", service, e);
  15.         } @finally {
  16.         }
  17.     }
  18.     if (keyData)
  19.         CFRelease(keyData);
  20.     return ret;
  21. }
[objc] view plaincopyprint?IOS開發中的KeyChain訪問派生到我的代碼片

  1. //刪除KeyChain數據,這裡的service傳入的是主Key,所以刪除的是所有的數據。
  2. + (void)delete:(NSString *)service {
  3.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  4.     SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  5. }

下面來說如果配置KeyChain。第一種方法:通過plist方式進行

1、創建一個新文件,選擇Property list文件。

2、創建一個新的子節點,取名為keychain-access-groups

3、修改節點keychain-access-groups的類型為Array

4、在keychain-access-groups節點下添加子節點,填入你的主KEY名稱

第二種方式:直接通過XCODE特性來配置(非常簡單)

1、選擇工程配置中的capabilities頁面

2、打開KeyChain Sharing開關,設置你的主KEY的名稱。

注:以上兩種不能混用,應用會優先使用第一種方法來處理KeyChain共享。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved