iCloud同步钥匙串

在我的应用程序中,我希望能够同步由用户创build的configuration。 我想使用iCloud来同步该configuration,以便在所有设备上始终保持一致。 但是,我使用钥匙串来存储密码。

有没有办法同步钥匙串数据?

不,钥匙串同步不是iCloud的一部分。 这是点mac同步的一部分,但不再可用。

可能会有反馈意见,这是否是一个好主意(自动将密码从一台设备移动到另一台设备),特别是在多人共享一个iCloud帐户的情况下(可能,但现在不能保证)。

如果您觉得将密码存储在设备的钥匙串中(因此要求用户每个设备至lessinput一次),则需要提供自己的encryption和安全性,并将数据直接存储在iCloud中,例如密钥库。

iCloud Keychain是iOS 7.0.3和OS X Mavericks 10.9中的一项新function。 使用SecItem API添加钥匙串项目时指定kSecAttrSynchronizable属性。

这些是我为钥匙串所做的实用方法。 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; } 

想要做同样的事情,还没有尝试过,但这看起来很有帮助: https : //github.com/iosengineer/BMCredentials