由于之前項目忙,加上第一次寫的時候還是Xcode7. 因此一些xcodebuild的命令參數已經發生變化了。私下看到很多同學詢問解決問題,在此說聲抱歉,并更新了一下plist導出文件。
RN項目中的iOS打包jsbundle,ipa包,發布測試不得不說是一件非常讓人頭疼的問題。??
每次寫好js代碼以后,需要打包發布測試的時候都需要做一大堆工作。??
這里我們先分析一下哪些問題是我們必須要做的和想要獲取的功能
1.首先真機運行時,RN項目需要一個jsbunlde包和assets包來獲取所有的js代碼和資源文件。
2.我們需要生成并記錄每個不同版本生成的jsbunlde包。尤其對于需要測試增量更新,或者普通熱更新的項目。
3.記錄每次打包生成的一些配置參數和必要數據也是我們需要的。
4.自動打包adhoc的ipa包用于測試。
5.自動上傳到fir.im發布ipa包,并添加本次修改的信息。
6.生成一個jsbunlde的需求,用于熱更新或者增量更新的使用。
7.自動記錄每次打包更新的一些新功能描述。
分析了我們需求后,那接下來就用shell腳本來幫助我們一同來構建整個自動化的過程。
這里,我們演示使用AdHoc方式打包測試。
假設當前項目中的p12,adhoc配置文件已經安裝的情況下,如果有不知道p12,adhoc配置文件是什么的新同學,建議還是先去百度一下吧??。
下面是shell在項目中的使用,創建一個.sh文件來編寫腳本
有同學反映了一些使用中的問題。這里說明一下,下面的這個腳本僅支持cocoapods方式的ios工程的打包,上傳的測試平臺是fir.im
#!/bin/sh
#請配置如下打包信息
#項目中文昵稱
projectChineseName=XXXX
#項目工程名字
projectName=XXXX
#fir.im的Token
firToken=XXXX
#編譯條件 Realse Debug 兩種
configuration=Realse
echo "請輸入此版本更新的內容描述:\n"
read answer
bundle=./ios/bundle
if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi
mkdir ${bundle}
react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle
cd ios
#記錄一下當前jsbundle路徑
jsbundlePath=`pwd`
xcodebuild clean -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration}
xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration} -archivePath ../${projectName}.xcarchive
#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄
if [ ! -d "${exportPathDir}" ]; then
mkdir ${exportPathDir}
fi
#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")
if [ ! -d "${exportPath}" ]; then
mkdir ${exportPath}
fi
xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"
cd ${exportPath}
#登錄fir.im
fir login -T ${firToken}
#發布到fir.im
fir publish ${projectName}.ipa -Q --changelog="本次修改描述: $answer "
#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}
#保留xcarchive文件
cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}
cd ${exportPath}
fir info ${projectName}.ipa > logfile.txt
echo "本版本更新描述: $answer " >> logfile.txt
echo " ??自動打包并上傳fir.im成功~~~??"
open .
可能你有些夢?? 沒關系。我們一起來回想一下我們的需求,在一起結合我們的腳本看看它到底做了些什么??
首先:我們需要將腳本放置于RN工程首目錄下,與iOS工程同級目錄
1:每個項目都需要一些基本設置,例如項目的名字,其實大部分情況下也是xcode編譯時候的scheme選項,其次是編譯的條件,例如debug或者是release。同時我們可能需要做所有歷史打包信息的自動記錄,那么一定少不了一個文件夾目錄,鑒于方便易懂,這里就添加了一個中文名文件夾的參數選項,英文不好的同學有沒有覺得很人性化呢??
#項目中文昵稱
projectChineseName=XXX
#項目工程名字
projectName=XXXX
#fir.im的Token
firToken=XXXX
#編譯條件 Realse Debug 兩種
configuration=Realse
不同的應用,僅僅需要修改這里的配置信息即可
2:首先我們可能需要腳本執行以后,提示我,當前次的更新需要添加一些描述信息,用于記錄本次更新的內容,方便未來的查看以及上傳fir.im的時候自動添加到更新描述上面去
echo "請輸入此版本更新的內容描述:\n"
read answer
就是用于記錄我們的描述信息
3:我們需要生成jsbundle,而且這個文件生成后,要自動放入到ios工程目錄下,這樣打包ipa的時候,才能自動嵌入ipa包中,這里提醒一下,一定要將之前項目中的舊包刪除掉
bundle=./ios/bundle
if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi
mkdir ${bundle}
react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle
4:接下來我們就需要用到之前有講過的xcodebuild命令去先clean一下工程,clean工程是因為每次xcode在調試的時候,都會自動在當前目錄生成一些編譯后的一些文件,日志等,這些對我們打包是無用的。
這里面主要展示使用pod的項目,指明了pod的workspace。如果項目中未使用pod,修改為-workspace
{projectName}.xcodeproj
xcodebuild clean -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration}
5:開始存放我們的工程,并生成存檔文件,而且,這里的存檔文件我們非常有必要記錄下來,上線項目中產生的crashlog,可以通過該文件,分析出crash的具體代碼,那這里一定要記錄好當前生成.xcarchive文件的路徑,等后面編譯結束后,我們再整合起來
xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration} -archivePath ../${projectName}.xcarchive
6:想要強大的歷史包記錄,一定少不了一個文件夾去記錄,這里我選擇在Documents而不是Desktop想必你懂的,至少我的桌面是不堪入目的,Documents目錄下還是一片凈土
#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄
if [ ! -d "${exportPathDir}" ]; then
mkdir ${exportPathDir}
fi
7:想要做到每次打包生成的記錄都不重合,那么就根據當前打包的時間來創建新的一層文件結構吧
#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")
if [ ! -d "${exportPath}" ]; then
mkdir ${exportPath}
fi
8:文件歷史目錄結構都有了,接下來,開始打包ipa了,并存入該文件目錄中去
欣喜的同學一定發現了AdHocOptions.plist文件是個什么??。
這里還是貼出來一下吧,請贊我是大好人,其實就是打包的配置信息。
點擊贊我下載plist文件,下載后,防止與RN工程根目錄,與shell腳本同級。
如果想要有更多的需求,終端輸入xcodebuild -h 命令。
自己查看Available keys for -exportOptionsPlist詳情哦??
xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"
9:ipa都打好了,不用多少,我們要趕緊登陸fir.im網站,并自動上傳到fir,同時,生成一個二維碼下載圖片.具體的fir-cli,查看傳送門吧
cd ${exportPath}
#登錄fir.im
fir login -T ${firToken}
#發布到fir.im
fir publish ${projectName}.ipa -Q --changelog="本次修改描述: $answer "
10:說要的要記錄每次jsbunle千萬不能忘
#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}
11:說好的記錄.xcarchive文件也千萬不能忘
cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}
12:僅僅記錄這么點信息哪里夠呢,每次打包的信息我們最好也記錄一下,方便后面的查看
cd ${exportPath}
fir info ${projectName}.ipa > logfile.txt
echo "本版本更新描述: $answer " >> logfile.txt
至此,一個自動打包jsbundle,自動生成ipa,上傳fir.im,記錄所有打包信息的文件目錄結構就完成了,給shell腳本起一個響亮的名字吧
OneKeyPackageForIOS如何,ios一鍵打包腳本
看一下要如何使用這個腳本
打包后生成的文件目錄
logfile.txt文件記錄的信息
fir.im的信息
到此,本以為我們的一鍵打包的腳本就完成了。其實在其他項目,僅僅替換掉最開始項目參數的可以隨意使用哦~但鑒于其他同學的工程可能沒有使用cocoapods來管理原聲的ios的代碼,獲取開發人員根本就不懂ios,壓根就沒有使用過cocoapods等等一些情況,也有同學說,可不可以上傳到蒲公英網站呢?
答案是:YES
來吧,好人做到底。下面是修改了以后的腳本代碼,支持打包adhoc版本的ipa包,上傳到蒲公英網站,并且聲稱更新描述,以及jsbundle等。
#!/bin/sh
#請配置如下打包信息
#項目中文昵稱
projectChineseName=XXXX
#項目工程名字
projectName=XXXX
#蒲公英配置的參數
APIKey=""
UserKey=""
#編譯條件 Realse Debug 兩種
configuration=Realse
echo "請輸入此版本更新的內容描述:\n"
read answer
bundle=./ios/bundle
if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi
mkdir ${bundle}
react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle
cd ios
#記錄一下當前jsbundle路徑
jsbundlePath=`pwd`
xcodebuild archive -project ${projectName}.xcodeproj -scheme ${projectName} -configuration ${configuration} -archivePath ../${projectName}.xcarchive
#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄
if [ ! -d "${exportPathDir}" ]; then
mkdir ${exportPathDir}
fi
#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")
if [ ! -d "${exportPath}" ]; then
mkdir ${exportPath}
fi
xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"
cd ${exportPath}
#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}
#保留xcarchive文件
cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}
cd ${exportPath}
#上傳至蒲公英
curl -i -F "file=@malugongyuanList.ipa" \
-F "uKey=$UserKey" \
-F "_api_key=$APIKey" \
-F "updateDescription=$answer" \
http://qiniu-storage.pgyer.com/apiv1/app/upload \
echo "本版本更新描述: $answer " >> logfile.txt
echo " ??自動打包并上傳fir.im成功~~~??"
open .
~至此,結束!
有任何問題,歡迎隨時call me??