Xcode 9 最新 最準(zhǔn)確 的自動(dòng)化打包

Hi,

本文主要講Xcode 9中,如何使用最新的祠汇、簡(jiǎn)單的方式來實(shí)現(xiàn)腳本打包。

code sign work flow

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)的截圖:


xocde 9


build settings

我當(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è)官方的例子:

exportOptionsPlist 示例

再來看看每一個(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)信狱从。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叠纹,隨后出現(xiàn)的幾起案子季研,更是在濱河造成了極大的恐慌,老刑警劉巖誉察,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件与涡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡持偏,警方通過查閱死者的電腦和手機(jī)驼卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸿秆,“玉大人酌畜,你說我怎么就攤上這事勺择∶唬” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蔓挖,是天一觀的道長(zhǎng)附帽。 經(jīng)常有香客問我埠戳,道長(zhǎng),這世上最難降的妖魔是什么蕉扮? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任整胃,我火速辦了婚禮,結(jié)果婚禮上喳钟,老公的妹妹穿的比我還像新娘屁使。我一直安慰自己在岂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布蛮寂。 她就那樣靜靜地躺著蔽午,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酬蹋。 梳的紋絲不亂的頭發(fā)上及老,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音范抓,去河邊找鬼骄恶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匕垫,可吹牛的內(nèi)容都是我干的僧鲁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼象泵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寞秃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偶惠,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤春寿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洲鸠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堂淡,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扒腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢淀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瘾腰,死狀恐怖皆的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹋盆,我是刑警寧澤费薄,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站栖雾,受9級(jí)特大地震影響楞抡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜析藕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一召廷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦竞慢、人聲如沸先紫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遮精。三九已至,卻和暖如春败潦,著一層夾襖步出監(jiān)牢的瞬間本冲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工变屁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眼俊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓粟关,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親环戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闷板,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容