我在AppStore上有很多iOS应用程序。现在,对于下一版本的应用程序,我想为每个要在KeyChain中共享的应用程序保留一段数据。据我所知,我需要在Apple的KeychainItemWrapper类中提供相同的Keychain访问组。
*keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Any string" accessGroup:<string representing access group>];
我知道自定义网址并没有用,因为我希望数据是持久的。
我可以从配置门户网站看到所有应用程序都有不同的捆绑种子ID。我知道共享密钥链访问的主要先决条件是所有应用程序都有一个共同的捆绑种子ID。
现在我的问题是如何确保在这个场景中我可以使用Keychain在所有这些应用程序之间共享数据?
是否可以通过Provisioning配置文件门户更改所有应用程序的捆绑种子ID,而不会对任何功能造成任何损害(尽管我想避免这种情况,因为有太多的应用程序)。
有没有办法可以在文件中添加所有应用程序的捆绑种子ID,并在项目中使用该文件构建所有应用程序来实现此目的?我知道“keychain-access-groups”,我是否需要创建一个plist文件并在其中添加所有应用程序的bundle seed ID?
感谢这方面的任何帮助。
答案 0 :(得分:51)
如果您有不同的捆绑种子ID (捆绑标识符前面的十个字母数字字符,XXXXXXXXXX.com.company.application
中的X),则无法共享访问组。这是对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文件添加到项目中。使用添加 - &gt;新建文件,然后从iPhone OS代码签名部分选择权利模板。您可以根据需要为文件命名(例如
KeychainAccessGroups.plist
)。在文件中添加一个名为keychain-access-groups的新数组项,并使用我们选择的keychain访问组的值在数组中创建一个项:注意:请勿更改权利文件中默认创建的get-task-allow项,除非您要创建应用的Ad-Hoc分布(在这种情况下,您应取消选中此选项)。
对于共享捆绑种子ID的所有应用,应该重复此相同的过程,以使其能够访问密钥链组。要实际存储和检索此组中的值,需要向作为参数传递给密钥链服务的字典添加其他值。使用上一篇文章中的简单iPhone钥匙串访问示例,搜索词典将获得以下附加项:
[searchDictionary setObject: @"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];
使用共享钥匙串访问组的最后一条评论也不会阻止您将值存储在应用程序私钥钥匙链中。 Apple GenericKeychain示例应用程序构建了两个应用程序,它们都将数据存储在私有和组密钥链中。
答案 1 :(得分: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文档以获取更多信息。 我将在使用此商店应用程序后回来,以防出现问题
答案 2 :(得分:-2)
在将应用程序的包ID放入AppStore后,您无法更改它。您也无法让应用程序读取另一个应用程序(具有不同的包ID)放在那里的钥匙串中的信息。解决方案:您需要一个权利,您几乎可以访问所有数据。