2014-10-15 5 views
5

Wir haben eine iOS-App, die veröffentlicht wurde. Die IDE ist XCode6. Ich möchte die Schlüsselbundfreigabe hinzufügen, um über eine iOS 8-Freigabenerweiterung auf die Sitzungs-ID zuzugreifen, die in der App vorhanden ist.Hinzufügen von Schlüsselbundfreigaben zur Produktions-App, die bereits über Nutzer verfügt

Das Problem tritt immer dann auf, wenn die Schlüsselbundfreigabe aktiviert ist. Auf die bereits vorhandene Sitzungskennung kann nicht mehr zugegriffen werden.

Sie können darauf zugreifen, wenn die Schlüsselbundfreigabe deaktiviert ist.

Dieses Wörterbuch wird an SecItemCopyMatching übergeben, das immer dann -25300 (nicht gefunden) zurückgibt, wenn die Schlüsselbundfreigabe aktiviert ist, unabhängig davon, was die "Schlüsselbundgruppen:" sind.

[0] (null) @"svce" : @"SESSION_ID_KEY" 
[1] (null) @"r_Data" : @"1"  
[2] (null) @"m_Limit" : @"m_LimitOne" 
[3] (null) @"class" : @"genp" 
[4] (null) @"acct" : @"SESSION_ID_KEY" 
[5] (null) @"pdmn" : @"ck" 

Eine Idee, warum der Zugriff auf den Schlüssel möglicherweise nicht funktioniert? Ich habe versucht, kSecAttrAccessGroup mit dem Paket-Präfix und Namen zu setzen und es funktionierte immer noch nicht auf dem Simulator.

Antwort

1

Ich hatte ein ähnliches Problem bei der Implementierung von Inter-App-Kommunikation in iOS 7 vor ein paar Monaten. Ich fand diese Bemerkung auf Apple's GenericKeyChain sample project:

 // 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). 

Also, wenn Sie Sie auf einem Simulator zu test müssen die „kSecAttrAccessGroup“ entfernen.

Auf einem Gerät sollte es mit diesem Schlüssel arbeiten. Hoffentlich

+1

Das Problem tritt auch beim Ausführen in einem Gerät auf. – FernandoEscher

6

Ich habe Ihre Antwort und die Prämie :)

Ich hatte das gleiche Problem ursprünglich und kam in diesem Beitrag, und ich weiß, Sie erwähnen Sie mit dem Bündel-Präfix und Namen versucht. Aber lassen Sie uns durch einen Gesundheitscheck gehen.

Im MyApp.entitlements und in MyApp Extension.entitlements Ich habe den Keychain Access Groups Satz $(AppIdentifierPrefix)com.company.MyApp (dies ist die Standardeinstellung).

zugegriffen ich den Wert für ABCD1234 (aka AppIdentifierPrefix Wert) unter Verwendung dieses SO https://stackoverflow.com/a/20340883 jedoch antworten zu hier nicht best practice sein kann, so hält dies für eine Lösung wie diese https://stackoverflow.com/a/11841898/2588957

suchte, dann in meiner app beachten Sie alles, was ich hinzugefügt Um meinen aktuellen Code zu arbeiten, ist folgendes: [keychainItem setObject:@"ABCD1234.com.company.MyApp" forKey:(__bridge id)kSecAttrAccessGroup]; vor dem Aktualisieren des Elements und ich kann jetzt auf den Schlüsselbund Artikel in meiner Freigabe-Erweiterung zugreifen.

+2

Dies dient zum Freigeben neuer Daten im Schlüsselbund zwischen der App und der Erweiterung, aber die alten Daten, die in der App vor dem Hinzufügen der Schlüsselbundfreigabe vorhanden waren, können nicht mehr abgerufen werden. Wenn die Schlüsselbundfreigabe deaktiviert ist, kann auf die alten Daten erneut zugegriffen werden. – hellolight

+1

@hellolight Ich habe gerade verifiziert, dass die Verwendung der gleichen Standard-Schlüsselbund-Zugriffsgruppe funktioniert, um Daten aus dem nicht freigegebenen Schlüsselbund zu erhalten, nachdem die Schlüsselbundfreigabe aktiviert wurde. Stellen Sie außerdem sicher, dass Sie den Wert für kSecAttrService in allen Apps festlegen, die den Keychain-Zugriff freigeben. Um die Berechtigungen Ihrer App zu überprüfen, können Sie diesen Befehl vom Terminal '$ codesign -d --entitements: -/path/to/MyProject.app' verwenden. Es wird Ihnen helfen, sicherzustellen, dass Ihre Schlüsselbund-Zugangsgruppen korrekt sind. – FernandoEscher

+0

Haben Sie etwas Besonderes unternommen, um die nicht geteilten Daten abzurufen? Welche Schlüssel im keychainItem-Wörterbuch haben Sie festgelegt?Ist das SVCE und Acct eine einzigartige ID für dich? – hellolight

Verwandte Themen