我发现 Xcode 8 存在一个问题,即每个方案未能正确地引用.entitlements文件。基本上,我的Debug .entitlements文件被引用到了Release方案中。这会导致问题,因为我们实现了新的富通知逻辑,并且它需要使用应用组。
我正在使用两个不同的团队(开发和生产),因此将有两个特定的应用组。
我发现 Xcode 8 存在一个问题,即每个方案未能正确地引用.entitlements文件。基本上,我的Debug .entitlements文件被引用到了Release方案中。这会导致问题,因为我们实现了新的富通知逻辑,并且它需要使用应用组。
我正在使用两个不同的团队(开发和生产),因此将有两个特定的应用组。
我找到了一个解决方案。创建一个.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中设置相同的.entitlements文件,以Signing > Code Signing Entitlements设置相同的.entitlements文件,为APS_ENVIRONMENT和APP_GROUP添加用户定义的设置,并针对每个目标设置正确的组。
因此,基于目标,Xcode将使用您为APS_ENVIRONMENT和APP_GROUP设置的内容。
您也可以在plist中执行此操作...今天进行了一些惊人的清理工作。
PROJECT_APP_GROUP
的项目级用户定义设置,用于应用程序组名称。info.plist
文件中设置一个变量。Then access the correct app group at runtime by getting the APP_GROUP
variable from your target's info.plist
file.
+ (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
}