13

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

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

4

2 回答 2

28

我找到了解决方案。制作一个 .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 Set the same .entitlements file in Signing > Code Signing Entitlements Add User-Defined Setting for APS_ENVIRONMENT 和 APP_GROUP 为每个目标设置正确的组。

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

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

于 2016-09-23T18:14:21.293 回答
3

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

我们的解决方案是:

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

启用所有应用组

  1. PROJECT_APP_GROUP通过转到 Project -> Build Settings,单击“+”按钮,然后选择“Add User-Defined Setting”,为应用程序组名称定义项目级用户定义设置。

用户定义的 PROJECT_APP_GROUP 设置

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

在此处输入图像描述

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

    + (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
}
于 2017-03-17T12:17:37.930 回答