xcodebuild针对目标依赖项的不同配置文件

时间:2015-01-15 21:08:09

标签: ios xcode xcodebuild

我正在尝试使用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构建一个依赖于两个配置文件的项目?

4 个答案:

答案 0 :(得分:48)

我今天花了很长时间研究这个问题。当答案袭击我时,我正在去睡觉的路上:

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

Adding a build variable variable...

这将产生如下内容:

Profiles

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

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

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

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

使用XCode 6.3为我工作:)

答案 1 :(得分:2)

无变量的解决方案

有一个选项,-exportSigningIdentity可以帮助您,因为应用程序&提供配置文件。扩展/窗口小部件可能不同,但签署了app& amp;扩展应该是相同的。

例如,你会看到,

  • 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

答案 2 :(得分:1)

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

n = int(input())
input = [int(i) for i in input().split()]
count, t_length = 0, 0
cmp = input[0]
while True:
  length = len(input)
  for i in range(1, length):
    if input[i] == -1:
      t_length += 1
      continue
    if input[i] > cmp:
      cmp = input[i]
      input[i] = -1
    else:
      t_length += 1
      cmp = input[i]
  if t_length+1 == length:
    break  
  count += 1
  cmp, t_length = input[0], 0
print(count)

其中:

  • 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 是现有的ipa
  • Experiments-AdHocProd.ipa是扩展程序包ID
  • com.company.experiments.AudioPlugin是扩展程序资料
  • Experiments-AdHocProd_com.company.experiments.AudioPlugin.mobileprovision是主要的应用包标识符
  • com.company.experiments是主要应用个人资料

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

我发现需要注意的重要事项的是,如果包标识符有通配符(在我的情况下Experiments-AdHocProd.mobileprovision确实存在),那么具有显式ID的配置文件必须传递到{{ 1}}首先。

或者,您可以使用Experiments-AdHocProd.mobileprovision执行辞职。不幸的是,-p没有提及有关使用扩展程序重新签名二进制文件的任何内容,但是sigh会这样做。

答案 3 :(得分:0)

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

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

我能够生成构建。