2014-06-18 11 views
9

Ich benutze den Schlüsselbund, um Daten auf dem lokalen Gerät zu speichern, habe mich jedoch dazu entschlossen, ihn für die Verwendung über mehrere Geräte über iCloud anzupassen. Ich habe die iCloud-Berechtigung aktiviert und die erforderliche Konfiguration im Member Center erstellt. Während die Daten gespeichert werden, scheint es jedoch nicht, dass sie in der Cloud gespeichert werden. Ich teste gerade zwischen dem Simulator und meinem iPhone Gerät. Der Simulator ist mit meinem Account angemeldet. Jedes Gerät speichert weiterhin die Daten, aber das andere Gerät sieht die Ergebnisse nicht.Schlüsselbunddaten, die nicht in iCloud gespeichert werden

Ich habe nur die kSecAttrSynchronizable und kCFBooleanTrue zu den bestehenden Setup hinzugefügt, die ich verstanden hatte, war alles, was benötigt wurde, um den Schlüsselbund die Wolke zu verwenden.

Hier der Code zum Speichern und Abrufen von Schlüsselbunddaten.

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service 
{ 
    return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass, 
      service, (__bridge id)kSecAttrService, 
      service, (__bridge id)kSecAttrAccount, 
      (__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrSynchronizable, 
      (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible, 
      nil]; 
} 

+ (void)save:(NSString *)service data:(id)data 
{ 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    CFTypeRef result = NULL; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainQuery, &result); 

    if (status == errSecSuccess) NSLog(@"Succcessfully Stored Value"); 
    else NSLog(@"Failed to store value with code: %ld",(long)status); 
} 

+ (id)load:(NSString *)service { 
    id ret = nil; 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
    CFDataRef keyData = NULL; 
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
     @try { 
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
     } 
     @catch (NSException *e) { 
      NSLog(@"Unarchive of %@ failed: %@", service, e); 
     } 
     @finally {} 
    } 
    if (keyData) CFRelease(keyData); 
    return ret; 
} 

+ (void)delete:(NSString *)service { 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
} 
+0

Ein bisschen ein Follow-up. Ich habe den Schlüsselbund auf meinem Mac beobachtet, während ich die App am Telefon benutzt habe. Ich habe gesehen, dass Schlüsselbunddaten geschrieben wurden, so dass es scheinbar funktioniert. Allerdings hatte ich den Eindruck, dass der Simulator auch funktionieren sollte und es gibt eine "trigger iCloud Sync" -Option unter Debug in der Sim. Die Dokumentation von Apple zeigt auch an, dass der Simulator verwendet werden kann. Es scheint jedoch, dass es nicht mit der Hauptschlüsselkette interagiert, obwohl mein Konto im Simulator eingegeben wurde. – C6Silver

+0

Wenn Sie die "iCloud-Berechtigung" aktiviert haben, meinen Sie, dass Sie die Schlüsselbundfunktionalität unter "iCloud" in der Einstellungs-App aktiviert haben? Oder muss man sich in pList einschalten? –

+0

Aktiviert unter "Capabilities" in den Targets-Einstellungen. Im Member Center wurde "iCloud" zur App-ID hinzugefügt (dies ist die Berechtigung, auf die sie im Tab "Funktionen" verweisen. – C6Silver

Antwort

0

Der Simulator - Version 7.1 (463.9.41) - haben sich nicht (ich denke, „simuliert nicht“ ist genauer) die notwendige Hardware für die sichere Verwaltung des Schlüsselanhängern.

Sie werden auf dem Simulator in Settngs.app unter iCloud feststellen, gibt es keine Option für Schlüsselbund, während auf dem Gerät diese Option existiert.

Wenn Sie in ~/Library/Application Support/iPhone Simulator/7.1/Library/Keychains graben, finden Sie den Schlüsselbund des Simulators. Die kSecAttrAccessGroup ist test für alle Artikel, die ich in den Schlüsselbund des Simulators gelegt habe. Beim Ausführen auf dem Gerät erhalte ich die erwartete Zugriffsgruppe (App-ID meiner App).

All dies deutet darauf hin, dass der Simulator iCloud Keychain Sync nicht unterstützt. Die WWDC-Sitzung 2014 # 711 Keychain und Authentifizierung mit Touch ID geht ausführlich darauf ein, wie die Hardware-Funktionen des Geräts die Keychain-Verschlüsselung unterstützen.

Zwei iOS-Geräte oder iOS und OS X waren die einzige Möglichkeit, die iCloud Keychain-Synchronisierung zuverlässig zu entwickeln, zu debuggen und Fehler zu beheben.

Verwandte Themen