Ios SSKeychain:帐户未存储在iCloud中?

Ios SSKeychain:帐户未存储在iCloud中?,ios,macos,icloud,sskeychain,Ios,Macos,Icloud,Sskeychain,我正在使用sskeychain()在IOS密钥链中存储我的帐户和密码。我假设,如果我存储了一个帐户,它应该可以在我的其他设备上使用。但是它没有出现在那里 我使用以下代码读取我的帐户: NSArray *arr=[SSKeychain accountsForService:@"Login"]; for (NSString *s in arr) { NSLog(@"Account: %@",s); } 并获取此信息(仅显示一个条目,其他条目类似): 但这不会出现在其他设备上。这两款设备都有

我正在使用sskeychain()在IOS密钥链中存储我的帐户和密码。我假设,如果我存储了一个帐户,它应该可以在我的其他设备上使用。但是它没有出现在那里

我使用以下代码读取我的帐户:

NSArray *arr=[SSKeychain accountsForService:@"Login"];
for (NSString *s in arr) {
    NSLog(@"Account: %@",s);
}
并获取此信息(仅显示一个条目,其他条目类似):

但这不会出现在其他设备上。这两款设备都有IOS 7.1.1。 我使用以下行存储密码:

  [SSKeychain setPassword:self.passwortField.text forService:@"Login" account:self.userField.text];
我在Xcode中打开了钥匙链共享,并在那里列出了一个钥匙链组“de.gondomir.LocalButler”

我错过什么了吗?服务必须有特殊的名称吗


谢谢

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

不要使用SSKeychain的静态方法来编写凭据。而是使用
SSKeychainQuery
并将同步模式设置为
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的钥匙链(设置>iCloud>钥匙链)。您可能还希望在您的目标功能中启用钥匙链共享。

在我有了一个新项目后,我尝试了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)

    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()