在Xcode中配置应用程序组权限字符串?

23
有没有一种简单的方法在Xcode项目中拥有每个配置的应用程序组权限字符串?
我们想要使用“应用程序组”权限在iOS应用程序和今天的扩展之间共享设置,在两个目标中都使用这个权限。
我们遇到的问题是,根据是企业版还是发布版,我们使用不同的束和团队ID来构建应用程序。
当我使用Xcode 6的功能屏幕时,应用程序组显示为红色字体,我看不到如何为每个配置更改字符串。
我认为以下其中一个会起作用,但我不知道应该先尝试哪一个:
1. xcconfig文件 2. 手动创建的权限文件 3. 构建脚本 4. 配置相关的plist条目
建议?

2
从.xcconfig文件覆盖CODE_SIGN_ENTITLEMENTS现在可以在Xcode 8.2.1中正常工作。这在8.0版本中肯定不起作用,可能在8.1版本中也是如此(没有检查过),因此可能情况是一些答案/评论中提到的错误现在已经被修复了。 - Nicholas H.
3个回答

28
您可以为每个配置使用不同的权限文件。这可以在Xcode“生成设置”用户界面中指定,也可以通过生成配置文件(.xcconfig)完成。
示例xcconfig:
CODE_SIGN_ENTITLEMENTS = Debug.entitlements
其中CODE_SIGN_ENTITLEMENTS的值指向此配置的正确权限文件。您可以在Xcode中创建尽可能多的配置。默认情况下,Xcode会创建Debug和Release,您可以添加Enterprise并使用构建配置文件,该文件将CODE_SIGN_ENTITLEMENTS指向适用于Enterprise构建的正确权限文件。
Xcode“功能”用户界面将创建并管理命名为您的生成产品的权限文件。如果需要,您可以直接编辑此文件。
1. 为每个生成配置创建一个XCConfig构建配置文件。对于本示例,我们将只使用Debug和Release,可以很容易地添加自己的生成配置,例如Enterprise。 2. 如上所述,使用相应的CODE_SIGN_ENTITLEMENTS设置填充xcconfig文件。 3. 在项目“信息”用户界面中,将生成配置设置为使用相应的XCConfig文件: 4. 您可以通过查看您的生成产品的代码签名权限生成设置来确认。您应该会看到类似于以下内容:
如果您看到粗体文本,请突出显示该构建设置并单击“删除”。这将删除覆盖xcconfig设置的Xcode生成设置。

5
在Xcode 8中似乎完全失效了。我尝试了直接在“Build Settings”中为每个构建配置设置自定义的entitlements文件,以及使用单独的xcconfig文件。Xcode会记住上一个预期的应用组,并且因为预配资料中的应用组不匹配而导致后续构建失败。我被难住了。 - Adam Swinden
2
@AdamSwinden 我也有同样的问题!这太不可思议了。你找到解决方法了吗? - damirstuhec
@damirstuhec 很不幸,实际上并没有。尽管我发现在构建失败后,如果您删除并重置自定义授权构建设置,Xcode会重新加载它所期望的应用程序组。我发现每次更改构建配置时都必须这样做。 - Adam Swinden
@AdamSwinden 我这里也是同样的问题。:( - Joseph Lin
我们如何在不同的权限/方案中添加多个App组?由于没有单独为Debug和Release方案/权限选择AppGroup的选项,因此该怎么做? - W.S

4
你可以通过“构建设置”来设置这个。与设置不同的包ID的方式相同。
步骤:
1. 添加一个新的“用户定义设置” enter image description here 2. 为每个方案/配置指定“APP_GROUP_ID” enter image description here 3. 测试一下,为你的应用程序创建一个IPA文件并解压它。 4. 检查.app并右键单击,然后选择“显示包内容” 5. 查找授权文件。(如果找不到授权文件,请查找.xcent文件并将扩展名更改为.entitlements) 6. 验证授权文件中的应用程序组值是否是您在第2步中指定的正确应用程序组ID。
干杯!

1
没有记录的原因说明这会起作用。这不是“相同的方式”作为Bundle ID,因为Bundle ID是一个info.plist字段,默认情况下从构建设置中填充。授权字段不是。苹果公司根本没有关于构建设置APP_GROUP_ID的文档。如果这是一个未记录的构建设置,关于未记录的设置的事情是它们会在没有通知的情况下被删除。 - Mike Sand
APP_GROUP_ID是一个“用户定义设置”..我只是用_命名我的定义的设置。我非常确定关于APP_GROUP_ID没有文档,因为它是用户定义的。干杯! - Mark Dominick Flores

0

Xcode 8似乎存在一个错误,正如这个问题中的评论所指出的那样。

我认为我有一个非常粗糙和危险的,但有效的解决方法。

这个想法是只有一个entitlements文件,Xcode 8看到它并用正确的文件替换正在尝试构建的配置。

这个解决方法有很多步骤,不一定所有步骤都是必要的。如果获得更多信息,我会尝试更新这篇文章。如果你敢于测试这样的东西,请添加评论。

此外,在重新打开Xcode 8之前,旧的配置文件可能需要被删除。

在打开Xcode 8之前删除派生数据也似乎有帮助。

警告!自行承担风险进行测试。这可能会造成不可逆转的损坏

  • 删除所有配置文件
  • 删除DerivedData

设置这个黑客

  • 将以下脚本保存到您的项目文件夹中。
  • 在读取 MyProject* 的位置处填入您的项目名称和目标名称
  • 填入您的配置名称
  • 检查每个配置权限文件的名称,该脚本会复制到 MyProject.entitlements 之上
  • 将 MyProject.entitlements 配置为所有配置文件的权限文件
  • 对于所有目标(如果您有例如 watchkit 应用程序),也要执行相同操作
  • 在运行脚本之前:
    • 在 Xcode 中选择正确的 Scheme
    • 关闭 Xcode

脚本模板:

    #!/bin/bash                                                                                                                                                                                                                       

    echo

    if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi

    if [ $# -ne 1 ];  then
        echo
        echo "ERROR: one of the following expected as parameter: release alpha debug"
        echo
        exit -2
    fi

    chosen=$1

    echo "You have chosen build configuration $chosen"
    echo
    echo "This script is a workaround for Xcode 8 bug in handling different build configs and app groups."
    echo "(This scenario is most likely not on Apples list of things that developers are expected to do.)"
    echo
    echo "See comments in this SO answer"
    echo "https://dev59.com/pl8e5IYBdhLWcg3wlbPx#25734318"
    echo
    echo "1) This script must be run with Xcode 8 shut down."
    echo "2) All old provisioning profiles will be deteled. Xcode 8 will recreate them with hopefully correct build config."
    echo
    echo
    echo "WARNING: This will delete ALL provisioning profiles for all apps!"
    echo "WARNING: This will delete ALL MyProject named DerivedData."
    echo

    read -n 1 -s -p "Press any key to continue or Ctrl-C to cancel"

    echo

    # NOTE ABOUT DELETING DERIVED DATA                                                                                                                                                                                                
    # Deleting derived data fixes 2 bugs:                                                                                                                                                                                             
    # 1) Xcode 8 stubbornly generating some distribution profiles for old entitlements files                                                                                                                                          
    # 2) Install from HockeyApp fails due to signing verification error                                                                                                                                                               

    echo "Deleting derived datas"
    rm -vrf /Users/pelam/Library/Developer/Xcode/DerivedData/MyProject-*
    echo

    echo "Deleting provisioning profiles"
    rm -v ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision

    echo

    echo "Replacing target entitlements files"
    echo
    cp -v "./MyProjectTarget/MyProjectTarget.$chosen.entitlements" "./MyProjectTarget/MyProjectTarget.entitlements" || exit -1
    cp -v "./MyProjectAnotherTarget/MyProjectAnotherTarget.$chosen.entitlements" "./MyProjectAnotherTarget/MyProjectAnotherTarget.entitlements" || exit -1
    echo ADD COPY COMMANDS FOR OTHER TARGETS HERE

    echo
    echo "SUCCESS! Now run Xcode and verify that correct profiles are created."
    echo
    echo "NOTE:"
    echo "Running following command after starting Xcode 8 and waiting a bit can show you what appgroup is selected in each profile."
    echo "There should only the one correct app group or the release group. No duplicates in one file or mixed."
    echo "If you are not using multiple app groups, you can view the provisioning profile files in text editor to see that they contain correct settings for the configuration you are trying to build"
    echo "grep -a appgroup ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision"
    echo
    echo

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