containerURLForSecurityApplicationGroupIdentifier获取nil值

时间:2014-03-22 07:53:26

标签: ios ipad ios7 nsfilemanager nsurl

我正在制作两个与一个文件通信的iPad应用程序,并从一个文件中获取所有数据。我搜索并找到这个“containerURLForSecurityApplicationGroupIdentifier”,我们可以在其中创建组和存储。我写了下面的代码。在权利文件中我写

<?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>

在Code中我写这个

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

但是storeUrl我得到nil值。

4 个答案:

答案 0 :(得分:5)

Xcode6(目前处于测试阶段)强制共享文件夹ID以&#34; group开头。&#34;

共享我的CoreData商店适合我使用以下URL,Xcode6 / iOS8都是beta。

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

一旦Xcode6发布,似乎stevesliva链接的文档将被淘汰

答案 1 :(得分:2)

好吧,我在自己的代码中验证了它。团队标识符显示在库/组容器的子目录中,因此您实际上需要将其包含在您的代码中:

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

我不确定的是,这是否是一个必需的名称 - 它不是非常用户友好 - 或者是否是Apple建议使其超级独特的。

正如上面的评论中所提到的,这是从Apple的Application Sandbox Design Guide - Application Group Container Directory:

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

答案 2 :(得分:1)

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

[NSFileProviderManager defaultManager] .documentStorageURL

答案 3 :(得分:-5)

确保您使用相同的配置文件对您的应用和扩展程序进行签名!