2014-09-24 21 views
8

Bu konu için Apple forumları ve SO'ları etrafında kazmaya başladım. Apple'ın KeychainItemWrapper'ı (ARCified) kullanarak, kSecAttrAccessible özniteliğini varsayılan (kSecAttrAccessibleWhenUnlocked) dışındaki herhangi bir şeye ayarlamaya çalışmak SecItemUpdate'in bir hata döndürmesinden kaynaklanan bir onaylama hatasıyla sonuçlanır. -50 durumunu dönen) (iOS8 + Apple'ın KeychainItemWrapper bir çökme ile sonuçlanır

*** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/john.hammerlund/.../KeychainItemWrapper.m:299 

onaylama işlemi hatası SecItemUpdate kaynaklanır:

KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil]; 
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService]; 
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount]; 
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible]; 

bizim anahtarlık güncellemeleri geri kalanı iyi geçiyor gibi görünüyor, ancak son satırı sonuçları Genel "geçersiz parametreler" hatası gibi görünüyor.

kSecAttrAccessible anahtarının hemen ayarlanması bir etki yapmaz, ancak bu değeri varsayılan kSecAttrAccessibleWhenUnlocked'a ayarlamak sorunu azaltır (ancak noktayı ortadan kaldırır). This other question, KeychainItemWrapper'ın çökmesine neden olan iOS 8 ile ilgili bulduğum ek bilgilerdir. IOS 7/8'de iOS 7 veya simülatör ile bir cihaza kurmak sorunu ortadan kaldırır; sadece iOS 8.

Güncelleme kullanarak gerçek cihazda yanıyor oluyor

İşte sorgu sözlüğe geniş bir özet yer almaktadır:

{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = cku; <-- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }

ve attributesToUpdate parametresi:

{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = ak; <-- kSecAttrAccessibleWhenUnlocked svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }

Ben c diğer alanları değiştirdiğini onayladı (örn. kSecAttrService, kSecAttrAccount) sözlüklerde söz konusu alanlardaki aynı etkiyi ancak 0.

+1

'WriteTKeychain' içinde' SecItemUpdate' için geçen 2 sözlükleri dökmek zorunda kalacaksınız, bu yüzden –

+0

@John bu konuda herhangi bir güncelleştirme görebilirsiniz? –

+0

Bir süre oldu, ama bana bunu geri getirmek için @singhSan teşekkür ederim. Bunun aşağıda açıklandığı gibi bir Apple hatası olduğunu farz ettim. – John

cevap

2

Aynı zamanda problemim vardı. bana verdi:

OSStatus hatası -50 - kSecAccess çakışan ve kSecAccessControl

onlar güncellenen hemen sonra uygulama mağazasında tüm kullanıcılara Çöktü bağlıyor.

Peter ile aynı şeyi yaptı.Verileri kaydetti, öğeyi sildi ve mevcut olanı güncellemeye çalışmak yerine yeni öğe olarak ekledi.

Sanırım bu bir Apple hatası.

Bir TSI açtım ancak henüz benimle bağlantı kurmadı.

Anladığım kadarıyla, iOS7'den iOS 8'e güncellenen kullanıcıların, ilk uygulamalarının iOS7 için XCode ile (iOS 8 önce çıktı) ve iOS8'de derlenmiş olan yeni uygulamaya güncellendiği kullanıcılar oluyor. XCode'dan iOS8'e.

2

beklenen durumu burada Karanlıkta bir atış ile:

Belki iOS cihazı iCloud senkronizasyon etkin ve ekleme etti Cihaza özgü olmayan ve daha sonra bunu yapmak ThisDeviceOnly hatayla sonuçlanır. iOS8 ayrıca davranışı değiştirmiş olabilir.

Bu yardımcı olmazsa

KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil]; 
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible]; 
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService]; 
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount]; 

Anahtarlık ayarlanır niteliklerin sırasını değiştirmeyi deneyin Can, sen KeychainItemWrapper bu

- (void)resetKeychainItem 
{ 
    if (!keychainItemData) 
    { 
     keychainItemData = [[NSMutableDictionary alloc] init]; 
     [keychainItemData setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; 
    } 
+0

Evet, pdmn değerleri ve accc referansları dışındaki tüm değerler aynıdır. – John

+0

Cevabı güncelledim. Burada bahsedilen şeyi denedin mi? –

+0

Yaptım ... zar yok. Bu ambalajı saatlerce kazıyorum ve hala bunu çözemiyorum. – John

4

benzemeye değişmelidir aynı vardı sorun. Ben kSecAttrAccessibile test sona erdi ve ben ne istediysem, anahtar zincirindeki değer ve öznitelikleri yerel değişkenlere kaydettim, anahtarlığı sıfırlayın, kSecAttrAccessible'ı istediğiniz şekilde ayarlayın ve sonra anahtarlıktaki değerleri ve nitelikleri orijinal ayarlarına ayarlayın.

+0

Teşekkürler Peter Çarpma nedenini anlamak için çok fazla acı çekti.Çarpmanın sonu elmalardan kaynaklanıyor.Çok yakında tamir edecekler.İstediğiniz gibi yaptım ve benim için çalıştı. – Allamaprabhu

+1

@peter Aynı sorunlarla uğraşıyorum, anahtarlığı sıfırlamaya çalıştım ama yine de hatayı alıyorum. Bu çalışmayı nasıl yapabileceğinizi gösteren bir pasaj yazabilir misiniz? – rmp

İlgili konular