SSKeychain:帐户没有存储在iCloud中?

我正在使用sskeychain( https://github.com/soffes/sskeychain )将我的帐户和密码存储在IOS钥匙串中。 我假设,如果我存储一个帐户,它应该在我的其他设备上可用。 但它并没有出现在那里。

我用这段代码读了我的账号:

NSArray *arr=[SSKeychain accountsForService:@"Login"]; for (NSString *s in arr) { NSLog(@"Account: %@",s); } 

得到这个(只显示一个条目,其他条目相似):

 Account: { acct = "friXXXXXter@XXXX.com"; agrp = "3B4384Z34A.de.gondomir.LocalButler"; cdat = "2014-05-09 22:55:08 +0000"; mdat = "2014-05-09 22:55:08 +0000"; pdmn = ak; svce = Login; sync = 0; tomb = 0; } 

但这并没有出现在其他设备上。 两种设备都有IOS 7.1.1。 我用这一行存储密码:

  [SSKeychain setPassword:self.passwortField.text forService:@"Login" account:self.userField.text]; 

我已经在Xcode中打开了钥匙串共享,并在那里列出了一个钥匙串组“de.gondomir.LocalButler”。

我错过了什么吗? 服务名称必须特别一些吗?

谢谢!

如果这仍然与您相关,我设法找到了解决方案。 (适用于> = iOS7)

不要使用SSKeychain的静态方法来编写凭据。 而是使用SSKeychainQuery并将synchronizationMode设置为SSKeychainQuerySynchronizationModeYes如下所示

 NSError *error; [SSKeychain setAccessibilityType:self.keychainAccessibilityType]; SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; query.service = service; query.account = account; query.password = password; query.synchronizationMode = SSKeychainQuerySynchronizationModeYes; [query save:&error]; if (error) { NSLog(@"Error writing credentials %@", [error description]); } 

SSKeychain上的静态便捷方法使用默认同步模式SSKeychainQuerySynchronizationModeAny导致凭据不与iCloud钥匙串同步。

此外,请确保您的设备已通过iCloud启用了Keychain(设置> iCloud> Keychain)。 您可能还希望在目标function中启用Keychain Sharing

在我有一个新项目后,我尝试了MarkHim的答案,它有效。 我现在使用swift,所以这是我的工作代码:

  let account = defaults.objectForKey("Sync_toPhoneNumber") as? String SSKeychain.setAccessibilityType(kSecAttrAccessibleAfterFirstUnlock) var error:NSError? let lookupQuery = SSKeychainQuery() lookupQuery.synchronizationMode = .Yes lookupQuery.service = "DasDing" lookupQuery.account = account let password = SSKeychain.passwordForService("DasDing", account: account, error: &error) if error == nil { commandKey = password! } else { print("Error für \(account): \(error!.localizedDescription)") commandKey = "" } // query all accounts for later use let allQuery = SSKeychainQuery() allQuery.service = "DasDing" do { let dict = try allQuery.fetchAll() print("Accounts:") for acc in dict { print(acc["acct"]!) } } catch let error as NSError { print("keine Accounts") print("Error: \(error.localizedDescription)") } 

这是为了阅读,写作时你必须先删除帐户(如果你想更改密码):

  let account = defaults.objectForKey("Sync_toPhoneNumber") as? String SSKeychain.setAccessibilityType(kSecAttrAccessibleAfterFirstUnlock) SSKeychain.deletePasswordForService("DasDing", account: account) let newQuery = SSKeychainQuery() newQuery.service = "DasDing" newQuery.account = account newQuery.password = str?.uppercaseString newQuery.synchronizationMode = .Yes try! newQuery.save()