使用xcodebuild(Xcode 8)和CI(Travis / Jenkins)环境中的自动签名
随着Xcode 8的发布,苹果引入了一种pipe理签名configuration的新方法。 现在你有两个selectManual
和Automatic
。
根据有关代码签名的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
和导出? 有没有办法来覆盖使用xcodebuild
的Automatic 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
:是development
,app-store
,ad-hoc
,enterprise
-
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
签名的.xcarchive
。 xcodebuild -exportArchive ...
然后可以Distribution
-
在CI环境中构build时,请将“自动”replace为“手动”
在调用xcodebuild
之前,解决方法是在项目文件中将ProvisioningStyle = Automatic
所有实例replace为ProvisioningStyle = Manual
。 sed
可以用来简单地在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_STYLE
selectAutomatic
和Manual
所以没有必要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是:
-
在Xcode项目构build设置中将Provisioningconfiguration文件设置为None。
-
在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议给它一个看看。