Hi,
本文主要講Xcode 9中,如何使用最新的祠汇、簡(jiǎn)單的方式來實(shí)現(xiàn)腳本打包。
Xcode 8以后熄诡,關(guān)于iOS的App打包可很,Apple逐步做了調(diào)整,更簡(jiǎn)單了凰浮,我覺得是更趨近于傻瓜式了我抠。
一開始接觸iOS時(shí),我們習(xí)慣使用XCode來做這些工作袜茧,有了自動(dòng)化后菜拓,我們都是用命令行(Command line)來處理,所以本文基于命令行處理笛厦。
打包的具體流程應(yīng)該是clean(清理緩存)纳鼎、build(編譯)、archive(打包)裳凸、export(導(dǎo)出ipa)
1贱鄙、Clean
Apple提供的例子:
xcodebuild clean install
釋:Cleans the build directory; then builds and installs the first target in the Xcode project in the directory from which xcodebuild was started.
2、Build
2.1 )編譯project工程姨谷,Apple提供的例子:
xcodebuild -project MyProject.xcodeproj -target Target1 -target Target2 -configuration Debug
釋:Builds the targets Target1 and Target2 in the project MyProject.xcodeproj using the Debug configuration.
2.2) 編譯workspace逗宁,Apple提供的例子:
xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyScheme
釋:Builds the scheme MyScheme in the Xcode workspace MyWorkspace.xcworkspace.
注意:
1.project 和taget(可多個(gè))組合使用;workspace和scheme(只一個(gè))組合使用
2.configuration有Debug和Release兩種模式梦湘。
3瞎颗、Archive
先了解下打包,看一個(gè) Apple提供的簡(jiǎn)單例子:
xcodebuild archive -workspace MyWorkspace.xcworkspace -scheme MyScheme
釋:Archives the scheme MyScheme in the Xcode workspace MyWorkspace.xcworkspace.
這例子中捌议,除了指定必要的worksepace哼拔、sheme,未添加其他的配置,-configuration 默認(rèn)是Release瓣颅。
Xcode8 以后管挟,Apple提供了兩種思路:Automic(自動(dòng))、manual(手動(dòng))弄捕,所以我們按此來分析僻孝。
3.1)Automic
Apple推薦的做法是什么?
先看一張圖:
答案是:Automic守谓,且code sign時(shí)使用Development穿铆。
很多人要問,以前的做法是archive時(shí)斋荞,是必須指定正確那一堆麻煩的證書配置荞雏,如code sign identify、team平酿、provision file凤优,也有很多人被此坑過。
Now蜈彼,你無需擔(dān)心這玩意筑辨,也無需使用腳本來修改aaa.xcproject文件中的那些證書配置,哪怕其中的配置都是錯(cuò)誤的幸逆,參數(shù)會(huì)作為命令執(zhí)行的標(biāo)準(zhǔn)棍辕,且也不會(huì)自動(dòng)更改你的aaa.xcproject文件。
那該如何做还绘?
當(dāng)然是使用Automic楚昭。
使用Automic就簡(jiǎn)單了,只需要這樣:
xcodebuild -workspace My.xcworkspace -scheme MySheme -destination generic/platform=iOS -configuration Release \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGN_IDENTITY="iPhone Developer” \
PROVISIONING_PROFILE_SPECIFIER="Automatic" \
PROVISIONING_PROFILE="Automatic" \
CODE_SIGN_STYLE="Automatic" \
PROVISIONING_STYLE="Automatic" \
DEVELOPMENT_TEAM="My Team" \
-archivePath MyPath \
archive
你需要更換的是My.xcworkspace拍顷、MySheme 抚太、"My Team"(你的Team Identifier)、MyPath(文件輸出路徑)昔案。
我來解釋下原因:
1)證書的配置尿贫,在xcode 8以前,就有兩種方式:腳本更改aaa.xcproject文件爱沟、作為配置參數(shù)使用帅霜,只不過好多博客里,都是使用第一種呼伸。
2)Xcode 9才正式公開打包方式的配置:CODE_SIGN_SYTLE 身冀,來配置automic、manual括享,默認(rèn)方式是automic搂根,我也推薦這種方式。
3)CODE_SIGN_IDENTITY="iPhone Developer”铃辖,為何使用developer剩愧,因?yàn)榈搅薊xport階段,是可以重新code sign的娇斩,reCodeSign這是xcode 8更新的內(nèi)容仁卷。
4)基于將配置都作為參數(shù)使用穴翩,若你不用Automatic方式,而采用Manual锦积,那PROVISIONING_PROFILE_SPECIFIER的配置會(huì)有問題芒帕,比如你的項(xiàng)目中做了AppExtention,會(huì)導(dǎo)致Extenion的簽名錯(cuò)誤丰介,這也是我當(dāng)時(shí)遇到的問題背蟆,Apple未提供Extention的PROVISIONING_PROFILE_SPECIFIER該怎么配置。當(dāng)然哮幢,你喜歡用腳本更改aa.xcproject文件带膀,是可以隨便更改。
5)最重要的一點(diǎn):使用automic橙垢,xcode是不會(huì)再revoke你的證書了垛叨。
下面是我在xcode 9的PDF中,找了幾個(gè)重點(diǎn)相關(guān)的截圖:
我當(dāng)時(shí)修改這些build settings 钢悲,也是比較費(fèi)勁点额,在Xcode中手動(dòng)更改證書等配置,然后使用fileMerge來比較到底有何不同莺琳,結(jié)合Xcode 9最后才總結(jié)出还棱,使用Automic是非常簡(jiǎn)單的。
3.2)Manual
1)如果你的App沒有做AppExtention惭等,也可以跟上面使用Automic時(shí)一樣珍手,作為參數(shù),無需腳本更改aa.xcproject文件
將如下命令中證書相關(guān)的辞做,配置為準(zhǔn)確的值就可:
xcodebuild -workspace My.xcworkspace -scheme MySheme -destination generic/platform=iOS -configuration Release \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGN_IDENTITY="iPhone Developer” \
PROVISIONING_PROFILE_SPECIFIER="Automatic" \
PROVISIONING_PROFILE="Automatic" \
CODE_SIGN_STYLE="Manual" \
PROVISIONING_STYLE="Manual" \
DEVELOPMENT_TEAM="My Team" \
-archivePath MyPath \
archive
2)可以使用琳要,腳本更改aa.xcproject文件,無需作為參數(shù)執(zhí)行命令秤茅,例子如下
xcodebuild -workspace My.xcworkspace -scheme MySheme -destination generic/platform=iOS -configuration Release -archivePath MyPath archive
3.3)-xcconfig
Build Setsing作為參數(shù)使用還有一種方式稚补,-xcconfig configTest.xcconfig,將那些Build Setsings參數(shù)寫在一個(gè).xcconfig文件中框喳,xcode可以直接創(chuàng)建這個(gè)文件课幕。
看一下Apple的解釋:
-xcconfig PATH ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
釋:apply the build settings defined in the file at PATH as overrides
我也喜歡這種方式,命令會(huì)很簡(jiǎn)單:
xcodebuild -workspace My.xcworkspace -scheme MySheme -xcconfig configTest.xcconfig
4五垮、ExportArchive
先看一下Apple給的例子:
xcodebuild -exportArchive -archivePath MyMobileApp.xcarchive -exportPath ExportDestination -exportOptionsPlist 'export.plist'
釋:Exports the archive MyMobileApp.xcarchive to the path ExportDestination using the options specified in export.plist.
xcode 8.3之后乍惊,exportOptionsPlist是必須指定,我在另一篇博客中放仗,也有提到润绎。
那exportOptionsPlist之中該如何寫?
先看一個(gè)官方的例子:
再來看看每一個(gè)key啥意思:
compileBitcode : Bool
? For non-App Store exports, should Xcode re-compile the app from bitcode? Defaults to YES.
method : String
? Describes how Xcode should export the archive. Available options: app-store, ad-hoc, package, enterprise, development, developer-id, and mac-application. The list of options varies based on the type of archive. Defaults to development.
provisioningProfiles : Dictionary
? ? For manual signing only. Specify the provisioning profile to use for each executable in your app. Keys in this dictionary are the bundle identifiers of executables; values are the provisioning profile name or UUID to use.
signingCertificate : String
? ? For manual signing only. Provide a certificate name, SHA-1 hash, or automatic selector to use for signing. Automatic selectors allow Xcode to pick the newest installed certificate of a particular type. The available automatic selectors are "Mac App Distribution",
"iOS Developer", "iOS Distribution", "Developer ID Application", and "Mac Developer". Defaults to an automatic certificate selector matching the current distribution method.
signingStyle : String
? ? The signing style to use when re-signing the app for distribution. Options are manual or automatic. Apps that were automatically signed when archived can be signed manually or automatically during distribution, and default to automatic. Apps that were manually signed when archived must be manually signed during distribtion, so the value of signingStyle is ignored.
teamID : String
The Developer Portal team to use for this export. Defaults to the team used to build the archive.
stripSwiftSymbols : Bool
? ? Should symbols be stripped from Swift libraries in your IPA? Defaults to YES.
其中我們關(guān)心的,就是provisioningProfile的配置莉撇,它是要指定你的所有bundleID以及對(duì)應(yīng)provisioning file的name或者UUID呢蛤。
使用Automic打包時(shí),提到了re-sign,如何重簽名稼钩,稍加思考顾稀,就是exportOptionsPlist配置好證書那些玩意,有teamID坝撑、signingCertificate、provisioningProfiles粮揉。
補(bǔ)充:Xcode 9還更新了兩個(gè)可選項(xiàng)(Options)巡李,一般用不到,因?yàn)槟愣紩?huì)將證書相關(guān)文件拷貝到本地
-allowProvisioningUpdates? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? Allow xcodebuild to communicate with the Apple Developer website. For automatically signed targets, xcodebuild will create and update profiles, app IDs, and certificates. For manually signed targets, xcodebuild will download missing or updated provisioning profiles. Requires a developer account to have been added in Xcode's Accounts preference pane.
-allowProvisioningDeviceRegistration? ? ? ? ? ? ? ?
? ? Allow xcodebuild to register your destination device on the developer portal if necessary. This flag only takes effect if -allowProvisioningUpdates is also passed.
總結(jié):推薦使用Automic方式來Archive扶认,在ExportArchive重新簽名侨拦。
Xcode 9更新:https://developer.apple.com/videos/play/wwdc2017/403/
若有疑問,可留言辐宾、簡(jiǎn)信狱从。