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 很生气,说自动配置无法解决权利文件的问题。我认为它不喜欢这个变量。
我们的解决方案是:
- 在每个需要访问的目标上启用所有应用程序组。
- 通过转到项目 -> 构建设置,单击“+”按钮,然后选择 "Add User-Defined Setting."[=,为应用程序组名称定义名为
PROJECT_APP_GROUP
的项目级用户定义设置43=]
- 在
info.plist
文件中为每个需要访问您的应用组的目标设置一个变量。
然后通过从目标的 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
}
我在 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 很生气,说自动配置无法解决权利文件的问题。我认为它不喜欢这个变量。
我们的解决方案是:
- 在每个需要访问的目标上启用所有应用程序组。
- 通过转到项目 -> 构建设置,单击“+”按钮,然后选择 "Add User-Defined Setting."[=,为应用程序组名称定义名为
PROJECT_APP_GROUP
的项目级用户定义设置43=]
- 在
info.plist
文件中为每个需要访问您的应用组的目标设置一个变量。
然后通过从目标的
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
}