Xcode 8:每个方案的不同权限引起错误。

13

我发现 Xcode 8 存在一个问题,即每个方案未能正确地引用.entitlements文件。基本上,我的Debug .entitlements文件被引用到了Release方案中。这会导致问题,因为我们实现了新的富通知逻辑,并且它需要使用应用组。

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


1
我也遇到了这个问题。尽管在“CODE_SIGN_ENTITLEMENTS”构建设置中正确配置,但我们的QA方案仍试图使用我们的“production”值作为“aps-environment”授权。 - Albert Bori
@AlbertBori,请检查我的答案...它会帮助你。 - Tim Walsh
2个回答

30

我找到了一个解决方案。创建一个.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中执行此操作...今天进行了一些惊人的清理工作。


我过去一年左右一直在使用这个解决方案,但发现偶尔苹果开发中心会显示几个捆绑标识符与错误组相关联,这可能会破坏手动代码签名。经常需要我进去更正关联(只是稍后又改变)。很难理解为什么/如何会发生这种情况,可能取决于我的设置,但直觉告诉我Xcode正在执行自动操作并且不喜欢该变量。 - Kieran Harper
@Tim Walsh。我认为你可能在某个地方定义了$(APP_GROUP)和$(APS_ENVIRNMENT)。你能帮忙找一下它们在哪里吗?或者它们是默认可用的吗? - Tejas Sherdiwala
@TejasSherdiwala,你找到答案了吗?我也很感兴趣。 - Fikret
@Fikret 你需要在应用程序的构建设置中将变量APS_ENVIRONMENT和APP_GROUP设置为用户定义设置。 - Tim Walsh

3
尽管Tim的解决方案对我大部分都有效,但Xcode却出现了问题,并表示自动配置无法解决授权文件的问题。我认为它不喜欢这个变量。
我们的解决方案是:
1. 在需要访问的每个目标上启用所有应用程序组。

Enable all app groups

  1. 前往项目->构建设置,点击“+”按钮并选择“添加用户定义设置”,定义一个名为PROJECT_APP_GROUP的项目级用户定义设置,用于应用程序组名称。

User-Defined PROJECT_APP_GROUP setting

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

enter image description here

  1. 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"];
    }
    

OR

现在我想,如果您为每个构建设置了预处理器宏,那么做起来可能更容易:

+ (NSString *)appGroupIdentifier
{
#ifdef BUILD_DEV
    return @"group.myApp-dev";
#elif BUILD_STAGING
    return @"group.myApp-staging";
#else
    return @"group.myApp";
#endif
}

1
这种方法的缺点是您的应用程序同时“使用”了所有3个组。当然,您可以控制代码查看哪一个,但iOS认为所有组都以某种方式在使用中。这意味着,当您删除开发应用程序以从新安装测试某些内容时,它不会清空应用程序组 - 您还必须删除暂存和生产应用程序。 - Kieran Harper
@KieranHarper,你说得对,我们在测试后发现了这一点,并最终采取了类似Tim的方法。 - Dylan Hand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接