2011-11-03 5 views
12

Sto lavorando all'aggiornamento di iPhone application con una modifica minore nella sua configurazione predefinita. È passato del tempo da quando l'ho creato per ultimo, quindi ho aggiornato Xcode alla 4.2 e incluso il supporto per iOS 5 nelle ultime build.Portachiavi iOS SecItemAdd restituisce -25243

Quando vado a testare sul dispositivo, ottengo il seguente errore di asserzione:

2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243 
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312 
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.' 

sto usando l'implementazione della classe KeychainItemWrapper da Apple di GenericKeychain project. Vale la pena notare che questo errore si manifesta solo sul dispositivo, non nel simulatore (e sono a conoscenza delle differenze di restrizione dei gruppi di accesso tra le piattaforme, ma di solito ho pensato che ciò causasse problemi al simulatore, non all'hardware vero e proprio).

Perché dovrei ricevere questo errore? Non ho toccato nulla di rilevante per le parti relative all'applicativo del portachiavi; memorizza e recupera i dati esattamente come un tempo.

risposta

18

Ok, non ho potuto realizzare il progetto, ma da How to share keychain data between iOS applications penso che potresti voler controllare il tuo file delle autorizzazioni. Almeno nel progetto github non hai specificato nulla nei gruppi di accesso portachiavi.

+0

Se ti potessi invitare più di una volta, la risposta era assolutamente magica. Ho scoperto che ho perso il mio file di diritti da qualche parte lungo la strada, quindi riattivarli (e giocare con i profili di provisioning per un po ') ha risolto il problema. Grazie! – Tim

9

Per i futuri utenti che finiscono qui, un'altra possibile causa dell'errore -25243 (che significa No access control, BTW) è in esecuzione sul simulatore.

Il mio migliore teoria è profilo di provisioning dell'app (o la firma della stessa) è come l'applicazione sa che cosa il suo seme bundle è. E i bundle seed devono far parte del nome del gruppo di accesso del tuo portachiavi. Ma le app eseguite sul simulatore non vengono firmate e quindi mancano (o diversi?) Le quantità di bundle di quelle specificate da keychain-access-group.

O qualcosa. È tutto così poco documentato, è difficile dire cosa sia cosa. Prova a eseguirlo su un dispositivo e verifica se questo è utile.

+0

Questo è un buon punto - grazie per averlo sollevato. Ho notato nella mia domanda iniziale che sto usando il [KeychainItemWrapper] di Apple (https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html#//apple_ref/doc/uid/DTS40007797 -Classes_KeychainItemWrapper_m-DontLinkElementID_10) classe, che include una clausola '# if' del compilatore per verificare se l'app è in esecuzione sul simulatore. Le persone che non utilizzano quel wrapper devono prendere precauzioni. – Tim

+0

Grazie, jemmons. Mi ha aiutato molto – makaron

3

Ricevo di tanto in tanto lo stesso errore nel simulatore anche se non ho toccato il codice. Un reset del simulatore risolve il problema per me.

Vedere questa domanda/risposta come reimpostare il simulatore: https://stackoverflow.com/a/3442326

+0

+1: Beh, questo è fastidioso ... Sto ricevendo lo stesso problema con il simulatore (e un reset certo lo aggiusta), ma (credo) non sta accadendo sul dispositivo. L'hai mai visto casualmente sul dispositivo? –

+0

No, non ho ancora visto questo errore su un dispositivo. – ToniTornado

1

Come altri hanno sottolineato, in un dispositivo di costruisce errore -25.243 è spesso causato da cercando di accedere a un gruppo di accesso portachiavi che non si dispone di autorizzazioni per. (Manca dal tuo file Entitlements.plist o dal tuo profilo di provisioning.)

Ma nel simulatore può esserci un'altra causa. Il simulatore non supporta i gruppi di accesso portachiavi a tutti, quindi se si imposta la proprietà kSecAttrAccessGroup su un elemento portachiavi e si tenta di scriverlo si otterrà questo codice di errore -25243.

Cordiali saluti, il codice GenericKeychain di esempio di Apple è questo commento:

// Ignore the access group if running on the iPhone simulator. 
// 
// Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// 
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
4

Per quelli di voi ricevendo questo errore e cercando di realizzare "in comune di accesso Key Chain" tra due applicazioni:

È necessario creare un ID app per la tua app con lo stesso Id Team che hai selezionato quando hai attivato per la prima volta "Accesso Portachiavi Condiviso" in "Capacità".Crea il tuo App Id qui:. Apple Member Center

Dopo di che è necessario creare il profilo di provisioning da quella App Id e scaricarlo sul vostro computer (doppio clic su di esso per l'installazione di x-code)

ti assumo già che è necessario "App ID Prefix" per accedere portachiavi, ma per coloro che non conoscono: "App ID Prefix" è identificativo testo univoco associato al tuo account sviluppatore di Apple: enter image description here

per accedere "SharedKeychain" è necessario implementarlo in questo modo prima di provare a scrivere o leggere dal portachiavi

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup":

È possibile controllare questo tutorial per ulteriori informazioni: Share Keychain between iOS apps.

Speranza che aiuta.

0

Questo ha funzionato per me quando ho utilizzato un certificato di produzione e un profilo di provisioning. L'uso del debug non ha funzionato.

0

Nella mia esperienza, ho ottenere che il valore di ritorno -25243 quando ho capito che stavo cercando di passare kSecMatchLimit con kSecMatchLimitOne e kSecReturnData con kCFBooleanTrue valori alla funzione SecItemAdd(). Ho rimosso quelli e ricontrollato gli ID delle app e i profili di provisioning e tutto è andato bene.

Non sono sicuro che sia utile o meno, ma secondo la mia esperienza se si utilizzerà la funzione SecItemAdd() per l'accesso con portachiavi condiviso, questi due parametri non devono essere presenti.