web-dev-qa-db-ja.com

既存のアプリケーション間でデータを共有するためのキーチェーングループアクセス

多くのiOSアプリケーションがAppStoreにあります。アプリの次のバージョンでは、KeyChainで共有するすべてのアプリケーションのデータを保持したいと思います。私の知る限り、AppleのKeychainItemWrapperクラスで同じキーチェーンアクセスグループを提供する必要があります。

*keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Any string" accessGroup:<string representing access group>];

私はカスタムURLについて知っていますが、データを永続化したいので、それは役に立ちません。

プロビジョニングポータルから確認できるように、すべてのアプリケーションに異なるバンドルシードIDがあります。共有キーチェーンアクセスの主な前提条件は、すべてのアプリケーションに共通のバンドルシードIDがあることです。

今私の質問は、このシナリオでキーチェーンを使用してこれらのすべてのアプリケーション間でデータを共有できることをどのように確認するのですか?

すべてのアプリケーションのバンドルシードIDを、機能を損なうことなくプロビジョニングプロファイルポータルから変更することはできますか(非常に多くのアプリがあるため、回避したいのですが)。

これを達成するために、ファイル内のすべてのアプリのバンドルシードIDを追加し、プロジェクトでそのファイルを使用してすべてのアプリをビルドする方法はありますか? 「keychain-access-groups」について知っています。plistファイルを作成して、その中のすべてのアプリケーションのバンドルシードIDを追加する必要がありますか?

この点で助けを感謝します。

22
msk

異なるバンドルシードID(バンドル識別子の前にある10文字の英数字、XXXXXXXXXX.com.company.application)、あなたはアクセスグループを共有できません。これはApple側の制限であり、回避することはできません。安全にデータを共有する別の解決策を見つけることをお勧めします(おそらくデバイスの外部、サーバー上ですが、iCloudには同じ制限があるためです)。

キーチェーンアクセスグループに関する一般情報:

IPhone OS 3.0以降、一連のアプリケーション間でデータを共有できるようになりました。これにより、無料/プレミアムアプリケーションの共通の道筋に従う場合、またはいくつかの共通のアカウント設定を共有する必要がある関連するアプリケーションのセットがある場合に、より良いユーザーエクスペリエンスを提供できます。

共有キーチェーンアクセスの主な前提条件は、すべてのアプリケーションに共通のバンドルシードIDがあることです。これが何を意味するのかを明確にするために、アプリIDは2つの部分で構成されていることに注意してください。

<Bundle Seed ID> . <Bundle Identifier>

バンドルシードIDは、(App Store内で)一意の10文字の文字列であり、最初にApp IDを作成したときにApple=によって生成されます。バンドルIDは通常、逆ドメイン名に設定されますアプリを識別する文字列(例:com.yourcompany.appName)これは、XcodeのアプリケーションInfo.plistファイルで指定するものです。

そのため、既存のアプリとキーチェーンアクセスを共有できるアプリを作成する場合は、必ず既存のアプリのバンドルシードIDを使用する必要があります。これは、iPhoneプロビジョニングポータルで新しいアプリIDを作成するときに行います。新しい値を生成する代わりに、以前のすべてのバンドルシードIDのリストから既存の値を選択します。

注意点の1つは、バンドルIDにワイルドカードを使用してプロビジョニングプロファイルを作成できることですが、それを使用してアプリ間で共有キーチェーンアクセスを機能させることはできませんでした。完全に指定された(ワイルドカードなしの)識別子で正常に動作します。他の多くのAppleプッシュ通知やアプリ内購入などのサービスにもこの制限があるため、おそらく驚くべきことではありませんが、キーチェーンアクセスについて文書化されているのはまだわかりません。

共通のバンドルシードIDを使用してプロビジョニングプロファイルを設定すると、後は非常に簡単です。まず最初に、使用したいキーチェーンアクセスグループを登録します。キーチェーンアクセスグループの名前は、バンドルシードIDで始まる限り、ほとんど何でもかまいません。たとえば、次の2つのアプリケーションがあるとします。

ABC1234DEF.com.useyourloaf.amazingApp1

ABC1234DEF.com.useyourloaf.amazingApp2

共通のキーチェーンアクセスグループを次のように定義できます。

ABC1234DEF.amazingAppFamily

アプリケーションがこのグループにアクセスできるようにするには、xCodeを使用してプロジェクトに資格plistファイルを追加する必要があります。 [追加]-> [新しいファイル]を使用し、[iPhone OSコード署名]セクションから[資格]テンプレートを選択します。ファイルには好きな名前を付けることができます(例:KeychainAccessGroups.plist)。ファイルに、keychain-access-groupsという名前の新しい配列項目を追加し、選択したキーチェーンアクセスグループの値を使用して配列に項目を作成します。

注:アプリのアドホック配布を作成する場合(この場合、このオプションをオフにする必要があります)でない限り、資格ファイルでデフォルトで作成されるget-task-allow項目を変更しないでください。

バンドルシードIDを共有するすべてのアプリについて、同じ手順を繰り返して、アプリがキーチェーングループにアクセスできるようにする必要があります。このグループの値を実際に格納および取得するには、キーチェーンサービスに引数として渡されるディクショナリに値を追加する必要があります。シンプルなiPhoneキーチェーンアクセスに関する前の投稿の例を使用すると、検索辞書は次の追加項目を取得します。

[searchDictionary setObject: @"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];

最後のコメントとして、共有キーチェーンアクセスグループを使用しても、アプリケーションのプライベートキーチェーンに値を保存することはできます。 Apple GenericKeychainサンプルアプリケーションは、データをプライベートキーチェーンとグループキーチェーンに格納する2つのアプリケーションを構築します。

ソース: se Your Loaf

51

これでUIPasteboardを使用できます

//First app, install->run->close->delete
UIPasteboard* board = [UIPasteboard pasteboardWithName:@"com.company.wtv" create:YES];
board.persistent=YES;// persistent to make what you write persist after your app closes, or gets deleted.
[board setValue:@"ccccc" forPasteboardType:@"com.company.wtv.sharedValue"];

//Second app, installed after first one is deleted and ran this one... While bundle identifier and bundle seed different (i tried it on adhoc, not really releasing the app, but i htink the same)
NSData* result=nil;
NSString*resultStr=nil;
result =[board valueForPasteboardType:@"com.company.wtv.sharedValue"];
resultStr=[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];// I got resultStr containing ccccc

詳細については、UIPasteboardのドキュメントを確認してください。問題が発生した場合に備えて、これを自分のストアアプリに使用した後に戻ってきます

6
LolaRun