2012-06-27 10 views
6

Ho un'applicazione che memorizza nome utente e password nel portachiavi. Tutto stava funzionando benissimo quando si lavora su Xcode 3, di recente ho trasferito a Xcode 4 e ora quando faccio funzionare l'applicazione, ottengo un messaggio:L'applicazione richiede sempre il permesso per accedere al portachiavi

Application wants to use your confidential information stored in keychain" in your keychain.

Dopo aver colpito sempre permettono vedo l'applicazione aggiunta al controllo di accesso elenco dell'elemento portachiavi, ma ottengo ogni volta che eseguo l'app.

Anche dopo aver premuto Consenti sempre di nuovo, vedo che il controllo di accesso ha due istanze della stessa app. Sembra che il sistema operativo pensi che questa sia una nuova applicazione.

Qualsiasi idea apprezzata.

+0

Come stai firmando il codice della tua app? (Questo è uno dei motivi più comuni di questo problema.) – abarnert

+0

Devo impostare il codice nel set up delle impostazioni di Xcode, Sotto il segno del codice Ho selezionato un'identità di firma del codice per l'applicazione ID dello sviluppatore –

+0

Hai eseguito una build precedente sul stessa macchina?A seconda del Requisito Designato (che dipende dalla versione di Xcode 4 che usi, se stai semplicemente attaccando ai valori predefiniti), il Portachiavi potrebbe trattare la tua vecchia build e la tua nuova come app diverse, il che significa che la tua nuova build apparirà avvisi se la vecchia build aveva memorizzato qualcosa nel portachiavi. – abarnert

risposta

3

Credo che il problema è che il requisito designato dalla tua firma lo induce a non accettarsi come "la stessa app" di se stesso (a scopo Keychain).

Una causa comune per questo, e penso che sia il tuo, è l'utilizzo di un ID applicazione Developer cert, senza requisiti designati e senza il certificato intermedio installato.

Un requisito Developer ID standard di simile a questo:

designated => anchor apple generic and 
identifier \"com.example.appName\" and 
((cert leaf[field.1.2.840.113635.100.6.1.9] exists) or 
(certificate 1[field.1.2.840.113635.100.6.2.6] exists and 
certificate leaf[field.1.2.840.113635.100.6.1.13] exists and 
certificate leaf[subject.OU] = \"1AZBYCXDW9V\")) 

Se si vuole costruire da soli, si deve sostituire l'identificativo con il proprio identificativo fagotto e il subject.OU con il valore dal vostro cert. (Se si fa doppio clic su di esso in Accesso Portachiavi, dovrebbe essere indicato come l'Unità organizzativa.) Quindi è possibile aggiungere a "Altre Bandiere firma del codice":

--requirements "=designated ..." (the whole mess from above) 

Tuttavia, un modo molto migliore per farlo è usare Xcode 4.3.2 o successivo. Se riconosce che stai utilizzando un certificato Application ID per sviluppatori e puoi vedere il cert intermedio nel portachiavi, questo verrà generato per impostazione predefinita.

Inoltre, se si utilizza Archivia organizzatore in Xcode su "Esporta applicazione con firma ID sviluppatore", invece di utilizzare semplicemente la compilazione dalla directory di destinazione, si accerterà di firmare l'app e tutti gli altri simboli inclusi e verificherà che tutto sia configurato correttamente. (I fallimenti sono piuttosto criptici, per esempio, il tuo passaggio "Scegli un ID di sviluppatore da firmare con" potrebbe non avere nessuna scelta, con un messaggio nel syslog che non ha informazioni utili - ma almeno il fatto che abbia fallito o sia riuscito a restringersi

In entrambi i casi, è necessario scaricare e installare (sul computer di costruzione) il certificato intermedio, denominato "Autorità di certificazione ID sviluppatore", dal collegamento "Certificato intermedio ID sviluppatore" nel sito Developer Certificate Utility .

Un'ultima cosa: anche se questo risolve il problema in esecuzione sulla macchina di compilazione, è necessario testare la versione del sistema operativo più vecchia che si supporta. Ad esempio, i requisiti compilati dal codice di Leone a volte non possono essere analizzati su Leopard o, talvolta, su Snow Leopard. Se ciò accade ... vedi Gatekeeper vs. Leopard: an ongoing tale.

+0

Grazie abarnert, ci sono state molte grandi informazioni. Ma sembra che abbia trovato una soluzione a questo problema. Ho rimosso la firma del codice dall'interfaccia utente in Xcode e l'ho aggiunto come passo della riga di comando alla fine del mio script di compilazione. Questo sembra funzionare bene ora, ma davvero, grazie mille per tutto l'aiuto. –

+1

Nitin, puoi condividere la tua risoluzione, sto avendo lo stesso problema con Xcode 6 –

Problemi correlati