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);
}
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
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? –
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