2012-07-15 180 views
7

在我的應用程序中,我希望能夠同步由用戶創建的配置。我想使用iCloud同步該配置,以便在所有設備上始終保持相同。但是,我使用鑰匙串來存儲密碼。iCloud同步鑰匙扣

有沒有辦法同步鑰匙串數據?

回答

3

不,鑰匙串同步不是iCloud的一部分。它是點mac同步的一部分,但不再可用。

可能會有關於這是否是個好主意的反饋(自動將密碼從一臺設備移到另一臺設備),特別是在多人共享一個iCloud帳戶的情況下(可能,但現在不能保證)。

如果您覺得將密碼存儲在設備的鑰匙串中(並且因此要求用戶每個設備至少輸入一次),那麼您將需要提供自己的加密和安全性,並將數據直接存儲在iCloud中,如在密鑰庫中。

16

iCloud Keychain是iOS 7.0.3和OS X Mavericks 10.9中的一項新功能。使用SecItem API添加鑰匙串項目時,請指定kSecAttrSynchronizable屬性。

+0

#jrc你能幫我在keychain中設置kSecAttrSynchronizable屬性嗎? – iKT 2015-06-24 09:53:54

2

這些是我爲鑰匙串製作的實用方法。 kSecAttrSynchronizable是使iCloud Sync工作的原因。希望他們幫助。

  • 鑰匙串查詢。
  • 刪除項目
  • 刪除項目
  • 保存項目
  • 將項目

    + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { 
        return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
          (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, 
          service, (__bridge id)kSecAttrService, 
          service, (__bridge id)kSecAttrAccount, 
          service, (__bridge id)kSecAttrSynchronizable, 
          (__bridge id)kSecAttrAccessibleAfterFirstUnlock, (__bridge id)kSecAttrAccessible, 
          nil]; 
    } 
    
    + (void)save:(NSString *)service data:(id)data { 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
        [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
        SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL); 
    } 
    
    + (void)remove:(NSString *)service { 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    } 
    
    +(NSString *)keychainItem:(NSString *)service{ 
        id data = [self load:service]; 
    
        if([data isKindOfClass:[NSString class]]){ 
         return data; 
        } 
        return @""; 
    } 
    
    + (id)load:(NSString *)service { 
        id ret = nil; 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
        [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
        CFDataRef keyData = NULL; 
        if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
         @try { 
          ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
         } 
         @catch (NSException *e) { 
          NSLog(@"Unarchive of %@ failed: %@", service, e); 
         } 
         @finally {} 
        } 
        if (keyData) CFRelease(keyData); 
        return ret; 
    } 
    
+0

+1爲完整答案,提供全部代碼需要歸檔數據。 (id)數據對象當然必須符合協議。 – loretoparisi 2015-10-14 08:59:22