我使用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"在那里上市。
我错过了什么吗?服务名称必须特别吗?
谢谢!
答案 0 :(得分:2)
如果这仍然与您相关,我设法找到解决方案。 (适用于> = 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)。您可能还想在目标功能中启用Keychain Sharing
。
答案 1 :(得分:0)
在我有一个新项目后,我尝试了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()