2019-02-22 iOS自動(dòng)打包腳本(絕對(duì)不用xcode打開(kāi)做任何操作)

首先感謝一下無(wú)數(shù)大佬在網(wǎng)上的分享淌实,才能讓我完成這個(gè)腳本


由于之前的編輯模式?jīng)]有切換纽哥,導(dǎo)致這篇文章看起來(lái)挺惡心的概行,我在2019-03-14 iOS自動(dòng)打包腳本ProvisioningStyle字段(對(duì)之前文章的補(bǔ)充)對(duì)這篇文進(jìn)行了分解细层,建議先看分解的文章,本篇是完整代碼



介紹一下倦逐,腳本使用背景譬正,很多做react-native開(kāi)發(fā)的工程師不一定用的是Mac電腦,所以打iOS的ipa包就沒(méi)有Xcode工具去圖形界面上操作檬姥,比如勾選證書(shū)曾我、pp文件之類的,而且網(wǎng)上大佬們分享的健民,大都是Xcode8之前的使用腳本抒巢,而Xcode8開(kāi)始有了自動(dòng)管理簽名文件功能,并且是默認(rèn)的秉犹,所以很多腳本都掛了蛉谜,針對(duì)這個(gè)問(wèn)題有的腳本中也做了處理稚晚,但對(duì)那些從來(lái)沒(méi)有用Xcode打開(kāi)并操作過(guò)的項(xiàng)目就沒(méi)有用了。下面我就是直接把自己的腳本代碼貼上來(lái)了型诚,請(qǐng)各位指教客燕,因?yàn)槲也粫?huì)腳本語(yǔ)言,這份腳本是我從網(wǎng)上搜索的各種資料狰贯,還請(qǐng)教了一些寫后臺(tái)的同事也搓,所以與很多不足,希望大家可以指點(diǎn)一二涵紊,幫我優(yōu)化一下傍妒,謝謝。

```

#!/bin/sh

#? Created by yin.yan on 2019/2/15

#? ******************** ios一鍵式打包并上傳到pgyer生成二維碼并直接掃描安裝 ********************

# 預(yù)先定義對(duì)應(yīng)的環(huán)境變量

envionmentVariables(){

? ? echo "\033[37;45m*************************? step1:初始化環(huán)境變量? *************************? \033[0m"

? ? # 打包時(shí)間初始值

? ? SECONDS=0

? ? # 工作空間 (例:若是用Cocopods管理的.xcworkspace項(xiàng)目,賦值true;用Xcode默認(rèn)創(chuàng)建的.xcodeproj,賦值false)

? ? is_workspace="false"

? ? # 指定要打包編譯的方式 : Release or Debug (默認(rèn)是Release)

? ? build_configuration="Release"

? ? # pgyer賬戶的pgyer_api_key, 這個(gè)api_key換成自己pgyer賬號(hào)生成的api_key即可 (需要替換)

? ? pgyer_api_key="*******蒲公英賬號(hào)的key**********"?

? ? #add new

? ? # 證書(shū)

? ? code_sign_identity="*********證書(shū)名********"

? ? # 描述文件UUID

? ? mobileprovision_uuid="***********配置文件的UUID**********"

? ? # method摸柄,打包的方式颤练。方式分別為 development, ad-hoc, app-store, enterprise 。必填

? ? method="enterprise"

? ? #

? ? enable_bitcode="NO"

? ? # 打包腳本文件夾路徑

? ? script_path=$(pwd)

? ? # 工程中Target對(duì)應(yīng)的配置plist文件名稱, Xcode默認(rèn)的配置文件為info.plist

? ? info_plist_name="info"

? ? # 導(dǎo)出ipa所需要的對(duì)應(yīng)的plist文件路徑 (默認(rèn)為EnterpriseExportOptionsPlist.plist)

? ? ExportOptionsPlistPath="$script_path/EnterpriseExportOptionsPlist.plist"

? ? # 返回上上級(jí)目錄,進(jìn)入項(xiàng)目工程根目錄

? ? # 工程根目錄

? ? project_dir="$(pwd)/ios"

? ? cd "$project_dir"

? ? # 獲取工程名稱(LSBuyer)

? ? project_name=`find . -name *.xcodeproj | awk -F "[/.]" '{print $(NF-1)}'`

? ? # 指定項(xiàng)目的scheme名稱(需要替換)

? ? scheme_name="$project_name"?

? ? # 指定bundleid 名為 com.testtest.項(xiàng)目名

? ? bundle_identifier="com.testtest.$project_name"

? ? # 獲取對(duì)應(yīng)的plist文件

? ? info_plist_path="$project_dir/$project_name/$info_plist_name.plist"

? ? # 修改info.plist文件中 CFBundleIdentifier 值

? ? /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $bundle_identifier" $info_plist_path

? ? # 對(duì)應(yīng)plist中的Bundle versions string, short

? ? bundle_short_version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$info_plist_path"`

? ? # 對(duì)應(yīng)plist中的Bundle version

? ? bundle_version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$info_plist_path"`


? ? #add new

? ? # 對(duì)應(yīng)plist中的Bundle identifier

? ? # bundle_identifier=`/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" "$info_plist_path"`

? ? # 包文件所在地址

? ? pbxproj_path="$script_path/ios/${project_name}.xcodeproj/project.pbxproj"

? ? # /Users/yz/Desktop/testAAA/ios/testAAA.xcodeproj/project.pbxproj

? ? # 指定輸出ipa文件夾路徑

? ? export_path="$project_dir/build"

? ? # 指定輸出xcarchive路徑

? ? export_archive_path="$export_path/$scheme_name.xcarchive"

? ? # 刪除舊.xcarchive文件

? ? rm -rf "$export_archive_path"

? ? # 指定輸出ipa路徑

? ? export_ipa_path="$export_path"

? ? # 指定輸出ipa名稱 : scheme_name + bundle_short_version

? ? ipa_name="$scheme_name-v$bundle_short_version"

}

Xcodebuild(){

? ? echo "--------------------腳本配置參數(shù)檢查--------------------"

? ? echo "\033[33;1mis_workspace=${is_workspace} "

? ? echo "project_name=${project_name}"

? ? echo "scheme_name=${scheme_name}"

? ? echo "build_configuration=${build_configuration}"

? ? echo "code_sign_identity=${code_sign_identity}"

? ? echo "mobileprovision_uuid=${mobileprovision_uuid}"

? ? echo "ExportOptionsPlistPath=${ExportOptionsPlistPath}"

? ? echo "pbxproj_path=${pbxproj_path}"

? ? echo "bundle_identifier=${bundle_identifier} \033[0m"

? ? echo "\033[37;45m*************************? step2:開(kāi)始構(gòu)建項(xiàng)目? *************************? \033[0m"

? ? sleep 1

? ? if [ -d "$export_path" ]; then

? ? ? ? echo $export_path

? ? else

? ? ? ? mkdir $export_path

? ? fi

? ? # 在 project.pbxproj文件中藥添加三行代碼塘幅,不會(huì)啊昔案。。电媳。

? ? rootObject=`/usr/libexec/PlistBuddy -c "Print :rootObject" $pbxproj_path`

? ? targetList=`/usr/libexec/PlistBuddy -c "Print :objects:${rootObject}:targets" $pbxproj_path | sed -e '/Array {/d' -e '/}/d' -e 's/^[ \t]*//'`

? ? targets=(`echo $targetList`)

? ? targetsID=${targets[0]}


? ? /usr/libexec/PlistBuddy -c "Add :objects:${rootObject}:attributes:TargetAttributes:${targetsID}:" $pbxproj_path

? ? /usr/libexec/PlistBuddy -c "Add :objects:${rootObject}:attributes:TargetAttributes:${targetsID}:ProvisioningStyle String Manual" $pbxproj_path


? ? # xcode8 之后會(huì)自動(dòng)管理證書(shū)簽名,需要修改承受懂管理 (該命令yi9nggai可以刪除,但是先保留著)

? ? /usr/libexec/PlistBuddy -c "Set :objects:${rootObject}:attributes:TargetAttributes:${targetsID}:ProvisioningStyle? Manual" $pbxproj_path

? ? # xcode8 之后會(huì)自動(dòng)管理證書(shū)簽名庆亡,需要修改承受懂管理(該命令在文件格式變成plist之后失效,但仍需保留)

? ? sed -i "" s/'ProvisioningStyle = Automatic;'/'ProvisioningStyle = Manual;'/g ${project_name}.xcodeproj/project.pbxproj

? ? # xcode8 之后強(qiáng)行將所有 Automatic 改為 Manual

? ? sed -i "" s/'Automatic'/'Manual'/g ${project_name}.xcodeproj/project.pbxproj

? ? # 判斷編譯的項(xiàng)目類型是workspace還是project

? ? if $is_workspace ; then

? ? ? ? # 編譯前做clear操作

? ? ? ? xcodebuild clean -workspace ${project_name}.xcworkspace \

? ? ? ? -scheme ${scheme_name} \

? ? ? ? -configuration ${build_configuration}

? ? ? ? # archive操作

? ? ? ? xcodebuild archive -workspace ${project_name}.xcworkspace \

? ? ? ? -scheme ${scheme_name} \

? ? ? ? -configuration ${build_configuration} \

? ? ? ? -archivePath ${export_archive_path} CODE_SIGN_IDENTITY="${code_sign_identity}" PROVISIONING_PROFILE="${mobileprovision_uuid}" PRODUCT_BUNDLE_IDENTIFIER="${bundle_identifier}" ENABLE_BITCODE=${enable_bitcode}

? ? else

? ? ? ? xcodebuild clean -project ${project_name}.xcodeproj \

? ? ? ? -scheme ${scheme_name} \

? ? ? ? -configuration ${build_configuration}

? ? ? ? xcodebuild archive -project ${project_name}.xcodeproj \

? ? ? ? -scheme ${scheme_name} \

? ? ? ? -configuration ${build_configuration} \

? ? ? ? -archivePath ${export_archive_path} CODE_SIGN_IDENTITY="${code_sign_identity}" PROVISIONING_PROFILE="${mobileprovision_uuid}" PRODUCT_BUNDLE_IDENTIFIER="${bundle_identifier}" ENABLE_BITCODE=${enable_bitcode}

? ? fi

? ? #? 檢查是否構(gòu)建成功

? ? #? xcarchive 是一個(gè)文件夾不是一個(gè)文件所以使用 -d 判斷

? ? if [ -d "$export_archive_path" ] ; then

? ? ? ? echo "\033[37;45m項(xiàng)目構(gòu)建成功 \033[0m"

? ? else

? ? ? ? echo "\033[37;45m項(xiàng)目構(gòu)建失敗\033[0m"

? ? ? ? exit 1

? ? fi

}

ExportArchive() {

? ? echo "\033[37;45m*************************? step3:開(kāi)始導(dǎo)出ipa文件 *************************? \033[0m"

? ? sleep 0.5

? ? # 先刪除export_options_plist文件

? ? if [ -f "$ExportOptionsPlistPath" ] ; then

? ? ? ? echo "\033[37;45m${ExportOptionsPlistPath}文件存在匾乓,進(jìn)行刪除\033[0m"

? ? ? ? rm -f $ExportOptionsPlistPath

? ? fi

? ? # 根據(jù)參數(shù)生成export_options_plist文件

? ? /usr/libexec/PlistBuddy -c? "Add :method String ${method}"? $ExportOptionsPlistPath

? ? /usr/libexec/PlistBuddy -c? "Add :provisioningProfiles:"? $ExportOptionsPlistPath

? ? /usr/libexec/PlistBuddy -c? "Add :provisioningProfiles:${bundle_identifier} String ${mobileprovision_uuid}"? $ExportOptionsPlistPath

? ? # 導(dǎo)出ipa

? ? xcodebuild? -exportArchive \

? ? -archivePath ${export_archive_path} \

? ? -exportPath ${export_ipa_path} \

? ? -exportOptionsPlist ${ExportOptionsPlistPath} -allowProvisioningUpdates

? ? # 檢查ipa文件是否存在

? ? if [ -f "$export_ipa_path/$scheme_name.ipa" ] ; then

? ? ? ? echo "\033[32;1mexportArchive ipa包成功,準(zhǔn)備進(jìn)行重命名\033[0m"

? ? else

? ? ? ? echo "\033[31;1mexportArchive ipa包失敗 \033[0m"

? ? ? ? exit 1

? ? fi

? ? # 修改ipa文件名稱

? ? mv $export_ipa_path/$scheme_name.ipa $export_ipa_path/$ipa_name.ipa

? ? # 檢查文件是否存在

? ? if [ -f "$export_ipa_path/$ipa_name.ipa" ] ; then

? ? ? ? echo "\033[37;45m導(dǎo)出 ${ipa_name}.ipa 包成功\033[0m"

? ? else

? ? ? ? echo "\033[37;45m導(dǎo)出 ${ipa_name}.ipa 包失敗\033[0m"

? ? ? ? exit 1

? ? fi

? ? # 刪除export_options_plist文件(中間文件)

? ? if [ -f "$ExportOptionsPlistPath" ] ; then

? ? ? ? #echo "${ExportOptionsPlistPath}文件存在,準(zhǔn)備刪除"

? ? ? ? rm -f $ExportOptionsPlistPath

? ? fi

? ? # 輸出打包總用時(shí)

? ? echo "\033[37;46m總用時(shí): ${SECONDS}s \033[0m"

? ? # open $export_path

}

# 將build目錄下的ipa 上傳到pgyer

publishIPAToPgyer(){

? ? if [ -n "$pgyer_api_key" ] ; then

? ? ? ? echo "\033[37;46m*************************? 上傳中 *************************? \033[0m"

? ? ? ? curl --insecure -F "file=@$export_ipa_path/$ipa_name.ipa" -F "_api_key=$pgyer_api_key" https://www.pgyer.com/apiv2/app/upload

? ? ? ? echo "\033[37;46m*************************? 上傳完成 *************************? \033[0m"

? ? ? ? # 輸出總用時(shí)

? ? ? ? echo "\033[37;46m總用時(shí): ${SECONDS}s? \033[0m"

? ? fi

}

envionmentVariables

Xcodebuild

ExportArchive

publishIPAToPgyer

```

腳本中部分代碼是為了配合公司項(xiàng)目需求寫的又谋,我已經(jīng)大概刪除了拼缝,可能會(huì)有遺漏的地方,如果直接用代碼的人請(qǐng)稍微注意一下

PS:公司領(lǐng)導(dǎo)提出一個(gè)新的需求彰亥,說(shuō)iOS打包過(guò)程中咧七,輸出的日志太多,能不能在腳本中控制下輸出任斋,只輸出warning和報(bào)錯(cuò)信息继阻,我搜了一下,沒(méi)找到解決方案废酷,有沒(méi)有哪位大佬能指點(diǎn)一下瘟檩,先謝謝了。

2019.02.26 補(bǔ)充澈蟆,上面的問(wèn)題找到答案了

如果在執(zhí)行過(guò)程中又不喜歡日志輸出的墨辛,可以在命令行最后加上

-quiet? ? ?#只有 warn 和 error 才會(huì)輸出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趴俘,隨后出現(xiàn)的幾起案子睹簇,更是在濱河造成了極大的恐慌奏赘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件太惠,死亡現(xiàn)場(chǎng)離奇詭異志珍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垛叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伦糯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嗽元,你說(shuō)我怎么就攤上這事敛纲。” “怎么了剂癌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵淤翔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我佩谷,道長(zhǎng)旁壮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任谐檀,我火速辦了婚禮抡谐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桐猬。我一直安慰自己麦撵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布溃肪。 她就那樣靜靜地躺著免胃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惫撰。 梳的紋絲不亂的頭發(fā)上羔沙,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音厨钻,去河邊找鬼扼雏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莉撇,可吹牛的內(nèi)容都是我干的呢蛤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棍郎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼其障!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涂佃,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤励翼,失蹤者是張志新(化名)和其女友劉穎蜈敢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體汽抚,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抓狭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了造烁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片否过。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惭蟋,靈堂內(nèi)的尸體忽然破棺而出苗桂,到底是詐尸還是另有隱情,我是刑警寧澤告组,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布煤伟,位于F島的核電站,受9級(jí)特大地震影響木缝,放射性物質(zhì)發(fā)生泄漏便锨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一我碟、第九天 我趴在偏房一處隱蔽的房頂上張望放案。 院中可真熱鬧,春花似錦怎囚、人聲如沸卿叽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贩虾,卻和暖如春催烘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缎罢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工伊群, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策精。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓舰始,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咽袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丸卷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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