2010-11-06 21 views
54

Opisuję problem, z powodu którego zajęło mi sporo czasu, aby poznać odpowiedź.Jak udostępnić dane pęku kluczy między aplikacjami iOS

Przykład "GenericKeychain" jest dobrym początkiem w udostępnianiu opakowania do udostępniania danych pęku kluczy między aplikacjami podczas korzystania z grupy accessGroup w init.

Jednak wdrożenie tego w mojej aplikacji przyniosło niejasny kod błędu (który trwało wiecznie, aby zlokalizować) -25243, co oznacza: Brak kontroli dostępu.

Uruchomiłem przykładową aplikację Apple (GenericKeychain) na moim iPadzie, aby uzyskać ten sam błąd. Huh?

Czy dokumentacja firmy Apple nie dostarcza informacji niezbędnych do wykonania tej czynności?

+0

@ GtotheB, dobra odpowiedź! Jeśli chcesz, oddziel swoją odpowiedź od pytania i opublikuj jako "odpowiedź" na to pytanie. –

+0

@GtotheB: Co się stało, gdy próbowałeś wysłać odpowiedź? Może być wymagana minimalna reputacja, ale jeśli tak, nie wiedziałem o tym. Jeśli tak jest, warto wrócić do tego pytania i opublikować odpowiedź po uzyskaniu więcej powtórzeń. – outis

+0

@GtotheB: Czy mógłbyś teraz odpowiedzieć na własne pytanie? – kennytm

Odpowiedz

51

Po kilku (wielu) kopaniu w sieci, znalazłem odpowiedź. Grupa dostępu używana podczas tworzenia klasy KeychainItemWrapper musi być również podana w każdym pliku aplikacji Entitlements.plist w sekcji "keychain-access-groups".

Wydaje się prawie oczywiste, że teraz widzę "grup pęku kluczy dostępu". Jednak nie miałem pojęcia, aby nawet tam spojrzeć. Mam nadzieję, że to pomoże innym.

+3

Znalazłem następujący link całkiem przydatne dla podania więcej szczegółów. http://useyourloaf.com/blog/2010/04/03/keychain-group-access.html – DBD

+4

Należy zachować ostrożność, w nowym kodzie X (4.5.2) istnieją ustawienia grup pęku kluczy w zakładce podsumowania aplikacji w ustawieniach. Możesz tam ustawić nazwę grupy, ale inteligentny XCode poprzedzający $ (AppIdentifierPrefix), ale nie wyświetla go w podsumowaniu. Możesz go zobaczyć w rzeczywistym pliku plist i tam edytować. W skrócie, jeśli ustawiasz grupę pęków kluczy ze strony podsumowania, NIE zapisuj identyfikatora ID pakietu pakunku, XCode dodaje go automatycznie. I ukrywa to na stronie podsumowania, ponieważ jest to, cóż, oprogramowanie Apple. – mentat

+0

Mam pytanie uzupełniające: czy Twoje aplikacje mają taki sam identyfikator identyfikacyjny pakietu/dewelopera? Lub po prostu użyłeś Entitlements.plist, aby udostępnić dane między grupami keychain? – radj

13

Właściwie nie jest to trudne. Proszę postępować zgodnie z instrukcjami.

Apl1:

  1. Otwórz App Zdolności docelowych i umożliwić Brelok Udostępnianie.
  2. Dodaj identyfikator. (np .: com.example.sharedaccess)
  3. Dodaj "UICKeyChainStore" do swojego projektu.
  4. Upewnij się, że identyfikator Twojej drużyny został dodany do projektu App1.
  5. Dodaj Security.framework do swojego projektu App1.
  6. I dodaj te kody gdzieś, czego potrzebujesz.

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

Apl2:

  • Otwórz App Zdolności docelowych i umożliwić Brelok Udostępnianie.
  • Dodaj identyfikator. (np .: com.example.sharedaccess)
  • Dodaj "UICKeyChainStore" do swojego projektu.
  • Upewnij się, że identyfikator Twojej drużyny został dodany do projektu App2.
  • Dodaj Security.framework do swojego projektu App2.
  • I dodaj te kody gdzieś, czego potrzebujesz.

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"]; 
    
  • Twoje TeamIDs powinna być taka sama dla obu projektów.

  • Próbowałem wykonać te kroki na prawdziwym urządzeniu iPhone .
  • Próbowałem również wykonać te kroki z automatycznym i profilem zaopatrzenia iOs Development.
  • Moje identyfikatory pakietów aplikacji były następujące: com.example.app1, com.example.app2.
+2

Pamiętaj, że "Jak widzisz, nie określamy grupy dostępu, domyślnie wybierze pierwszą grupę dostępu określoną na liście Entitlements.plist podczas pisania i będzie przeszukuj wszystkie grupy dostępu, gdy żadna nie jest określona. " – onmyway133

+0

@alicanbatur, świetnie! Jedna rzecz, którą należy zauważyć, powyższy proces nie zadziałał, jeśli "usługa" nie została określona. – sabiland

+0

oszczędzasz mi dużo @alicabatur. Dzięki. – Sanju

Powiązane problemy