24

我在 AppStore 上有很多 iOS 应用程序。现在对于下一个版本的应用程序,我想为每个应用程序保留一段数据以在 KeyChain 中共享。据我所知,我需要在 Apple 的 KeychainItemWrapper 类中提供相同的 Keychain 访问组。

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

我知道自定义 URL,它没有用,因为我希望数据是持久的。

从供应门户中可以看到,我所有的应用程序都有不同的捆绑种子 ID。我知道共享钥匙串访问的主要先决条件是所有应用程序都有一个共同的捆绑种子 ID。

现在我的问题是如何确保在这个场景中我可以使用 Keychain 在所有这些应用程序之间共享数据?

是否可以通过配置文件门户更改所有应用程序的捆绑种子 ID,而不会对任何功能造成任何损害(尽管我想避免这种情况,因为应用程序太多)。

有没有办法可以在一个文件中添加所有应用程序的捆绑种子 ID 并在项目中使用该文件构建所有应用程序来实现这一点?我知道“钥匙串访问组”,我需要创建一个 plist 文件并在其中添加所有应用程序的捆绑种子 ID 吗?

感谢这方面的任何帮助。

4

3 回答 3

52

如果您有不同的捆绑种子 ID(捆绑标识符前面的十个字母数字字符,即 中的 X XXXXXXXXXX.com.company.application),则无法共享访问组。这是对 Apple 的限制,不允许绕过它。我建议您找到另一种安全共享数据的解决方案(可能在设备外部,在服务器上,但不是 iCloud,因为它具有相同的限制)。

有关钥匙串访问组的一般信息:

从 iPhone OS 3.0 开始,可以在一系列应用程序之间共享数据。如果您遵循免费/高级应用程序的通用路径,或者您有一组需要共享一些通用帐户设置的相关应用程序,这可以提供更好的用户体验。

共享钥匙串访问的主要先决条件是所有应用程序都有一个共同的捆绑种子 ID。要清楚这意味着什么,请记住 App ID 由两部分组成:

<Bundle Seed ID> . <Bundle Identifier>

捆绑种子 ID 是 Apple 在您首次创建 App ID 时生成的唯一(在 App Store 中)十个字符的字符串。捆绑标识符通常设置为标识您的应用程序的反向域名字符串(例如com.yourcompany.appName),并且是您在 Xcode 中的应用程序 Info.plist 文件中指定的内容。

因此,当您想要创建一个可以与现有应用程序共享钥匙串访问权限的应用程序时,您需要确保使用现有应用程序的捆绑种子 ID。当您在 iPhone Provisioning Portal 中创建新的 App ID 时,您会执行此操作。您可以从所有以前的捆绑种子 ID 列表中选择现有值,而不是生成新值。

需要注意的是,虽然您可以为捆绑标识符创建一个带有通配符的配置文件,但我从未能够在使用它的应用程序之间实现共享钥匙串访问。它适用于完全指定的(无通配符)标识符。由于许多其他 Apple 服务(例如推送通知和应用内购买)也有此限制,因此这可能不足为奇,但我还没有找到有关钥匙串访问的文档。

一旦你用一个通用的捆绑种子 ID 设置了你的配置文件,剩下的就很容易了。您需要做的第一件事是注册您要使用的钥匙串访问组。钥匙串访问组几乎可以命名为任何您想要的名称,只要它以捆绑种子 ID 开头即可。例如,如果我有两个应用程序如下:

ABC1234DEF.com.useyourloaf.amazingApp1

ABC1234DEF.com.useyourloaf.amazingApp2

我可以定义一个通用的钥匙串访问组,如下所示:

ABC1234DEF.amazingAppFamily

要使应用程序能够访问该组,您需要使用 xCode 将权利 plist 文件添加到项目中。使用 Add -> New File 并从 iPhone OS Code Signing 部分选择 Entitlements 模板。您可以将文件命名为您喜欢的任何名称(例如KeychainAccessGroups.plist)。在文件中添加一个名为 keychain-access-groups 的新数组项,并使用我们选择的钥匙串访问组的值在数组中创建一个项:

注意:请勿更改权利文件中默认创建的 get-task-allow 项,除非您正在创建应用程序的 Ad-Hoc 分发(在这种情况下,您应该取消选中此选项)。

应该对共享捆绑种子 ID 的所有应用程序重复相同的过程,以使它们能够访问钥匙串组。要从该组中实际存储和检索值,需要向作为参数传递给钥匙串服务的字典添加一个附加值。使用上一篇文章中关于简单 iPhone 钥匙串访问的示例,搜索字典会获得以下附加项:

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

最后一条评论,使用共享的钥匙串访问组也不会阻止您将值存储在应用程序的私有钥匙串中。Apple GenericKeychain 示例应用程序构建了两个应用程序,它们都将数据存储在私有和组密钥链中。

资料来源:用你的面包

于 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 回答