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

随着Xcode 8的发布,苹果引入了一种pipe理签名configuration的新方法。 现在你有两个selectManualAutomatic

根据有关代码签名的WWDC 2016会议(WWDC 2016 – 401 – Xcode应用程序签名中的新增function) ,当您selectAutomatic签名时,Xcode将会:

  • 创build签名证书
  • 创build和更新应用程序ID
  • 创build和更新供应configuration文件

但根据苹果在该届会议上所说, Automatic Signing将使用Development signing ,并将限于Xcode创build的供应configuration文件。

当您尝试在CI环境(如Travis CI或Jenkins)上使用Automatic Signing时,就会出现问题。 我无法find一个简单的方法来继续使用自动和签署分发(因为Xcode迫使您使用开发和Xcode创build的供应configuration文件)。

虽然我可以在我的机器上find新的“Xcode创build的供应configuration文件”,但是不会显示在开发人员门户中…我应该将这些configuration文件移动到CI机器,构build用于Distribution Development和导出? 有没有办法来覆盖使用xcodebuildAutomatic Signing

我基本上遇到了使用Jenkins CI和Xcode插件的相同问题。 我最终使用xcodebuild自己完成构build和xcodebuild

0.先决条件

为了成功完成以下步骤,您需要安装必要的预configurationconfiguration文件和证书。 这意味着你的代码签名应该已经在工作了。

1.build立一个.xcarchive

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

2.导出到.ipa

 xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path> 

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> 
  • method :是developmentapp-storead-hocenterprise
  • teamID :你的10位开发者团队ID(类似于A1B2C3D4E5)

无论如何,这个过程无论如何更接近于你用Xcode手动完成的工作,而不是像Jenkins Xcode插件那样。

注意:.xcarchive文件将始终进行开发签名,但在第二步中select“app-store”作为方法将执行正确的分发签名,并将分发概要文件包含为“embedded.mobileprovision”。

希望这可以帮助。

尝试了几个选项后,这些是我可以在我的CI服务器上使用的解决scheme:

  • 在CI环境中包含开发人员证书和私钥以及自动生成的供应configuration文件:

使用Automatic signing强制您使用Developer证书和auto-generated provisioning profiles 。 一种select是将您的开发证书和私钥(应用程序 – >实用程序 – >钥匙串访问)和自动生成的供应configuration文件导出到CI机器。 find自动生成的供应configuration文件的方法是导航到~/Library/MobileDevice/Provisioning\ Profiles/ ,将所有文件移动到备份文件夹,打开Xcode并存档项目。 Xcode将创build自动生成的开发资源调配configuration文件,并将其复制到Provisioning Profiles文件文件夹。

xcodebuild archive ...将创build一个为Development签名的.xcarchivexcodebuild -exportArchive ...然后可以Distribution

  • 在CI环境中构build时,请将“自动”replace为“手动”

在调用xcodebuild之前,解决方法是在项目文件中将ProvisioningStyle = Automatic所有实例replace为ProvisioningStyle = Manualsed可以用来简单地在pbxproj文件中find一个replace:

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

@thelvis还创build了一个使用xcodeproj gem来执行此操作的Ruby脚本 。 该脚本可以更好地控制更改内容。

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

编辑:与Xcode 9, xcodebuild有一个新的生成设置参数CODE_SIGN_STYLEselectAutomaticManual所以没有必要find和replace项目文件中的手动自动实例,更多信息在WWDC 2017会议403签名的新内容Xcode和Xcode服务器

  • 切换到手动签名

手动签名将提供对所使用的代码签名身份和供应configuration文件的全面控制。 这可能是最干净的解决scheme,但缺点是失去了自动签名的所有好处。

要了解更多关于使用Xcode 8进行代码签名的信息,我非常推荐本文以及WWDC2016会话401 – Xcode应用程序签名中的新增function

我正在考虑另一种select,我还没有看到这里提到。 设置两个相同的目标,仅在签名设置上有所不同。

  • 当添加新设备/开发人员时, 开发目标使用自动签名来获得所有这些好处
  • CI目标使用手动签名

缺点是你将不得不pipe理两个相同的目标。 上游是获得自动签署开发的好处,而不必维护在构build时间之前修改项目的潜在脆弱脚本。

如果您使用Xcode 8.x和Jenkins的CI。 那么可能你会遇到问题,“签署”YourProjectName“需要一个开发团队。 在项目编辑器中select一个开发团队。

在SDK“iOS 10.1”中,产品类​​型“应用程序”需要代码签名**运行作业时** BUILD FAILED **。

解决办法是什么?。

解决scheme是:

  1. 在Xcode项目构build设置中将Provisioningconfiguration文件设置为None。

  2. 在jenkins中,在Xcode设置之前创build一个执行shell并写下面的命令

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

    记住:在jenkins的Build部分的Xcode设置之前,保持执行shell。

这工作。

对我而言,没有任何工作。 我通过更改安装在Mac Mini(Jenkins的CI服务器)上的Xcode应用程序中的文件解决了我的问题,如以下链接所示:
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
另外,我closures了从Xcode的自动签名。

全做完了! 最后作品!

我注意到我的Unity版本从来没有向我的XCode项目添加ProvisioningStyle项。 然后我find了一种通过使用“PostProcessBuild”构build脚本手动添加ProvisioningStyle的方法。 即由Unity构buildIOS XCode项目之后调用的一个代码单元。

首先我看看project.pbxproj文件应该是什么样的 – 当它被设置为Manual Provisioning时:

 /* Begin PBXDictionary section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { TargetAttributes = { 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { ProvisioningStyle = Manual; }; 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { TestTargetID = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; }; }; }; 

然后我创build了我的代码来复制上面看到的文件的“结构”。 (使用这里find的XCodeEditor项目: XCodeEditor )

 [PostProcessBuild] public static void OnPostProcessBuild(BuildTarget target, string path) { // Create a new project object from build target XCProject project = new XCProject(path); if (target == BuildTarget.iOS) { //Add Manual ProvisioningStyle - this is to force manual signing of the XCode project bool provisioningSuccess = AddProvisioningStyle(project, "Manual"); if (provisioningSuccess) project.Save(); } } private static bool AddProvisioningStyle(XCProject project, string style) { var pbxProject = project.project; var attr = pbxProject.data["attributes"] as PBXDictionary; var targetAttributes = attr["TargetAttributes"] as PBXDictionary; var testTargetIDGuid = FindValue(targetAttributes, "TestTargetID"); if (!string.IsNullOrEmpty(testTargetIDGuid)) { var settings = new PBXDictionary(); //here we set the ProvisioningStyle value settings.Add("ProvisioningStyle", style); targetAttributes.Add(testTargetIDGuid, settings); var masterTest = FindValue(targetAttributes, "ProvisioningStyle"); if (masterTest == style) { return true; } } return false; } private static string FindValue(PBXDictionary targetAttributes, string key) { foreach (var item in targetAttributes) { var ma = item.Value as PBXDictionary; foreach (var di in ma) { var lookKey = di.Key; if (lookKey == key) { return di.Value.ToString(); } } } return ""; } 

是什么修复了我这是: http : //code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html

…将来自login钥匙串的证书复制到系统钥匙串。 您可能还希望将所有的开发证书设置为“允许所有应用程序访问此项”(右键单击/获取信息/访问控制)。

有一个名为fastlane的工具,这使得使用xcodebuild更容易,并保持意味着新的更新将继续提供对xcode更改的支持。 它使创build脚本和configuration在许多其他支持的xcode自动化工具之间构build和协调应用程序变得更加容易。 我build议给它一个看看。