3

sskeychain ( https://github.com/soffes/sskeychain ) を使用して、アカウントとパスワードを IOS キーチェーンに保存しています。アカウントを保存すると、他のデバイスで利用できるはずだと思います。しかし、そこには現れません。

私はこのコードで自分のアカウントを読みました:

NSArray *arr=[SSKeychain accountsForService:@"Login"];
for (NSString *s in arr) {
    NSLog(@"Account: %@",s);
}

これを取得します(1つのエントリのみが表示され、他のエントリは同様です):

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」をリストしました。

何か不足していますか?サービスに何か特別な名前を付ける必要がありますか?

ありがとう!

4

2 に答える 2

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ターゲット機能で有効にすることもできます。

于 2016-01-14T09:16:31.183 に答える
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()
于 2016-04-04T02:53:25.243 に答える