前提
伴隨著Xcode11
把Application Loader
刪除了凌简。打包上架變得又慢又卡,那么有什么好的辦法來(lái)實(shí)現(xiàn)一鍵打包并上架到App Store
或者上傳到第三方分發(fā)平臺(tái)呢。
一杖虾、shell腳本打包
1条辟、自動(dòng)打包
首先需要兩個(gè)文件,第一個(gè)是配置plist
,第二個(gè)shell
腳本胳施。
1.1 plist文件
注意
method
是根據(jù)打包的方式不同而有所區(qū)別验残,ad-hoc
或是app-store
那么我們?cè)趺慈カ@取這個(gè)plist
文件呢,這里我們用Xcode
去打包一次巾乳,得到如下文件您没。
文件夾中
ExportOptions.plist
就是我們想要的plist
文件了,拷貝出來(lái)備用胆绊。
1.2 shell腳本
#工程名 # workspace
project_name=AutoBuild
#打包模式 Debug/Release
development_mode=Release
# target
#scheme名 白名單 --- 平臺(tái)機(jī)制: qq <--> wechat
scheme_name=AutoBuild
#plist文件所在路徑--->描述文件 method (appstore adhoc)
exportOptionsPlistPath=./DevelopmentExportOptionsPlist.plist
#導(dǎo)出.ipa文件所在路徑
exportFilePath=~/Desktop/$project_name-ipa
# xcodebuild 命令 archive build clearn ....
echo '*** 正在 清理工程 ***'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '*** 清理完成 ***'
# 歸檔
echo '*** 正在 編譯工程 For '${development_mode}
xcodebuild \
archive -project ${project_name}.xcodeproj \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath build/${project_name}.xcarchive -quiet || exit
echo '*** 編譯完成 ***'
echo '*** 正在 打包 ***'
xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportFilePath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
# 刪除build包
if [[ -d build ]]; then
rm -rf build -r
fi
if [ -e $exportFilePath/$scheme_name.ipa ]; then
echo "*** .ipa文件已導(dǎo)出 ***"
cd ${exportFilePath}
echo "*** 開(kāi)始上傳.ipa文件 ***"
echo "*** .ipa文件上傳成功 ***"
else
echo "*** 創(chuàng)建.ipa文件失敗 ***"
fi
echo '*** 打包完成 ***'
注意:
1.更換自己的工程名字氨鹏、打包模式、
scheme
名压状、以及plist
文件路徑仆抵。
2.注意自己項(xiàng)目是否是普通工程還是cocoapods
工程,這里的腳本會(huì)不一樣种冬。
1.3 實(shí)戰(zhàn)如下
1.4 總結(jié)
到此镣丑,我們就可以用終端一條命令實(shí)現(xiàn)打包,避免了繁瑣的Xcode
打包處理娱两。
2莺匠、自動(dòng)打包并上傳到App Store、蒲公英十兢、fir平臺(tái)
2.1 注備階段
安裝fir-cli插件
文檔
$ gem install fir-cli
出現(xiàn)如下錯(cuò)誤
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
使用如下命令
$ sudo gem install -n /usr/local/bin fir-cli
又出現(xiàn)如下錯(cuò)誤
ERROR: Error installing fir-cli:
The last version of rubyzip (>= 1.1.6) to support your Ruby & RubyGems was 1.3.0. Try installing it with `gem install rubyzip -v 1.3.0` and then running the current command again
rubyzip requires Ruby version >= 2.4. The current ruby version is 2.3.7.456.
根據(jù)上面的錯(cuò)誤提示趣竣,讓我們嘗試使用gem install rubyzip -v 1.3.0
這條命令
$ gem install rubyzip -v 1.3.0
錯(cuò)誤如下
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
似曾相識(shí),就是第一條的錯(cuò)誤
使用sudo
$ sudo gem install rubyzip -v 1.3.0
出現(xiàn)如上界面旱物,安裝成功了
重大提醒
fir.im
更換域名后, 需要升級(jí)至 fir-cli >= 2.0.4
有部分用戶反饋 2.0.2
無(wú)法直接使用 gem update fir-cli
升級(jí)到 2.0.4
, 則可以嘗試卸載后重新安裝, 即 gem uninstall fir-cli
后 gem install fir-cli
重大提醒
fir更新文檔
2.2 shell腳本配置
#使用方法
if [ ! -d ./IPADir ];
then
mkdir -p IPADir;
fi
#工程絕對(duì)路徑
project_path=$(cd `dirname $0`; pwd)
#工程名 將XXX替換成自己的工程名
project_name=xxxx
#scheme名 將XXX替換成自己的sheme名
scheme_name=xxxx
#打包模式 Debug/Release
development_mode=Release
#build文件夾路徑
build_path=${project_path}/build
#plist文件所在路徑
exportOptionsPlistPath=${project_path}/exportAppstore.plist
#導(dǎo)出.ipa文件所在路徑
exportIpaPath=${project_path}/IPADir/${development_mode}
echo "請(qǐng)輸入你想法發(fā)布的方式 ? [ 1:app-store 2:ad-hoc] "
##
read number
while([[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "笨蛋遥缕,只能輸入 1 or 2"
echo "請(qǐng)輸入你想法發(fā)布的方式 ? [ 1:app-store 2:ad-hoc] "
read number
done
if [ $number == 1 ];
then
development_mode=Release
exportOptionsPlistPath=${project_path}/exportAppstore.plist
## 證書(shū)名字
else
development_mode=Debug
exportOptionsPlistPath=${project_path}/exportTest.plist
fi
echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '///--------'
echo '/// 清理完成'
echo '///--------'
echo ''
echo '///-----------'
echo '/// 正在編譯工程:'${development_mode}
echo '///-----------'
xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive -quiet || exit
echo '///--------'
echo '/// 編譯完成'
echo '///--------'
echo ''
echo '///----------'
echo '/// 開(kāi)始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
# 刪除build包
if [[ -d build ]]; then
rm -rf build -r
fi
if [ -e $exportIpaPath/$scheme_name.ipa ];
then
echo '///----------'
echo '/// ipa包已導(dǎo)出'
echo '///----------'
open $exportIpaPath
else
echo '///-------------'
echo '/// ipa包導(dǎo)出失敗 '
echo '///-------------'
fi
echo '///------------'
echo '/// 打包ipa完成 '
echo '///-----------='
echo ''
echo '///-------------'
echo '/// 開(kāi)始發(fā)布ipa包 '
echo '///-------------'
if [ $number == 1 ];
then
#驗(yàn)證并上傳到App Store
# 將-u 后面的XXX替換成自己的AppleID的賬號(hào),-p后面的XXX替換成自己的密碼
# 如果你是xcode11以前宵呛,未取消Application Loader 使用如下方法
# altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
# "$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u xxxx [-p xxx]
# "$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u xxxx -p xxx
# 如果你是xcode11 使用如下方法
xcrun altool --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u xxxx [-p xxx]
xcrun altool --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u xxx -p xxx
else
echo "請(qǐng)輸入你要發(fā)布的平臺(tái) ? [ 1:fir 2:蒲公英] "
##
read platform
while([[ $platform != 1 ]] && [[ $platform != 2 ]])
do
echo "笨蛋单匣,只能輸入 1 or 2"
echo "請(qǐng)輸入你要發(fā)布的平臺(tái) ? [ 1:fir 2:蒲公英] "
read platform
done
if [ $platform == 1 ];
then
echo "開(kāi)始上傳到fir"
#上傳到Fir
# 將XXX替換成自己的Fir平臺(tái)的token
fir login -T xxxx
fir publish $exportIpaPath/$scheme_name.ipa
else
echo "開(kāi)始上傳到蒲公英"
#上傳到蒲公英
#蒲公英aipKey
MY_PGY_API_K=xxx
#蒲公英uKey
MY_PGY_UK=xxxx
curl -F "file=@${exportIpaPath}/${scheme_name}.ipa" -F "uKey=${MY_PGY_UK}" -F "_api_key=${MY_PGY_API_K}" https://qiniu-storage.pgyer.com/apiv1/app/upload
fi
fi
echo "\n\n"
echo "已運(yùn)行完畢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
exit 0
2.3 上傳到App Store
注意:
如果你報(bào)如下錯(cuò)誤,不難看出宝穗,是因?yàn)槲覀冮_(kāi)啟了雙重認(rèn)證户秤,需要
app-specific password
。
接下來(lái)你需要去生成動(dòng)態(tài)密碼即可讽营。
2.4 上傳蒲公英
2.5 上傳fir
二虎忌、fastlane打包
2.1 注備階段
安裝fastlane
$ sudo gem install fastlane
錯(cuò)誤如下
ERROR: Error installing fastlane:
The last version of signet (~> 0.9) to support your Ruby & RubyGems was 0.11.0. Try installing it with `gem install signet -v 0.11.0` and then running the current command again
signet requires Ruby version >= 2.4.0. The current ruby version is 2.3.7.456.
根據(jù)上面的錯(cuò)誤提示,讓我們嘗試使用gem install signet -v 0.11.0
這條命令
gem install signet -v 0.11.0
錯(cuò)誤如下
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
還是老問(wèn)題橱鹏,沒(méi)有權(quán)限膜蠢,使用sudo
$ sudo gem install signet -v 0.11.0
成功之后在執(zhí)行
$ sudo gem install fastlane
出現(xiàn)如上界面堪藐,安裝成功了!
拓展
第一點(diǎn)
Podfile.lock
的作用
防止多人開(kāi)發(fā)本地CocoaPods
版本不一致
2.2 接下來(lái)我們正式使用fastlane
$ fastlane init
這里讓我們選擇打包到
App Store
和TestFlight
。這里我們選擇2
挑围。如果你出現(xiàn)如下結(jié)果礁竞,已經(jīng)卡死在這里了,選擇退出杉辙。
使用如下命令模捂。
$ bundle install
我們來(lái)看下
fastlane
文件夾中的Fastfile
default_platform(:ios)
platform :ios do
desc "Push a new release build to the testflight"
lane :testflight do
increment_build_number(xcodeproj: "AutoBuild.xcodeproj")
build_app(workspace: "AutoBuild.xcworkspace", scheme: "AutoBuild")
upload_to_testflight
end
end
可以看出打包模式只有testflight
,之后我們會(huì)滿滿豐滿這里面的內(nèi)容蜘矢,且往下看狂男。
繼續(xù)使用如下命令
$ fastlane
注意
1
是打包到TestFlight
,與Fastfile
文件中的平臺(tái)對(duì)應(yīng)
因?yàn)槲覀冮_(kāi)啟了雙向認(rèn)證,所以輸入我們的雙向認(rèn)證密碼品腹。
打包成功岖食,這里可以看到很多信息,比如版本舞吭,
build
號(hào)以及打包所用的時(shí)間泡垃。2.3 把ipa
上傳到第三方平臺(tái)
首先我們需要安裝插件,首先看看如下幾個(gè)命令羡鸥。
查詢插件
fastlane search_plugins
安裝蒲公英插件
fastlane add_plugin pgyer
安裝fir插件
fastlane add_plugin firim
安裝成功后蔑穴,可以在當(dāng)前目錄的fastlane
下生成一個(gè)Pluginfile
文件,文件內(nèi)容如下
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-pgyer'
gem 'fastlane-plugin-firim'
現(xiàn)在我們開(kāi)始豐滿一下我們的Fastfile
的platform
信息
default_platform(:ios)
platform :ios do
desc "Push a new release build to the testflight"
lane :testflight do
increment_build_number(xcodeproj: "AutoBuild.xcodeproj")
build_app(workspace: "AutoBuild.xcworkspace", scheme: "AutoBuild")
upload_to_testflight
end
desc "Push a new release build to the App Store"
lane :release do
increment_build_number(xcodeproj: "AutoBuild.xcodeproj")
build_app(workspace: "AutoBuild.xcworkspace", scheme: "AutoBuild")
upload_to_app_store
end
desc "Push a new release build to the 蒲公英"
lane :pgyAction do
increment_build_number(xcodeproj: "AutoBuild.xcodeproj")
build_app(workspace: "AutoBuild.xcworkspace", scheme: "AutoBuild")
pgyer(api_key:"你的api_key",
user_key:"你的user_key")
end
desc "Push a new release build to the firim"
lane :firimAction do
increment_build_number(xcodeproj: "AutoBuild.xcodeproj")
build_app(workspace: "AutoBuild.xcworkspace", scheme: "AutoBuild")
firim(firim_api_token:"你的firim_api_token")
end
end
重新輸入
fastlane
可以看出來(lái)惧浴,目前有四種方式選擇存和,分別對(duì)應(yīng)我們的TestFlight
、線上release
赶舆、蒲公英
以及fir
哑姚。
接下來(lái)我們以
蒲公英為例
(其他平臺(tái)方式都一致):可以看到上傳成功
注意
[!] Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions
可能是你安裝pgyer
插件的時(shí)候祭饭,不是在項(xiàng)目下安裝的芜茵,這個(gè)插件必須在項(xiàng)目下面安裝。
到此倡蝙,我們的fastlane
就已經(jīng)實(shí)現(xiàn)了自動(dòng)化打包谷丸。
三菲盾、Jenkins持續(xù)化集成
待更新