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
- 那是UIWebView播放器的一个MPMoviePlayerController实例,以及如何获得对该实例的引用?
- popup详细视图后自动取消select表视图单元格?
- 倒计时NSTimer在一个UIAlertController的标题中获得一个空值,而不是几秒钟的时间
- 我可以做NSVariableFromString像NSClassFromString和NSSelectorFromString?
- iBook页面翻转过渡
- 滚动到底部时将行添加到UITableView
- 在input时调整包含UITextView的UITableViewCell
- 有关标签和行高度dynamicresize的问题(iOS)
- 循环缓冲录音iOS:可能吗?