2019-02-22 iOS自動打包腳本(絕對不用xcode打開做任何操作)

首先感謝一下無數大佬在網上的分享,才能讓我完成這個腳本


由于之前的編輯模式沒有切換,導致這篇文章看起來挺惡心的,我在2019-03-14 iOS自動打包腳本ProvisioningStyle字段(對之前文章的補充)對這篇文進行了分解,建議先看分解的文章,本篇是完整代碼



介紹一下,腳本使用背景,很多做react-native開發的工程師不一定用的是Mac電腦,所以打iOS的ipa包就沒有Xcode工具去圖形界面上操作,比如勾選證書、pp文件之類的,而且網上大佬們分享的,大都是Xcode8之前的使用腳本,而Xcode8開始有了自動管理簽名文件功能,并且是默認的,所以很多腳本都掛了,針對這個問題有的腳本中也做了處理,但對那些從來沒有用Xcode打開并操作過的項目就沒有用了。下面我就是直接把自己的腳本代碼貼上來了,請各位指教,因為我不會腳本語言,這份腳本是我從網上搜索的各種資料,還請教了一些寫后臺的同事,所以與很多不足,希望大家可以指點一二,幫我優化一下,謝謝。

```

#!/bin/sh

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

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

# 預先定義對應的環境變量

envionmentVariables(){

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

? ? # 打包時間初始值

? ? SECONDS=0

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

? ? is_workspace="false"

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

? ? build_configuration="Release"

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

? ? pgyer_api_key="*******蒲公英賬號的key**********"?

? ? #add new

? ? # 證書

? ? code_sign_identity="*********證書名********"

? ? # 描述文件UUID

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

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

? ? method="enterprise"

? ? #

? ? enable_bitcode="NO"

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

? ? script_path=$(pwd)

? ? # 工程中Target對應的配置plist文件名稱, Xcode默認的配置文件為info.plist

? ? info_plist_name="info"

? ? # 導出ipa所需要的對應的plist文件路徑 (默認為EnterpriseExportOptionsPlist.plist)

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

? ? # 返回上上級目錄,進入項目工程根目錄

? ? # 工程根目錄

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

? ? cd "$project_dir"

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

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

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

? ? scheme_name="$project_name"?

? ? # 指定bundleid 名為 com.testtest.項目名

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

? ? # 獲取對應的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

? ? # 對應plist中的Bundle versions string, short

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

? ? # 對應plist中的Bundle version

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


? ? #add new

? ? # 對應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 "--------------------腳本配置參數檢查--------------------"

? ? 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:開始構建項目? *************************? \033[0m"

? ? sleep 1

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

? ? ? ? echo $export_path

? ? else

? ? ? ? mkdir $export_path

? ? fi

? ? # 在 project.pbxproj文件中藥添加三行代碼,不會啊。。。

? ? 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 之后會自動管理證書簽名,需要修改承受懂管理 (該命令yi9nggai可以刪除,但是先保留著)

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

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

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

? ? # xcode8 之后強行將所有 Automatic 改為 Manual

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

? ? # 判斷編譯的項目類型是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

? ? #? 檢查是否構建成功

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

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

? ? ? ? echo "\033[37;45m項目構建成功 \033[0m"

? ? else

? ? ? ? echo "\033[37;45m項目構建失敗\033[0m"

? ? ? ? exit 1

? ? fi

}

ExportArchive() {

? ? echo "\033[37;45m*************************? step3:開始導出ipa文件 *************************? \033[0m"

? ? sleep 0.5

? ? # 先刪除export_options_plist文件

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

? ? ? ? echo "\033[37;45m${ExportOptionsPlistPath}文件存在,進行刪除\033[0m"

? ? ? ? rm -f $ExportOptionsPlistPath

? ? fi

? ? # 根據參數生成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

? ? # 導出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包成功,準備進行重命名\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導出 ${ipa_name}.ipa 包成功\033[0m"

? ? else

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

? ? ? ? exit 1

? ? fi

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

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

? ? ? ? #echo "${ExportOptionsPlistPath}文件存在,準備刪除"

? ? ? ? rm -f $ExportOptionsPlistPath

? ? fi

? ? # 輸出打包總用時

? ? echo "\033[37;46m總用時: ${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"

? ? ? ? # 輸出總用時

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

? ? fi

}

envionmentVariables

Xcodebuild

ExportArchive

publishIPAToPgyer

```

腳本中部分代碼是為了配合公司項目需求寫的,我已經大概刪除了,可能會有遺漏的地方,如果直接用代碼的人請稍微注意一下

PS:公司領導提出一個新的需求,說iOS打包過程中,輸出的日志太多,能不能在腳本中控制下輸出,只輸出warning和報錯信息,我搜了一下,沒找到解決方案,有沒有哪位大佬能指點一下,先謝謝了。

2019.02.26 補充,上面的問題找到答案了

如果在執行過程中又不喜歡日志輸出的,可以在命令行最后加上

-quiet? ? ?#只有 warn 和 error 才會輸出

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容