24

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

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

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

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

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

機能に害を及ぼすことなく、Provisioning profile portal を介してすべてのアプリケーションのバンドル シード ID を変更することは可能ですか?

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

この点で何か助けていただければ幸いです。

4

3 に答える 3

52

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

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

iPhone OS 3.0 以降、アプリケーションのファミリー間でデータを共有することが可能になりました。これにより、無料/プレミアム アプリケーションの共通パスに従う場合、または共通のアカウント設定を共有する必要がある一連の関連アプリケーションがある場合に、ユーザー エクスペリエンスが向上します。

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

<Bundle Seed ID> . <Bundle Identifier>

バンドル シード ID は、(App Store 内で) 一意の 10 文字の文字列で、最初にアプリ ID を作成するときに Apple によって生成されます。バンドル識別子は通常、アプリを識別する逆ドメイン名文字列 (例: 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 Code Signing] セクションから [資格] テンプレートを選択します。ファイルには任意の名前を付けることができます (例: KeychainAccessGroups.plist)。ファイルに keychain-access-groups という名前の新しい配列アイテムを追加し、選択したキーチェーン アクセス グループの値を使用して配列内にアイテムを作成します。

注: アプリのアドホック ディストリビューションを作成する場合を除き、デフォルトで資格ファイルに作成される get-task-allow 項目を変更しないでください (その場合は、このオプションのチェックを外す必要があります)。

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

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

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

出典:あなたのローフを使用してください

于 2012-08-06T17:11:23.767 に答える
6

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 のドキュメントを参照してください。困ったときはストアアプリで使ってからまた来ます

于 2012-12-20T15:54:52.640 に答える
-1

アプリが AppStore に配置された後は、アプリのバンドル ID を変更することはできません。また、別のアプリ (別のバンドル ID を持つ) によってそこに置かれたキーチェーンからの情報をアプリに読み取らせることもできません。解決策: 事実上すべてのデータにアクセスできる権利が必要です。

于 2012-08-13T06:04:06.507 に答える