iOS自動(dòng)化打包上傳的踩坑記

2016-09-11:
1.添加使用Python封裝打包命令的開源庫(kù)(最下面~)
2016-06-06:
1.經(jīng)過(guò)一輪測(cè)試之后, 發(fā)現(xiàn)文章有點(diǎn)錯(cuò)漏, 小修改一下, 增加命令四

每次要出包的時(shí)候, 總要打開XCode, 然后點(diǎn)擊Product-Archive, 等待好幾分鐘的各種build, 然后還要手動(dòng)上傳到AppStore, 甚至還要上傳到蒲公英檀何、fir等...

很久以前就看了很多關(guān)于iOS自動(dòng)打包ipa的文章, 看著感覺很簡(jiǎn)單, 但是因?yàn)橐恢睕]有AppleDeveloper賬號(hào)可以給我用, 到了真的要搞自動(dòng)打包的時(shí)候, 才發(fā)現(xiàn)到處都是坑佳魔。

基本命令

  1. xcedebuild: 生成Archive、導(dǎo)出ipa, 還有其它功能...
  2. xcrun: 把*.app打包成ipa, 還有其它功能...

基本使用

一. xcedebuild打包Archive文件

xcedebuild -workspace ${path to *.xcworkspace} -scheme ${scheme} -destination generic/platform=iOS archive -configuration Release ONLY_ACTIVE_ARCH=NO -archivePath ${export path *.xcarichive}
  • -workspace 你的*.xcworkspace文件
  • -scheme 項(xiàng)目文件里面的scheme
  • -archivePath 生成的*.xcarichive文件路徑

二. xcedebuild*.xcarchive導(dǎo)出ipa

xcodebuild -exportArchive -exportFormat IPA -archivePath ${path to *.xcarchive} -exportPath ${export path *.ipa} -exportProvisioningProfile ${ProvisioningProfileName}
  • -archivePath 你的*.xcarchive文件, 可以使用上一個(gè)命令導(dǎo)出
  • -exportPath 導(dǎo)出的ipa路徑
  • exportProvisioningProfile 你的Distribution發(fā)布證書的名稱(只需要名稱)

三. xcrun打包ipa

xcrun -sdk iphoneos PackageApplication -v ${path to *.app} -o ${package path *.ipa}
  • -v 你的*.app文件, 生成的*.xcarchive里面有
  • -o 打包生成的*.ipa文件路徑, 注意3谒怠G蛐簟费韭!這里是不能填相對(duì)路徑, 因?yàn)檫@里的路徑環(huán)境變量不是當(dāng)前執(zhí)行命令的路徑了

四. 最新的正確xcodebuild導(dǎo)出ipa

xcodebuild -exportArchive -archivePath ${path to *.xcarchive} -exportPath ${export path to dir} -exportOptionsPlist ${path to export options *.plist}
  • -archivePath 你的*.xcarchive文件, 可以使用第二個(gè)命令導(dǎo)出
  • -exportPath 導(dǎo)出的ipa目錄, ipa的名稱好像是scheme的名稱
  • -exportOptionsPlist 導(dǎo)出plist格式的配置文件

exportOptionPlist: 新建一個(gè)plist文件, 里面是一個(gè)Dictionary, key-value如下, 都是可選值, 不需要全部填上

  1. compileBitcode: Bool

For non-App Store exports, should Xcode re-compile the app from bitcode? Defaults to YES.

  1. embedOnDemandResourcesAssetPacksInBundle : Bool

For non-App Store exports, if the app uses On Demand Resources and this is YES, asset packs are embedded in the app bundle so that the app can be tested without a server to host asset packs. Defaults to YES unless onDemandResourcesAssetPacksBaseURL is specified.

  1. iCloudContainerEnvironment

For non-App Store exports, if the app is using CloudKit, this configures the "com.apple.developer.icloud-container-environment" entitlement. Available options: Development and Production. Defaults to Development.

  1. manifest : Dictionary

For non-App Store exports, users can download your app over the web by opening your distribution manifest file in a web browser. To generate a distribution manifest, the value of this key should be a dictionary with three sub-keys: appURL, displayImageURL, fullSizeImageURL. The additional sub-key assetPackManifestURL is required when using on demand resources.

  1. method : String

Describes how Xcode should export the archive. Available options: app-store, ad-hoc, package, enterprise, development, and developer-id. The list of options varies based on the type of archive. Defaults to development.

  1. onDemandResourcesAssetPacksBaseURL : String

For non-App Store exports, if the app uses On Demand Resources and embedOnDemandResourcesAssetPacksInBundle isn't YES, this should be a base URL specifying where asset packs are going to be hosted. This configures the app to download asset packs from the specified URL.

  1. teamID : String

The Developer Portal team to use for this export. Defaults to the team used to build the archive.

  1. thinning : String

For non-App Store exports, should Xcode thin the package for one or more device variants? Available options: <none> (Xcode produces a non-thinned universal app), <thin-for-all-variants> (Xcode produces a universal app and all available thinned variants), or a model identifier for a specific device (e.g. "iPhone7,1"). Defaults to <none>.

  1. uploadBitcode : Bool

For App Store exports, should the package include bitcode? Defaults to YES.

  1. uploadSymbols : Bool

For App Store exports, should the package include symbols? Defaults to YES.

踩坑

坑一

使用第一個(gè)命令前, 需要確保你的項(xiàng)目的簽名配置好, 證書下好最新的

坑二

第二個(gè)命令的-exportProvisioningProfile填的只是你的發(fā)布證書的名稱, 不是那一串id

坑三

第二個(gè)命令打包出來(lái)的*.ipa不能用來(lái)上傳到AppStore, 一直報(bào)CocoaPods里面的第三方庫(kù)簽名錯(cuò)誤

坑四

打包出來(lái)的*.ipa需要上傳到AppSotre的話, 可以使用第三個(gè)命令, xcrun那一個(gè)

坑五

使用第三個(gè)命令打包出來(lái)的*.ipa, 上傳到AppStore之后, 登錄到iTunes Connect-APP-所有構(gòu)建版本查看到上傳的*.ipa正在構(gòu)建上炎。但是過(guò)了一會(huì)兒, AppleDeveloper賬號(hào)的郵箱就會(huì)收到一封報(bào)錯(cuò)的郵件, 大概是說(shuō)你的*.ipa包里面, 缺少了一個(gè)SwiftSupport文件夾

經(jīng)過(guò)各種搜索之后, 原來(lái)需要把xcrun打包出來(lái)的*.ipa解壓, 然后新建一個(gè)文件夾, *.xcarchive里面的SwiftSupport文件夾copy進(jìn)去, 還有把ipa解壓出來(lái)的move進(jìn)入, 最后打個(gè)zip包, 再改成ipa后綴就可以上傳到AppStore了(應(yīng)該吧, 還沒測(cè)試??)

坑六

經(jīng)過(guò)一輪測(cè)試之后, 發(fā)現(xiàn)用這個(gè)xcrun這個(gè)命令打的包需要自己吧SwiftSupport文件加到壓縮包, 其實(shí)有一個(gè)命令沒有那么麻煩的...

使用上面的第四個(gè)命令使用*.xcarchive把ipa導(dǎo)出, 導(dǎo)出的*.ipa里面會(huì)包含了SwiftSupport, 還不需要自己把它加進(jìn)去

番外篇

在踩到了第五個(gè)坑之后, 在github發(fā)現(xiàn)了一個(gè)iOS的打包谨读、發(fā)布庫(kù)...
上地址: https://github.com/nomad/shenzhen
懶得自己搞的可以使用這個(gè)庫(kù), 感覺還是挺不錯(cuò)的

Python封裝打包命令

github: package-ipa

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晤锹,隨后出現(xiàn)的幾起案子摩幔,更是在濱河造成了極大的恐慌,老刑警劉巖鞭铆,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件或衡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)封断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門斯辰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坡疼,你說(shuō)我怎么就攤上這事椒涯。” “怎么了回梧?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵废岂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狱意,道長(zhǎng)湖苞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任详囤,我火速辦了婚禮财骨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藏姐。我一直安慰自己隆箩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布羔杨。 她就那樣靜靜地躺著捌臊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兜材。 梳的紋絲不亂的頭發(fā)上理澎,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音曙寡,去河邊找鬼糠爬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛举庶,可吹牛的內(nèi)容都是我干的执隧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼户侥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镀琉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起添祸,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滚粟,失蹤者是張志新(化名)和其女友劉穎寻仗,沒想到半個(gè)月后刃泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年耙替,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亚侠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俗扇,死狀恐怖硝烂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铜幽,我是刑警寧澤滞谢,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站除抛,受9級(jí)特大地震影響狮杨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜到忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一橄教、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喘漏,春花似錦护蝶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至负饲,卻和暖如春搅方,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绽族。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工姨涡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吧慢。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓涛漂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親检诗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匈仗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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