2012-10-26 21 views
5

Keychain Services için yapılan çağrılar, komut satırı araçlarını kullanarak bir hedef yürütüldüğünde errSecNotAvailable ile başarısız olur ve iphone simulator Donanım sürüm 6.0 (10A403) olarak ayarlanır. Simülatör sürümünü diğer bir önceki sürüme (4.3, 5.0, 5.1) değiştirirsem ve aynı komut satırı komut dosyasını kullanarak yeniden çalıştırırsam, çağrı başarılı olur.Anahtarlık Hizmetleri API'sı, iphonesimulator 6.0'da errSecNotAvailable ile başarısız olur

En son XCode 4.5 çalıştırıyorum ve komut satırı araçları XCode içinden indirildi.

Bu hata yeniden oluşturmak için aşağıdakileri yapmanız yeterlidir:

  1. Kurulum bir OCUnit hedefiyle bir ios kütüphane projesi
  2. Seti Baz SDK 6.0
  3. Seti iOS Dağıtım Target'e 4.3
  4. Kopyala ve kodun sonuna kodun sonunu test projesine yapıştırın (yalnızca bir parola depolamaya ve geri almaya çalışır)
  5. Security.framework öğesini OCUnit hedefine ekleyin

XCode'da OCUnit hedefini yürütün ve iphone simülatöründe hangi Donanım Sürümü ayarlandıysa testin geçtiğini görün (yalnızca yürütmeler arasında değiştirin). Donanım Sürüm 6.0 olarak ayarlanmış iphone simülatörü ile

xcodebuild -target TARGET_NAME_HERE -sdk iphonesimulator -configuration Release TEST_AFTER_BUILD=YES 

ve test başarısız olur:

kullanarak komut satırından OCUnit hedefini yürütün. Iphone simülatörünün Donanım Sürümünü 4.3, 5.0 veya 5.1'e değiştirirseniz ve komut satırı komut dosyasını tekrar çalıştırırsanız, test 'u başarılı olur.

Bu bir komut satırı aracı sorunu mu? bir iphone simülatörü problemi? Komut satırı sorunundan çalışan bir OCUnit hedefi?

Yalnızca kuyruklu yıldızlar hizalandığında geçen birim testlere sahip olmak kimin?

Herhangi bir fikrin var mı? İşte

kod şudur: Ben simülatör başladıktan sonra

launchctl list | grep securityd 

kullanarak, başlatılan ediliyor IS işaretleyin ve alma olabilir securityd cini başlatılmaktadır değil İlişkin

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

- 0 com.apple.iPhoneSimulator:com.apple.securityd 

Ayrıca bu güvenlik kamerasını durdurmayı denedim ve manuel olarak başlattım ... GTM'ye baktım RunIPhoneUnitTest.sh Kullanabileceğim basit hattı için komut dosyası, ama çalıştığınızda bu

launchctl submit -l ios6securityd -- /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/usr/libexec/securityd 

bana o cini üzerinde -5 durum kodu verir.

+0

Bu problemi kendim gördüm. Üzgünüm henüz bir fikrim yok ama bakıyorum. Bu arada iş için teşekkürler. –

+0

Bunun için bir radar mı yazdınız? Hazırlanıyorum. – KevinH

+0

@KevinH Bir Apple Bug Raporu yayınladım ama OpenRadar'ı kullanmamıştım – trickster

cevap

1

Bu nedenle, Xcode 4.5.1 UI'den birim sınamalarımı çalıştırmaya çalışırken anahtarlık erişimi elde etme konusunda sorun yaşıyorum.Neyse ki, CI ile aşina olduğum bir şey, önceki Xcode sürümlerinin çoğunda olduğu gibi, simülatörün securityd düzgün başlatılmamış olmasıdır.

ilk securityd başlatılması deneyin ve görmek eğer yardımcı olur:

#!/bin/bash 

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

benim için çalıştı o.

+0

Simülatör (herhangi bir sürüm) başlattığımda ilgili güvenlik kamerasının doğru şekilde kurulduğunu "launchctl list | grep securityd" kullanarak kontrol ettim. Kullanabileceğim uygun bir komut dosyası yapıştırabilir misin? Sorumu denediğim senaryo ile güncelledim. – trickster

İlgili konular