2010-11-06 6 views
54

Sto descrivendo un problema per il quale ho impiegato un po 'di tempo per imparare la risposta.Come condividere i dati del portachiavi tra le applicazioni iOS

L'esempio "GenericKeychain" è un buon inizio per fornire un wrapper per la condivisione dei dati del portachiavi tra le applicazioni quando si utilizza accessGroup in init.

Tuttavia, l'implementazione di questo nella mia app ha prodotto un oscuro codice di errore (che ha richiesto un'eternità per individuare) -25243, che significa: Nessun controllo di accesso.

Ho eseguito l'app di esempio di Apple (GenericKeychain) sul mio iPad solo per ottenere lo stesso errore. Eh?

La documentazione di Apple non riesce a fornire ciò che è necessario per ottenere ciò?

+0

@GtotheB, bella risposta! Se vuoi, separa la tua risposta dalla domanda e pubblicala come una "risposta" a questa domanda. –

+0

@GtotheB: cosa è successo quando hai provato a pubblicare una risposta? Potrebbe esserci una reputazione minima richiesta, ma se così fosse, non ne ero a conoscenza. Se questo è il caso, varrebbe la pena tornare a questa domanda e pubblicare una risposta dopo aver guadagnato più rappresentanti. – outis

+0

@GtotheB: Potresti rispondere alla tua stessa domanda ora? – kennytm

risposta

51

Dopo alcuni (molti) scavi in ​​tutto il web, ho trovato la risposta. Il gruppo di accesso che si utilizza durante la costruzione della classe KeychainItemWrapper deve essere ANCHE specificato in ciascun file Entitlements.plist dell'applicazione nella sezione "portachiavi-accesso-gruppi".

Sembra quasi ovvio ora che vedo "portachiavi-accesso-gruppi". Tuttavia, non avevo idea nemmeno di guardare lì. Spero che questo aiuti gli altri.

+3

Ho trovato il seguente link molto utile per dare maggiori dettagli. http://useyourloaf.com/blog/2010/04/03/keychain-group-access.html – DBD

+4

Fai attenzione, nel nuovo XCode (4.5.2), c'è un'impostazione per i gruppi di portachiavi nella scheda di riepilogo dell'app nelle impostazioni. È possibile impostare il nome del gruppo lì, ma XCode intelligente antepone $ (AppIdentifierPrefix) ma non lo mostra nel riepilogo. Puoi vederlo nel file plist attuale e modificarlo lì. In breve, se si imposta il gruppo portachiavi dalla pagina di riepilogo, NON scrivere l'ID seme bundle, XCode lo aggiunge automaticamente. E lo nasconde nella pagina di riepilogo, perché è, beh, il software Apple. – mentat

+0

Ho una domanda successiva: le tue app hanno lo stesso ID seme/pacchetto? O hai appena usato Entitlements.plist per condividere i dati tra i gruppi portachiavi? – radj

13

In realtà non è difficile da fare. Si prega di seguire i passaggi.

App1:

  1. aprire il tuo App delle capacità di destinazione e attivare KeyChain condivisione.
  2. Aggiungere un identificatore. (es: com.example.sharedaccess)
  3. Aggiungi "UICKeyChainStore" al tuo progetto.
  4. Assicurati di avere un ID team aggiunto al tuo progetto App1.
  5. Aggiungi Security.framework al progetto App1.
  6. E aggiungi questi codici da qualche parte.

    [UICKeyChainStore setString:@"someValue" forKey:@"someKey" service:@"someService"]; 
    

App2:

  • aprire il tuo App delle capacità di destinazione e attivare KeyChain condivisione.
  • Aggiungere un identificatore. (es: com.example.sharedaccess)
  • Aggiungi "UICKeyChainStore" al tuo progetto.
  • Assicurati di avere un ID team aggiunto al tuo progetto App2.
  • Aggiungi Security.framework al progetto App2.
  • E aggiungi questi codici da qualche parte.

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"]; 
    
  • vostri TeamIDs dovrebbe essere uguale per entrambi i progetti.

  • Ho provato questi passaggi su un dispositivo reale iPhone.
  • Ho anche provato questi passaggi con Automatico e Profilo di provisioning di iOs provisioning.
  • Gli identificativi del pacco delle mie app erano così: com.example.app1, com.example.app2.
+2

Nota che "Come puoi vedere non stiamo specificando il gruppo di accesso, ma per impostazione predefinita sceglierà il primo gruppo di accesso specificato in Entitlements.plist quando scrive e cerca in tutti i gruppi di accesso quando nessuno è specificato. " – onmyway133

+0

@alicanbatur, fantastico! Una cosa da notare, sopra processo non ha funzionato se "servizio" non è stato specificato. – sabiland

+0

mi salvi molto @alicabatur. Grazie. – Sanju