首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSKeychain:帐户没有存储在iCloud中?

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

Stack Overflow用户
提问于 2014-05-10 09:25:48
回答 2查看 720关注 0票数 3

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

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

代码语言:javascript
复制
NSArray *arr=[SSKeychain accountsForService:@"Login"];
for (NSString *s in arr) {
    NSLog(@"Account: %@",s);
}

并获得以下内容(只显示一个条目,其他条目相似):

代码语言:javascript
复制
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。我用以下一行存储密码:

代码语言:javascript
复制
  [SSKeychain setPassword:self.passwortField.text forService:@"Login" account:self.userField.text];

我在Xcode中打开了密钥链共享,并在其中列出了一个密钥链组"de.gondomir.LocalButler“。

我是不是遗漏了什么?服务必须要命名什么特别的东西吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-14 09:16:31

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

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

代码语言:javascript
复制
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 (Settings>iCloud>Keychain)确保设备具有密钥链。您还可能希望在目标功能中启用Keychain Sharing

票数 2
EN

Stack Overflow用户

发布于 2016-04-04 02:53:25

在我有了一个新项目之后,我尝试了MarkHim的答案,它起作用了。我现在使用了斯威夫特,下面是我的工作代码:

代码语言:javascript
复制
    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)")
    }

这是用于读取的,在写入时,您必须先删除帐户(如果您想更改密码):

代码语言:javascript
复制
    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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23579343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档