【问题标题】:Xcode 8: different entitlements for each scheme causing errorsXcode 8:导致错误的每个方案的不同权利
【发布时间】:2017-01-20 20:10:38
【问题描述】:

我发现 Xcode 8 存在一个问题,即每个方案都没有正确引用 .entitlements 文件。基本上,我的 Debug .entitlements 文件被我的 Release 方案引用。这导致了一个问题,因为我们实现了新的丰富推送通知逻辑,并且需要使用应用组。

我正在使用两个不同的团队(开发和生产),所以会有两个特定的应用组。

【问题讨论】:

  • 我也遇到了这个问题。尽管在 CODE_SIGN_ENTITLEMENTS 构建设置中正确配置,我们的 QA 方案仍试图将 production 值用于 aps-environment 权利。
  • @AlbertBori 检查我的答案...它会帮助你。

标签: ios xcode8 entitlements ios-app-group code-signing-entitlements


【解决方案1】:

我找到了解决方案。制作一个 .entitlements 文件添加以下内容:

<key>aps-environment</key>
<string>$(APS_ENVIRONMENT)</string>
<key>com.apple.security.application-groups</key>
<array>
    <string>$(APP_GROUP)</string>
</array>

然后在 Target > Build settings 在 Signing > Code Signing Entitlements 中设置相同的 .entitlements 文件 为 APS_ENVIRONMENT 和 APP_GROUP 添加用户定义的设置,为每个目标设置正确的组。

因此,基于目标 Xcode 将使用您为 APS_ENVIRONMENT 和 APP_GROUP 设置的内容。

您也可以在 plist 中执行此操作...今天做了一些惊人的清理工作。

【讨论】:

  • 我在过去一年左右使用了这个解决方案,但发现 Apple 开发中心偶尔会显示一些捆绑 ID 与错误的组相关联,这可能会破坏手动代码设计。很多时候我不得不去那里纠正这个关联(只是为了以后再改变它)。很难理解为什么/如何发生这种情况,可能取决于我的设置,但直觉是 Xcode 正在做自动的事情并且不喜欢这个变量。
  • @蒂姆沃尔什。我想你可能已经在某处定义了 $(APP_GROUP) 和 $(APS_ENVIRNMENT) 。你能帮忙看看他们在哪里吗?或者它们是否默认可用
  • @TejasSherdiwala 你找到答案了吗?我也有兴趣。
  • @Fikret 您需要在应用程序的构建设置中将变量 APS_ENVIRONMENT 和 APP_GROUP 设置为用户定义的设置
【解决方案2】:

虽然 Tim 的解决方案主要对我有用,但 Xcode 很不高兴,并说自动配置无法解决权利文件的问题。我不认为它喜欢这个变量。

我们的解决方案是:

  1. 在每个需要访问的目标上启用所有应用组。

  1. 通过转到项目 -> 构建设置,单击“+”按钮并选择“添加用户定义的设置”,为应用组名称定义一个名为 PROJECT_APP_GROUP 的项目级用户定义设置。

  1. info.plist 文件中为每个需要访问您的应用程序组的目标设置一个变量。

  1. 然后通过从目标的info.plist 文件中获取APP_GROUP 变量,在运行时访问正确的应用组。

    + (NSString *)appGroupIdentifier
    {
        // this method returns the app group identifier by fetching it from the info.plist file.
        // this string is dynamic based on build scheme. for instance group.ourApp vs. group.ourApp-dev
        return [[[NSBundle mainBundle] infoDictionary] valueForKey:@"APP_GROUP"];
    }
    

现在我想起来了,如果您为每个构建都设置了预处理器宏,那么执行以下操作可能会更容易:

+ (NSString *)appGroupIdentifier
{
#ifdef BUILD_DEV
    return @"group.myApp-dev";
#elif BUILD_STAGING
    return @"group.myApp-staging";
#else
    return @"group.myApp";
#endif
}

【讨论】:

  • 这种方法的缺点是您的应用程序同时“使用”所有 3 个组。当然,您正在控制您的代码正在查看哪一个,但 iOS 认为所有这些都在以某种方式使用。这意味着当您删除开发应用程序以从全新安装中测试某些内容时,它不会清空应用程序组 - 您还必须删除暂存和生产应用程序。
  • @KieranHarper 你说得对,我们在经过一些测试后发现了这一点,最终采用了更像 Tim 的方法。
猜你喜欢
  • 2017-09-30
  • 2017-01-20
  • 2017-03-15
  • 2018-02-23
  • 1970-01-01
  • 2017-01-15
  • 2016-03-14
  • 2013-09-20
相关资源
最近更新 更多