Keychain组访问我现有应用程序之间共享数据

msk*_*msk 22 iphone keychain ipad ios ios5

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

*keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Any string" accessGroup:<string representing access group>];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有没有办法可以在文件中添加所有应用程序的捆绑种子ID,并在项目中使用该文件构建所有应用程序来实现此目的?我知道"keychain-access-groups",我是否需要创建一个plist文件并在其中添加所有应用程序的bundle seed ID?

感谢这方面的任何帮助.

Con*_*has 50

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

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

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

共享密钥链访问的主要先决条件是所有应用程序都具有公共捆绑种子ID.要清楚这意味着记住App ID由两部分组成:

<Bundle Seed ID> . <Bundle Identifier>
Run Code Online (Sandbox Code Playgroud)

捆绑种子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
Run Code Online (Sandbox Code Playgroud)

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

ABC1234DEF.amazingAppFamily
Run Code Online (Sandbox Code Playgroud)

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

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

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

[searchDictionary setObject: @"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];
Run Code Online (Sandbox Code Playgroud)

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

来源:使用你的面包


Lol*_*Run 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
Run Code Online (Sandbox Code Playgroud)

查看UIPasteboard文档以获取更多信息.在遇到麻烦的情况下,我会在将它用于我的商店应用程序后回来