Aufrufe an die Keychain-Dienste schlagen fehl mit errSecNotAvailable bei der Ausführung eines Ziels mithilfe der Befehlszeilenprogramme und der iPhone-Simulator ist auf Hardwareversion 6.0 (10A403) festgelegt. Wenn ich die Simulatorversion in eine andere frühere Version (4.3, 5.0, 5.1) ändere und die Ausführung mit demselben Befehlszeilenskript erneut durchführe, sind die Aufrufe erfolgreich.Keychain Services-API schlägt mit errSecNotAvailable in iPhoneSimulator 6.0 fehl
Ich verwende den neuesten XCode 4.5 und die Befehlszeilenwerkzeuge wurden von XCode heruntergeladen.
Um diesen Fehler zu reproduzieren nur Folgendes tun:
- -Setup ein ios Bibliotheksprojekt mit einem OCUnit Ziel
- Satz Grund SDK 6.0
- Sets iOS Deployment Target 4.3
- Kopieren und Fügen Sie den Code am Ende des Posts in das Testprojekt ein (es wird nur versucht, ein Passwort zu speichern und abzurufen)
- Fügen Sie das Security.framework dem OCUnit-Ziel hinzu
Führen Sie das OCUnit-Target in XCode aus und sehen Sie den Test-Durchlauf mit der im iPhonesimulator eingestellten Hardware-Version (ändern Sie einfach zwischen den Ausführungen).
Führen Sie das OCUnit Ziel aus der Befehlszeile:
xcodebuild -target TARGET_NAME_HERE -sdk iphonesimulator -configuration Release TEST_AFTER_BUILD=YES
mit iphone Simulator Hardware-Version eingestellt 6.0 und der Test scheitern. Wenn Sie die Hardwareversion des iPhone-Simulators auf 4.3, 5.0 oder 5.1 ändern und das Befehlszeilenskript erneut ausführen, wird der Test erfolgreich.
Ist dies ein Problem mit dem Befehlszeilenprogramm? ein iPhone Simulator Problem? ein OCUnit-Ziel, das über das Befehlszeilenproblem ausgeführt wird?
Wer mag Unit Tests, die nur passieren, wenn Kometen ausgerichtet sind ??
Irgendwelche Ideen? Hier
ist der Code:
#define KEYCHAIN_ITEM_ATTRIBUTES (id)kSecClassGenericPassword, kSecClass, @"MyService", kSecAttrService, @"MyPassword", kSecAttrAccount
const NSString* MyPassword = @"blabla";
- (void)testExample
{
// remove previous keychain item
OSStatus status = SecItemDelete((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES, nil]);
NSLog(@"SecItemDelete status:%ld",status);
NSParameterAssert(status == errSecSuccess || status == errSecItemNotFound);
// add keychain item with new value
NSData *data = [MyPassword dataUsingEncoding:NSUTF8StringEncoding];
status = SecItemAdd((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES, data, kSecValueData, nil], NULL);
NSLog(@"SecItemAdd status:%ld",status);
NSParameterAssert(status == errSecSuccess);
// get password
status = SecItemCopyMatching((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES,
kSecMatchLimitOne, kSecMatchLimit, kCFBooleanTrue, kSecReturnData, nil], (CFTypeRef *)&data);
NSLog(@"SecItemCopyMatching status:%ld",status);
NSParameterAssert(status == errSecSuccess);
if (status == errSecItemNotFound)
NSLog(@"SecItemCopyMatching status:%ld", status);
else
NSLog(@"SecItemCopyMatching result:%@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
}
In Bezug auf securityd Daemon nicht gestartet wird, kann ich es überprüfen ist, ins Leben gerufen, mit
launchctl list | grep securityd
nach dem Simulator gestartet wird, und immer
- 0 com.apple.iPhoneSimulator:com.apple.securityd
Ich habe auch versucht, diesen Securityd Daemon zu stoppen und einen anderen manuell zu starten ... Ich schaute auf GTM Ich benutze könnte RunIPhoneUnitTest.sh Skript für eine einfache Linie, aber wenn ich versuche, diese
launchctl submit -l ios6securityd -- /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/usr/libexec/securityd
gibt mir einen -5-Statuscode an diesem Dämon.
Ich habe dieses Problem selbst gesehen. Entschuldige noch keine Ideen, aber ich untersuche es. Danke für die Arbeit in der Zwischenzeit. –
Haben Sie ein Radar dafür? Ich bereite mich darauf vor. – KevinH
@KevinH Ich habe einen Apple Bug Report gepostet, aber keinen OpenRadar. – trickster