首先感謝一下無數大佬在網上的分享,才能讓我完成這個腳本
由于之前的編輯模式沒有切換,導致這篇文章看起來挺惡心的,我在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 才會輸出