web-dev-qa-db-ja.com

iOSアプリケーション間でキーチェーンデータを共有する方法

答えを学ぶのにかなり時間がかかった問題について説明しています。

" GenericKeychain "の例は、initでaccessGroupを使用するときに、アプリケーション間でキーチェーンデータを共有するためのラッパーを提供するのに適しています。

ただし、これをアプリに実装すると、あいまいなエラーコード(検索に永遠に時間がかかる)-25243が生成されました。つまり、アクセス制御がありません。

Appleのサンプルアプリ(GenericKeychain)をiPadで実行して、同じエラーを取得しました。え?

Appleのドキュメントは、これを達成するために必要なものを提供できませんか?

55
GtotheB

Web全体を掘り下げた後、答えを見つけました。 KeychainItemWrapperクラスを構築するときに使用するアクセスグループは、アプリケーションのEntitlements.plistファイルの「keychain-access-groups」セクションでも指定する必要があります。

keychain-access-groups」と表示されるのは、今ではほとんど明らかです。しかし、私はそこを見ることすら知りませんでした。これが他の人に役立つことを願っています。

53
GtotheB

実際、それは難しくありません。手順に従ってください。

App1:

  1. アプリのターゲット機能を開き、キーチェーン共有を有効にします。
  2. 識別子を追加します。 (例:com.example.sharedaccess)
  3. プロジェクトに「 ICKeyChainStore 」を追加します。
  4. App1プロジェクトにチームIDが追加されていることを確認してください。
  5. Security.frameworkをApp1プロジェクトに追加します。
  6. そして、これらのコードを必要な場所に追加します。

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

App2:

  • アプリのターゲット機能を開き、キーチェーン共有を有効にします。
  • 識別子を追加します。 (例:com.example.sharedaccess)
  • プロジェクトに「 ICKeyChainStore 」を追加します。
  • App2プロジェクトにチームIDが追加されていることを確認してください。
  • Security.frameworkをApp2プロジェクトに追加します。
  • そして、これらのコードを必要な場所に追加します。

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"];
    
  • TeamIDsは両方のプロジェクトで同じでなければなりません。

  • 実際のiPhoneデバイスでこれらの手順を試しました。
  • また、AutomaticおよびiOs Developmentプロビジョニングプロファイルでこれらの手順を試しました。
  • 私のアプリのバンドル識別子は、com.example.app1、com.example.app2のようなものでした。
14
alicanbatur