2014-05-10 5 views
3

IOS 키 체인에 계정과 암호를 저장하기 위해 sskeychain (https://github.com/soffes/sskeychain)을 사용하고 있습니다. 나는 계정을 저장하면 다른 장치에서 사용할 수 있어야한다고 생각합니다. 그러나 거기에는 나타나지 않습니다. SSKeychain : iCloud에 계정이 저장되지 않았습니까?

가이 코드 내 계정을 읽어

Account: { 
acct = "[email protected]"; 
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; 
} 

그러나 이것은 다른에 표시되지 않습니다

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

이 수 (그림에 표시된 하나 개의 항목을, 나머지는 비슷합니다) 장치. 두 장치 모두 IOS 7.1.1이 있습니다. 나는이 라인과 암호를 저장 :

[SSKeychain setPassword:self.passwortField.text forService:@"Login" account:self.userField.text]; 

내가 엑스 코드에 키 체인 공유를 전환하고 나열된 키 체인 그룹 "de.gondomir.LocalButler"가있다.

내가 누락 된 항목이 있습니까? 서비스 이름은 뭔가 특별한 것이어야합니까?

감사합니다.

+0

당신을 했 솔루션을 찾았나요? – MarkHim

+0

아니요, 죄송합니다. 불운. – Gondomir

답변

2

이 경우에도 여전히 관련성이있는 경우 솔루션을 찾을 수있었습니다. (> = iOS7 이상에서 작동)

SSKeychain의 정적 메서드를 사용하여 자격 증명을 작성하지 마십시오. 대신 SSKeychain에 정적 편리한 메소드는 아이 클라우드 키 체인과 동기화되지 않는 자격 증명을 일으키는 기본 동기화 모드 SSKeychainQuerySynchronizationModeAny를 사용 SSKeychainQuery을 사용하고이

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]); 
} 

처럼 SSKeychainQuerySynchronizationModeYes에 synchronizationMode을 설정합니다.

또한 iCloud가 활성화 된 상태에서 (설정> iCloud> 키 체인) 기기에 키 체인이 있는지 확인하십시오. 타겟 기능에서 Keychain Sharing을 활성화 할 수도 있습니다.

0

MarkHim의 답변을 시도한 새 프로젝트를 만든 후에 작동합니다. 나는 빠른 지금, 그래서 여기 내 작업 코드 사용 :

(암호를 변경하려는 경우) 먼저 계정을 삭제해야합니다 작성하기위한, 읽기의
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()