钥匙串组访问可以在我现有的应用程序之间共享数据

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

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

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

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

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

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

有没有一种方法可以在文件中添加所有应用程序的捆绑种子ID,并在项目中使用该文件构build所有应用程序来实现此目的? 我知道“钥匙串访问组”,我是否需要创build一个plist文件,并添加所有应用程序的包种子ID呢?

感谢在这方面的帮助。

如果您具有不同的捆绑种子ID (捆绑标识符前面的十个字母数字字符,即XXXXXXXXXX.com.company.application的X), 则不能共享访问组。 这是对苹果的限制,并规避不允许。 我build议你find安全共享数据的另一个解决scheme(可能在设备之外,在服务器上,但不是iCloud,因为它有相同的限制)。

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

自iPhone OS 3.0以来,可以在一系列应用程序之间共享数据。 如果您遵循免费/付费应用程序的通用path,或者您有一组需要共享某些常用帐户设置的相关应用程序,则这可以提供更好的用户体验。

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

 <Bundle Seed ID> . <Bundle Identifier> 

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

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

一个警告,虽然你可以创build一个供应configuration文件与通配符的捆绑标识符,我从来没有能够获得共享钥匙串访问使用它的应用程序之间工作。 它完全指定(无通配符)标识符正常工作。 由于一些其他的苹果服务,如推送通知和应用程序内购买也有这个限制也许它不应该是一个惊喜,但我还没有find这个钥匙链访问logging。

一旦你的configuration文件设置了一个共同的捆绑种子ID,其余的很容易。 您需要做的第一件事就是注册您要使用的钥匙串访问组。 钥匙串访问组可以命名几乎任何你想要的,只要它从捆绑种子ID开始。 所以例如,如果我有两个应用程序,如下所示:

 ABC1234DEF.com.useyourloaf.amazingApp1 ABC1234DEF.com.useyourloaf.amazingApp2 

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

 ABC1234DEF.amazingAppFamily 

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

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

对于共享捆绑种子ID的所有应用程序,都应该重复相同的过程,以使其能够访问钥匙串组。 要实际存储和检索来自这个组的值,需要向作为parameter passing给钥匙串服务的字典添加额外的值。 使用简单的iPhone钥匙串访问上一篇文章中的示例search字典获取以下附加项目:

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

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

来源: 使用你的面包

现在你可以使用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文档获取更多信息。 在我的商店应用程序中使用此function后,我会回来,以防出现问题

放入AppStore之后,您不能更改应用的软件包ID。 您也无法使应用程序读取另一个应用程序(使用不同的包ID)放置的钥匙串中的信息。 解决scheme:您将需要一个权利,您可以访问几乎所有的数据。