2010-11-06 4 views
54

Ich beschreibe ein Problem, für das ich einige Zeit brauchte, um die Antwort zu lernen.So teilen Sie Schlüsselbunddaten zwischen iOS-Anwendungen

Das Beispiel "GenericKeychain" ist ein guter Anfang für die Bereitstellung eines Wrappers für die gemeinsame Nutzung von Schlüsselbunddaten zwischen Anwendungen, wenn die accessGroup in init verwendet wird.

Die Implementierung in meiner App ergab jedoch einen obskuren Fehlercode (der für immer zu lokalisieren brauchte) -25243, was bedeutet: Keine Zugriffskontrolle.

Ich habe Apples Beispiel-App (GenericKeychain) auf meinem iPad nur ausgeführt, um den gleichen Fehler zu erhalten. Hä?

Kann die Dokumentation von Apple nicht liefern, was notwendig ist, um dies zu erreichen?

+0

@Gtotheb, nette Antwort! Wenn Sie möchten, trennen Sie Ihre Antwort von der Frage und posten Sie sie als "Antwort" auf diese Frage. –

+0

@GotheB: Was ist passiert, als du versucht hast, eine Antwort zu posten? Es könnte eine minimale Reputation erforderlich sein, aber wenn, dann war mir das nicht bewusst. Wenn das der Fall ist, lohnt es sich, auf diese Frage zurückzukommen und eine Antwort zu veröffentlichen, sobald Sie mehr Repräsentiert haben. – outis

+0

@Gtotheb: Können Sie jetzt Ihre eigene Frage beantworten? – kennytm

Antwort

51

Nach einigen (viel) Graben im Internet, fand ich die Antwort. Die Zugriffsgruppe, die Sie beim Erstellen Ihrer KeychainItemWrapper-Klasse verwenden, muss auch in der Datei "Entitlements.plist" Ihrer Anwendung im Abschnitt "keychain-access-groups" angegeben werden.

Es scheint fast offensichtlich, jetzt, dass ich sehe "keychain-access-groups". Ich hatte jedoch keine Ahnung, dass ich dort hinschauen sollte. Hoffe das hilft anderen.

+3

Ich fand den folgenden Link sehr nützlich für weitere Details. http://useyourloaf.com/blog/2010/04/03/keychain-group-access.html – DBD

+4

Seien Sie vorsichtig, in neuen XCode (4.5.2) gibt es eine Einstellung für Schlüsselbund-Gruppen in App-Übersicht Registerkarte in den Einstellungen. Sie können den Gruppennamen dort festlegen, aber Smart XCode fügt $ (AppIdentifierPrefix) vor, zeigt es jedoch nicht in der Zusammenfassung an. Sie können es in der tatsächlichen Plist-Datei sehen und dort bearbeiten. Kurz gesagt, wenn Sie Schlüsselbund Gruppe von Übersichtsseite, schreiben Sie nicht Bündel Samen ID, fügt XCode es automatisch. Und versteckt es in der Übersichtsseite, denn es ist, nun, Apple-Software. – mentat

+0

Ich habe eine Follow-up-Frage: Haben Ihre Apps die gleiche Paket-/Entwickler-ID? Oder Sie haben gerade die Entitements.plist verwendet, um die Daten zwischen Schlüsselbundgruppen zu teilen? – radj

13

Eigentlich ist es nicht schwer zu tun. Bitte folgen Sie den Schritten.

App1:

  1. Öffnen Sie Ihre App Zielfunktionen und KeyChain Freigabe aktivieren.
  2. Eine Kennung hinzufügen. (zB: com.example.sharedaccess)
  3. Fügen Sie Ihrem Projekt "UICKeyChainStore" hinzu.
  4. Stellen Sie sicher, dass Sie eine Team-ID zu Ihrem App1-Projekt hinzugefügt haben.
  5. Fügen Sie Security.framework zu Ihrem App1-Projekt hinzu.
  6. Und fügen Sie diese Codes zu irgendwo Sie brauchen.

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

App2:

  • Öffnen Sie Ihre App Zielfunktionen und KeyChain Freigabe aktivieren.
  • Eine Kennung hinzufügen. (zB: com.example.sharedaccess)
  • Fügen Sie Ihrem Projekt "UICKeyChainStore" hinzu.
  • Stellen Sie sicher, dass Sie eine Team-ID zu Ihrem App2-Projekt hinzugefügt haben.
  • Fügen Sie Security.framework zu Ihrem App2-Projekt hinzu.
  • Und fügen Sie diese Codes zu irgendwo Sie brauchen.

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"]; 
    
  • Ihre TeamIDs sollte für beide Projekte gleich sein.

  • Ich versuchte diese Schritte auf einem echten iPhone Gerät.
  • Ich habe auch diese Schritte mit Automatische und iOs Entwicklung Provisioning-Profil versucht.
  • Die Paket-IDs meiner Apps waren wie folgt: com.example.app1, com.example.app2.
+2

Beachten Sie, dass "wie Sie sehen können wir die accessGroup nicht angeben. Standardmäßig wählt es die erste Zugriffsgruppe, die in Ihrer Entitlements.plist beim Schreiben angegeben und wird Suche über alle Zugriffsgruppen, wenn keine angegeben ist. " – onmyway133

+0

@alicanbatur, großartig! Eine Sache zu bemerken, über den Prozess hat nicht funktioniert, wenn "Service" nicht angegeben wurde. – sabiland

+0

Sie sparen mich viel @alicabatur. Vielen Dank. – Sanju