2012-10-26 4 views
5

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:

  1. -Setup ein ios Bibliotheksprojekt mit einem OCUnit Ziel
  2. Satz Grund SDK 6.0
  3. Sets iOS Deployment Target 4.3
  4. 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)
  5. Fügen Sie das Security.framework dem OCUnit-Ziel
  6. 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.

+0

Ich habe dieses Problem selbst gesehen. Entschuldige noch keine Ideen, aber ich untersuche es. Danke für die Arbeit in der Zwischenzeit. –

+0

Haben Sie ein Radar dafür? Ich bereite mich darauf vor. – KevinH

+0

@KevinH Ich habe einen Apple Bug Report gepostet, aber keinen OpenRadar. – trickster

Antwort

1

Ich bin darauf gestoßen, weil ich Probleme hatte, Keychain-Zugriff zu bekommen, wenn ich versuche, meine Komponententests von der Xcode 4.5.1 UI auszuführen.Zum Glück ist die Bruchstelle etwas, das ich von CI mit den meisten früheren Xcode-Versionen kenne, das heißt, dass der Simulator Security nicht richtig gestartet ist.

Versuchen securityd startet zuerst, und sehen, ob das hilft:

#!/bin/bash 

simulator_root=`xcodebuild -version -sdk iphonesimulator Path` 
"${simulator_root}/usr/libexec/securityd" 

die für mich gearbeitet.

+0

Ich habe mit "launchctl list | grep securityd" überprüft, dass beim Starten des Simulators (jede Version) der entsprechende Securityd Daemon richtig eingerichtet ist. Können Sie ein geeignetes Skript einfügen, das ich verwenden kann? Ich habe meine Frage mit dem Skript aktualisiert, das ich ausprobiert habe. – trickster