xcode 为目标依赖构建不同的配置文件

xcodebuild different provisioning profile for target dependency

我正在尝试使用 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'

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

我今天花了太多时间在这上面。当答案击中我时,我正在睡觉的路上:

在每个目标的 Build Settings 中,您应该为配置文件名称设置一个 $VARIABLE。为此,从配置文件列表底部选择 "Other"。这样做会打开一个文本字段 - 为每个目标选择不同的 $VARIABLE - 例如我选择 $APP_PROFILE 作为容器应用程序目标, $EXTENSION_PROFILE 作为我的 Today 扩展目标

这将导致如下结果:

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

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

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

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

适用于 XCode 6.3 :)

几个月后...找到了一个解决方案,它不涉及 Xcode 中的设置值:在 sigh there is a 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 有。

在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.

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

我能够生成构建。

没有变量的解决方案

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

例如,你会看到,

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

本质上是相同的字符串,可以说这个标识是 "Code Signing Identity (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