【问题标题】:xcodebuild different provisioning profile for target dependencyxcodebuild 不同的目标依赖配置文件
【发布时间】:2015-03-14 09:52:44
【问题描述】:

我正在尝试使用 xcodebuild 构建我的应用:

xcodebuild -workspace "RG.xcworkspace" -scheme "Production" -configuration "Release" build CONFIGURATION_BUILD_DIR="${TEMP_DIR}" PROVISIONING_PROFILE="1234-5678-9098-7654-3210"

我的方案有两个目标。一个目标是应用程序,另一个是应用程序扩展(我为 Safari 构建了一个扩展)。应用程序扩展是一个目标依赖项。每个目标都需要一个单独的配置文件。我不知道如何为依赖项指定 PROVISIONING_PROFILE。正如预期的那样,我收到了这个错误:

CodeSign error: code signing is required for product type 'App Extension' in SDK 'iOS 8.1'

StackOverflow 和 xcodebuild 的手册页似乎没有提出任何建议。有谁知道如何使用依赖于两个配置文件的 xcodebuild 构建项目?

【问题讨论】:

  • 如果我是你,我会创建两个不同的方案。
  • 每个目标一个方案?当一个目标是应用扩展时,我如何组合目标?

标签: ios xcode xcodebuild


【解决方案1】:

无变量解

有一个选项 -exportSigningIdentity 可以帮助您,因为应用程序和扩展程序/小部件的配置文件可能不同,但应用程序和扩展程序的签名身份应该相同。

例如,你会看到,

  • TargetApp -> 构建设置 -> “代码签名身份 (id)”(发布)
  • TargetExtension -> 构建设置 -> “代码签名身份 (id)”(发布)

本质上是相同的字符串,假设这个身份是“代码签名身份(id)”。因此,要构建和导出存档,您可以运行的内容很简单,

清洁

xcodebuild clean -workspace HelloWorld.xcworkspace -scheme HelloWorld

建筑

xcodebuild -workspace HelloWorld.xcworkspace -scheme HelloWorld archive -archivePath ~/output/HelloWorld.xcarchive

导出

xcodebuild -exportArchive -exportFormat ipa -archivePath ~/output/HelloWorld.xcarchive -exportPath "HelloWorld.ipa" -exportSigningIdentity "Code Signing Identity (id)"

参考:xcodebuild documentation

【讨论】:

  • 只有当一个人有多个苹果账户时才有帮助吗?在维护配置文件时,我认为这不会帮助我从旧配置文件切换到新配置文件。顺便说一句,文档页面适用于 xcode5 2013,而我们现在使用的是 8.3。我认为新的 xcode 现在没有任何单独的在线 cli 文档。
  • 两个目标应该在同一个帐户下,这是通常的情况。是的,它有效。
  • 这对我不起作用。在您的示例中尝试构建 TargetApp 时,TargetApp 和 TargetExtension 都出现错误,“需要具有关联域、应用程序组和推送通知功能的配置文件”。似乎不设置或提供配置文件确实有效。在我的情况下,我正在尝试构建一个 3rd 方应用程序,我无法控制 xcode 项目设置,并希望构建命令行来自动化这个过程。
【解决方案2】:

在 Swift 中,Pod 文件框架将被单独打包。 以下步骤解决了问题。

 1. Select pods 
 2. Targets
 3. General
 4. Edit bundle id
 5. Build Settings
 6. Code Signing
 7. Provisioning profile -> select the valid profile
 8. Code Signing Identity -> Select the respective identity from
    profile.

对所有目标重复相同的操作。

我能够生成构建。

【讨论】:

    【解决方案3】:

    几个月后...找到了一个不涉及 Xcode 中设置值的解决方案:在 sigh 内有一个 script 能够使用给定的配置文件重新签名 ipa 文件。以下对我有用:

    bash resign.sh Experiments-AdHocProd.ipa "iPhone Distribution: Company Pty Ltd" output.ipa -p com.company.experiments.AudioPlugin=Experiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision -p com.company.experiments=Experiments-AdHocProd.mobileprovision --verbose
    

    地点:

    • Experiments-AdHocProd.ipa 是现有的ipa
    • com.company.experiments.AudioPlugin 是扩展包 ID
    • Experiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision 是扩展配置文件
    • com.company.experiments 是主应用程序包标识符
    • Experiments-AdHocProd.mobileprovision 是主应用配置文件

    每个配置文件的包标识符必须与将要签名的应用的标识符相匹配。

    我发现需要注意的重要一点是,如果包标识符有通配符(在我的情况下是 Experiments-AdHocProd.mobileprovision),那么必须首先将具有显式 ID 的配置文件传递给 -p .


    或者,您可以使用sigh 执行辞职。不幸的是,sigh --help 没有说任何关于使用扩展名辞职的二进制文件,但是sigh resign --help 确实如此。

    【讨论】:

      【解决方案4】:

      我今天在这方面花了太长时间。当答案突然出现时,我正在睡觉的路上:

      在每个目标的构建设置中,您应该为配置文件名称设置$VARIABLE。为此,请从配置文件列表的底部选择“其他”。这样做将打开一个文本字段 - 为每个目标选择不同的 $VARIABLE - 例如,我为容器应用程序目标选​​择了 $APP_PROFILE,为我的 Today 扩展目标选择了 $EXTENSION_PROFILE

      这将导致如下所示:

      最后,在使用 xcodebuild 构建时,像使用 PROVISIONING_PROFILE 一样指定配置文件 UUID:

      xcodebuild ... APP_PROFILE="85b6f019-d5e5-43a7-9e8f-e3aaed64a7e4" EXTENSION_PROFILE="e50cf605-ab63-40ad-8329-2758359ea748"
      

      从 XCode 内部构建似乎不受影响 - 据我所知,XCode 正在选择默认配置文件(就像在“自动”模式下一样)

      理论上这也将支持多个扩展。

      适用于我的 XCode 6.3 :)

      【讨论】:

      • 嘿,非常好。谢谢!
      • 我快疯了,你应该得到一枚奖章......我仍然无法相信 Apple 没有记录应用扩展的分发机制如此糟糕
      • @apouche 如果您仍在使用它,您可能更喜欢另一个解决方案 - 我添加了另一个答案:)
      • 只需创建更多配置。然后,您无需在命令行中指定配置文件名称。
      • 我试过这个,但与你在上一段第三段中所说的相反,Xcode 开始抱怨这里提到的显式配置文件与其他地方提到的“自动”不匹配。嗯。
      猜你喜欢
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多