Xcode8:每个scheme的权限不同导致错误

Xcode 8: different entitlements for each scheme causing errors

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

我使用两个不同的团队(开发和生产),因此会有两个特定的应用程序组。

我找到了解决办法。制作一个 .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 中执行此操作...今天做了一些惊人的清理工作。

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

我们的解决方案是:

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

  1. 通过转到项目 -> 构建设置,单击“+”按钮,然后选择 "Add User-Defined Setting."[=,为应用程序组名称定义名为 PROJECT_APP_GROUP 的项目级用户定义设置43=]

  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
}