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.
'WriteTKeychain' içinde' SecItemUpdate' için geçen 2 sözlükleri dökmek zorunda kalacaksınız, bu yüzden –
@John bu konuda herhangi bir güncelleştirme görebilirsiniz? –
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