【问题标题】:SSKeychain: Accounts not stored in iCloud?SSKeychain:帐户未存储在 iCloud 中?
【发布时间】:2014-06-28 01:30:57
【问题描述】:

我正在使用 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”。

我错过了什么吗?服务名称一定要特别吗?

谢谢!

【问题讨论】:

  • 您找到解决方案了吗?

标签: ios macos icloud sskeychain


【解决方案1】:

如果这仍然与您相关,我设法找到了解决方案。 (适用于 >=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>钥匙串)。您可能还想在您的目标功能中启用Keychain Sharing

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多