我发现 Xcode 8 存在一个问题,其中 .entitlements 文件没有为每个方案正确引用。基本上,我的 Debug .entitlements 文件被我的 Release 方案引用。这导致了一个问题,因为我们实现了新的 Rich 推送通知逻辑并且需要使用 App 组。
我正在使用两个不同的团队(开发和生产),所以会有两个特定的应用程序组。
我发现 Xcode 8 存在一个问题,其中 .entitlements 文件没有为每个方案正确引用。基本上,我的 Debug .entitlements 文件被我的 Release 方案引用。这导致了一个问题,因为我们实现了新的 Rich 推送通知逻辑并且需要使用 App 组。
我正在使用两个不同的团队(开发和生产),所以会有两个特定的应用程序组。
我找到了解决方案。制作一个 .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 中执行此操作...今天进行了一些惊人的清理。
虽然 Tim 的解决方案主要对我有用,但 Xcode 很不高兴,并表示自动配置无法解决权利文件的问题。我不认为它喜欢这个变量。
我们的解决方案是:
PROJECT_APP_GROUP
通过转到 Project -> Build Settings,单击“+”按钮,然后选择“Add User-Defined Setting”,为应用程序组名称定义项目级用户定义设置。info.plist
在文件中为需要访问您的应用组的每个目标设置一个变量。然后通过从目标文件中获取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
}