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" там.
Я что-то пропустил? Должен ли сервис называть что-то особенное?
Спасибо!
2 ответа
В случае, если это все еще актуально для вас, мне удалось найти решение. (работает для>=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
в ваших целях.
После того, как у меня появился новый проект, я попробовал ответ 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()