Ho scavato attorno ai forum Apple e SO per questo problema senza alcun risultato. Usando il KeychainItemWrapper (ARCified) di Apple, tentando di impostare l'attributo kSecAttrAccessible
su qualsiasi cosa tranne il valore predefinito (kSecAttrAccessibleWhenUnlocked
), si verifica un errore di asserzione da parte di SecItemUpdate che restituisce un errore.iOS8 + KeychainItemWrapper di Apple provoca un crash
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];
Il resto dei nostri aggiornamenti portachiavi sembrano essere passare attraverso bene, ma i risultati ultima riga:
*** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/john.hammerlund/.../KeychainItemWrapper.m:299
L'errore di asserzione è dovuto SecItemUpdate() restituendo uno stato di -50, che sembra essere un errore generico di "parametri non validi".
L'impostazione immediata della chiave kSecAttrAccessible
non ha alcun impatto, ma impostandola sul valore predefinito kSecAttrAccessibleWhenUnlocked
attenua il problema (ma elimina il punto). This other question sono le uniche informazioni aggiuntive che ho trovato relative a iOS 8 che causano l'arresto anomalo di KeychainItemWrapper. Costruire su un dispositivo con iOS 7 o un simulatore su iOS 7/8 elimina il problema; è solo divampare su un dispositivo reale utilizzando iOS 8.
Aggiornamento
Ecco un'ampia panoramica del dizionario query:
{ 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" = <>; }
e il parametro attributesToUpdate:
{ 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" = <>; }
Ho c ha affermato che cambiando altri campi (ad es. kSecAttrService, kSecAttrAccount) hanno lo stesso effetto sui campi corrispondenti nei dizionari, ma con uno stato previsto di 0.
si dovrà scaricare i 2 dizionari passati a "SecItemUpdate' in' writeToKeychain' in modo da poter vedere il problema –
@John qualsiasi aggiornamento su questo? –
È passato un po 'di tempo, ma grazie a @singhSan per avermi riportato a questo. Ho assunto questo è un bug di Apple, come descritto di seguito. – John