首先感謝一下無(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ì)輸出