containerURLForSecurityApplicationGroupIdentifier获取零值

我正在制作两个iPad应用程序与一个文件进行通信,并从一个文件中提取所有数据。 我search并find这个“containerURLForSecurityApplicationGroupIdentifier”我们可以创build组和存储在那。 我已经写下面的代码。 在权利文件我写

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.app-sandbox</key> <true/> <key>com.apple.security.application-groups</key> <array> <string>$(TeamIdentifierPrefix)com.xxx.catalogapp.Coredata</string> </array> <key>keychain-access-groups</key> <array> <string>$(AppIdentifierPrefix)com.xxx.catalogapp.Coredata</string> </array> </dict> </plist> 

而在代码我写这个

 NSFileManager* fileManager = [NSFileManager defaultManager]; NSURL* storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"com.xxx.catalogapp.Coredata"]; NSLog(@"%@", storeUrl); 

但是storeUrl我nil价值。

Xcode6(目前处于testing阶段)强制共享文件夹ID以“group”开头。

共享我的CoreData存储为我工作与以下URL与Xcode6 / iOS8两个testing版。

 NSFileManager* fileManager = [NSFileManager defaultManager]; NSURL* storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.XXX"]; 

看起来,只要Xcode6将被发布,stevesliva链接的文档就会过时

那么,我用自己的代码validation它。 团队标识符显示在图书馆/组容器的子目录中,因此您确实需要将其包含在您的代码中:

 NSFileManager* fileManager = [NSFileManager defaultManager]; NSURL* storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"YOURTEAMID.com.xxxxxxxxxxx.catalogapp.Coredata"]; NSLog(@"%@", storeUrl); 

我不确定的是,这是不是一个必需的名称 – 它不是非常用户友好的,或者是苹果推荐使它超级独特的东西。

正如在上面的评论中提到的,这是从苹果的应用程序沙箱devise指南 – 应用程序组容器目录开始:

这些组容器会自动添加到每个应用程序的沙箱容器中,由这些密钥的存在决定,并存储在〜/ Library / Group Containers /中,其中是组的名称。 组名本身必须以您的开发团队ID开始,然后是一段时间。

在iOS 11中,有一个更好的方法来获取共享容器的URL。

[NSFileProviderManager defaultManager] .documentStorageURL

确保您使用相同的configuration文件签署了您的应用程序和您的扩展程序!