使用xcodebuild(Xcode 8)和CI(Travis/Jenkins)环境中的自动签名

pab*_*art 72 xcode continuous-integration xcodebuild jenkins travis-ci

随着Xcode 8的发布,Apple推出了一种管理签名配置的新方法.现在你有两个选择ManualAutomatic.

根据WWDC 2016年关于代码签名的会议(WWDC 2016 - 401 - Xcode应用程序签名中的新功能),当您选择Automatic签名时,Xcode将:

  • 创建签名证书
  • 创建和更新应用程序ID
  • 创建和更新配置文件

但根据Apple在该会话中所说的内容,Automatic Signing将会使用Development signing并将仅限于Xcode创建的配置文件.

当您尝试Automatic Signing在CI环境(如Travis CI或Jenkins)上使用时,会出现此问题.我无法找到一种简单的方法来继续使用自动和签署分发(因为Xcode强制您使用开发和Xcode创建的配置文件).

新的"Xcode创建的配置文件"不会显示在开发人员门户中,虽然我可以在我的机器中找到...我应该将这些配置文件移动到CI机器,构建Development和导出Distribution吗?有没有办法覆盖Automatic Signing使用xcodebuild

d4R*_*4Rk 60

我使用Jenkins CI和Xcode插件基本上遇到了同样的问题.我结束了自己使用的构建和代码签名的东西xcodebuild.

0.先决条件

为了成功完成以下步骤,您需要安装必要的配置文件和证书.这意味着您的代码签名应该已经正常工作.

1.构建.xcarchive

xcodebuild -project <path/to/project.xcproj> -scheme <scheme-name> -configuration <config-name> clean archive -archivePath <output-path> DEVELOPMENT_TEAM=<dev-team-id>
Run Code Online (Sandbox Code Playgroud)
  • DEVELOPMENT_TEAM:您的10位开发人员团队ID(类似于A1B2C3D4E5)

2.导出到.ipa

xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path>
Run Code Online (Sandbox Code Playgroud)

例子exportOptions.plist:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>development</string>
    <key>teamID</key>
    <string> A1B2C3D4E5 </string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
  • method:是的一个development,app-store,ad-hoc,enterprise
  • teamID:您的10位开发人员团队ID(类似于A1B2C3D4E5)

无论如何,这个过程更接近你手动使用Xcode,而不是像Jenkins Xcode插件那样.

注意:.xcarchive文件将始终是开发签名,但在第二步中选择"app-store"作为方法将执行正确的分发签名,并将分发配置文件包含为"embedded.mobileprovision".

希望这可以帮助.

  • 基本上,如果您尝试强制执行`CODE_SIGNING_IDENTIY`但启用了"自动"签名,则会出现此错误:`<YourTarget>具有冲突的配置设置.<YourTarget>自动签名,但代码签名身份iPhone Distribution:...已手动指定.在构建设置编辑器中将代码签名标识值设置为"iPhone Developer",或在项目编辑器中切换到手动签名.` (4认同)
  • 当签名设置为"自动"时,即使在设置了"DEVELOPMENT_TEAM"和"CODE_SIGNING_IDENTITY ="电话分配"后,Xcode仍在使用"iPhone Developer".如果你检查`xcodebuild`的日志,你可以看到codesign正在使用`签名身份:"iPhone开发人员:XXXX(XXXXX)"`,所以你的CI环境需要开发人员证书和自动生成的配置文件,你使用的是`手动`或'自动'? (2认同)
  • 而且我担心您目前无法使用工具在自动和手动签名之间切换.我想如果你找到一种方法来编辑`project.pbxproj`文件并在`TargetAttributes`中为你的目标添加`ProvisioningStyle = Manual;`,我认为它可以解决.但这似乎很棘手,如果你想在CI环境上构建,手动管理证书和配置文件似乎是一种更直接的方法. (2认同)

pab*_*art 35

尝试了几个选项后,这些是我能够在CI服务器上使用的解决方案:

  • 在CI环境中包括开发人员证书和私钥以及自动生成的配置文件:

使用Automatic signing强制您使用Developer证书和auto-generated provisioning profiles.一种选择是将开发证书和私钥(应用程序 - >实用程序 - >密钥链访问)和自动生成的配置文件导出到CI计算机.查找自动生成的配置文件的方法是导航到~/Library/MobileDevice/Provisioning\ Profiles/,将所有文件移动到备份文件夹,打开Xcode并存档项目.Xcode将创建自动生成的开发配置文件,并将它们复制到该Provisioning Profiles文件夹.

xcodebuild archive ...将创建一个.xcarchive签名Development.xcodebuild -exportArchive ...然后可以重新构建Distribution

  • 在CI环境中构建时,将"自动"替换为"手动"

在调用xcodebuild变通方法之前,要替换项目文件中的所有ProvisioningStyle = Automaticwith 实例ProvisioningStyle = Manual.sed可以用于在pbxproj文件中找到一个简单的替换:

sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' <ProjectName>.xcodeproj/project.pbxproj

@thelvis还使用gem 创建了一个Ruby脚本xcodeproj.该脚本可让您更好地控制更改内容.

xcodebuild然后将使用CODE_SIGN_IDENTITY项目中设置的代码签名identity()以及配置文件(PROVISIONING_PROFILE_SPECIFIER).这些设置也可以作为参数提供xcodebuild,它们将覆盖项目中设置的代码签名标识和/或配置文件.

编辑:使用Xcode 9,xcodebuild有一个新的构建设置参数CODE_SIGN_STYLE可供选择Automatic,Manual因此不需要在项目文件中查找和替换自动与手动的实例,更多信息在WWDC 2017会话403签署Xcode和Xcode服务器的新功能

  • 切换到手动签名

手动签名将完全控制正在使用的代码签名标识和配置文件.这可能是最干净的解决方案,但缺点是失去了自动签名的所有好处.

要了解有关使用Xcode 8进行代码签名的更多信息,我真的推荐本文以及WWDC2016会话401 - Xcode应用程序签名中的新功能