2014-11-04 63 views
18

语境

随着iOS8上和扩展苹果推出应用程序组容器(more info here)。containerURLForSecurityApplicationGroupIdentifier返回nil在iOS模拟器

问题

我们使用它来NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:方法。它适用于AppStore上的生产(包括iOS8和iOS7)。问题在于我们的团队更新到Xcode 6.1 (6A1052d),方法在模拟器上返回nil

我们搜索了很多,但我们没有设法找到任何线索。即使这questionthis one这里不适用。

TLDR:问题

NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:方法适用于您的模拟器?有什么办法解决这个问题吗?

+0

您找到的任何解决方案? – 2015-02-04 05:40:59

+0

我正在模拟器上使用WatchOS2和iOS9。同样的问题发生在我身上,但间歇性地发生。我必须每20分钟重置/擦除/重新启动一切。为什么? – Josh 2016-01-28 11:14:51

回答

14

我能够在我身边解决这个问题。文档说

您的应用程序必须为指定的应用程序组拥有com.apple.security.application-group权利 。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/containerURLForSecurityApplicationGroupIdentifier

在我的应用程序的某个时刻,我已经从我的应用程序的目标/构建设置/代码签名/代码签名权利删除的权利文件。调试和发布都必须包含YOUR_APP.entitlements文件。我的调试不包括它,所以它不能在模拟器上工作

0

方法containerURLForSecurityApplicationGroupIdentifier:在我的模拟器中工作。但是,如果我删除组文件夹中的所有文件(万一用户在我的应用程序中执行注销),则该方法在Xcode 6.1中的下一个RUN中返回nil。我用Xcode 6.2和iOS SDK 8.2 Beta测试了它,但它不起作用。

该代码在真实设备上运行良好。

我也试过上述解决方案没有成功。

0

对我来说,我的iOS团队配置文件(它不需要在模拟器中运行)有一些混乱。

为了在我的iPhone上运行我的应用程序,我必须先为调试环境重新配置iOS团队配置文件。调用containerURLForSecurityApplicationGroupIdentifier:在设备上工作得非常好。之后我回到了模拟器,并且 - 你去了 - 它再次运行。

18

方法containerURLForSecurityApplicationGroupIdentifier:适用于设备和模拟器。

如果您已经设置了要共享数据以支持组的两个目标(例如Target和WatchKit扩展),并且它一直返回,,您可能需要检查目标设置。

  1. 目标设置>常规>团队>yourCompany签约团队应该在这里选择。如果有警告和解决这个问题按钮,善于 并击中它解决这个问题:)

  2. 目标设置>功能>应用论坛>是+显示您 group.com。 yourcompany.yourapp.sharedContainter组名称(“sharedContainer”是我的选择名称)被选中,并且处于黑色 (而不是红色)。如果它是红色或有警告并修复此问题 按钮,请更新组或创建一个不同的组。

  3. 目标设置>构建设置>代码签名证书>代码签名 应享权利:指向您的权利为Debug和 版本(类似yourApp/yourApp.entitlements

  4. 目标设置文件>构建设置>代码签名>代码签名 身份:确保身份是上面选择的团队的一部分。我用iOS Developer

  5. 目标设置>构建设置>代码签名>配置 配置文件:如上所述,确保您使用的PP是团队 必需的。我将它设置为自动

检查那些为两个目标共享数据。

我希望它能帮助

+0

我的问题是捆绑ID,我有相同的应用程序捆绑ID和手表应用程序。通常我们需要3个捆绑ID,应用程序,手表应用程序和扩展。 – user281300 2015-04-13 15:26:18

+1

FWIW,我必须明确地选择正确的** Provisioning Profile **,因为它保持_Automatic_失败。 – Pascal 2015-08-16 10:41:55

+0

_Fix Issue_按钮实际上为我解决了这个问题。 – orkoden 2015-08-19 17:00:45

1

我发现containerURLForSecurityApplicationGroupIdentifier可以做真实的设备和模拟器的工作都和Xcode 6.2。我遇到了这个线程,因为我也没有,但现在我发现根本原因是我的'应用程序组'名称的打字错误。

更多,这里是你需要检查列表:

  1. 确保“应用程序组”中创建或者通过Xcode中或Web控制台在https://developer.apple.com
  2. 确保被“启用”的“应用程序组”在“发展”和“生产”的“Web控制台:Identifiers->应用ID”
  3. 确保匹配“供应配置文件”是“主动”
  4. 在两者都含有应用程序和扩展应用程序权利的团体名称应匹配您在步骤1中创建的那个
  5. 确保所有目标的包标识符是一样的,从一个“Web控制台:Identifiers->应用ID
  6. 确保‘所有目标的团队’内与从Web控制台
  7. 使一体化一定要挑选正确的组“能力”标签下对两者都含有应用和推广应用目标,并且没有红色
  8. 通过CMD清理xcode的高速缓存+移位+ K
  9. 重建和祈祷
4

它没有清楚的文件,但我发现了组标识符区分大小写。

0

我发现在我的情况下这个错误的原因是一个文件“.com.apple.mobile_container_manager.metadata.plist”。从这个目录中获得我的文件后,我删除了其中的所有文件。所以这个文件也被删除了。当你删除此文件,应用程序将返回一个nilcontainerURLForSecurityApplicationGroupIdentifier

所以我改变了我的代码如下:

NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YGGroupIdentifier]; 
    NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:[groupPath path] error:nil]; 
    for (NSString *filename in fileArray) { 
     if (![filename hasPrefix:@".com"]) { 
      [fileManager removeItemAtPath:[[groupPath path] stringByAppendingPathComponent:filename] error:nil]; 
     } 
    } 

现在,它的伟大工程,即使是在模拟器。