前提
伴随着Xcode11
把Application Loader
删除了。打包上架变得又慢又卡,那么有什么好的办法来实现一键打包并上架到App Store
或者上传到第三方分发平台呢。
一、shell脚本打包
1、自动打包
首先需要两个文件,第一个是配置plist
,第二个shell
脚本。
1.1 plist文件
注意
method
是根据打包的方式不同而有所区别,ad-hoc
或是app-store
那么我们怎么去获取这个plist
文件呢,这里我们用Xcode
去打包一次,得到如下文件。
文件夹中
ExportOptions.plist
就是我们想要的plist
文件了,拷贝出来备用。
1.2 shell脚本
#工程名 # workspace
project_name=AutoBuild
#打包模式 Debug/Release
development_mode=Release
# target
#scheme名 白名单 --- 平台机制: qq <--> wechat
scheme_name=AutoBuild
#plist文件所在路径--->描述文件 method (appstore adhoc)
exportOptionsPlistPath=./DevelopmentExportOptionsPlist.plist
#导出.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文件已导出 ***"
cd ${exportFilePath}
echo "*** 开始上传.ipa文件 ***"
echo "*** .ipa文件上传成功 ***"
else
echo "*** 创建.ipa文件失败 ***"
fi
echo '*** 打包完成 ***'
注意:
1.更换自己的工程名字、打包模式、
scheme
名、以及plist
文件路径。
2.注意自己项目是否是普通工程还是cocoapods
工程,这里的脚本会不一样。
1.3 实战如下
1.4 总结
到此,我们就可以用终端一条命令实现打包,避免了繁琐的Xcode
打包处理。
2、自动打包并上传到App Store、蒲公英、fir平台
2.1 注备阶段
安装fir-cli插件
文档
$ gem install fir-cli
出现如下错误
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
又出现如下错误
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.
根据上面的错误提示,让我们尝试使用gem install rubyzip -v 1.3.0
这条命令
$ gem install rubyzip -v 1.3.0
错误如下
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
似曾相识,就是第一条的错误
使用sudo
$ sudo gem install rubyzip -v 1.3.0
出现如上界面,安装成功了
重大提醒
fir.im
更换域名后, 需要升级至 fir-cli >= 2.0.4
有部分用户反馈 2.0.2
无法直接使用 gem update fir-cli
升级到 2.0.4
, 则可以尝试卸载后重新安装, 即 gem uninstall fir-cli
后 gem install fir-cli
重大提醒
fir更新文档
2.2 shell脚本配置
#使用方法
if [ ! -d ./IPADir ];
then
mkdir -p IPADir;
fi
#工程绝对路径
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
#导出.ipa文件所在路径
exportIpaPath=${project_path}/IPADir/${development_mode}
echo "请输入你想法发布的方式 ? [ 1:app-store 2:ad-hoc] "
##
read number
while([[ $number != 1 ]] && [[ $number != 2 ]])
do
echo "笨蛋,只能输入 1 or 2"
echo "请输入你想法发布的方式 ? [ 1:app-store 2:ad-hoc] "
read number
done
if [ $number == 1 ];
then
development_mode=Release
exportOptionsPlistPath=${project_path}/exportAppstore.plist
## 证书名字
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 '/// 开始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包已导出'
echo '///----------'
open $exportIpaPath
else
echo '///-------------'
echo '/// ipa包导出失败 '
echo '///-------------'
fi
echo '///------------'
echo '/// 打包ipa完成 '
echo '///-----------='
echo ''
echo '///-------------'
echo '/// 开始发布ipa包 '
echo '///-------------'
if [ $number == 1 ];
then
#验证并上传到App Store
# 将-u 后面的XXX替换成自己的AppleID的账号,-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 "请输入你要发布的平台 ? [ 1:fir 2:蒲公英] "
##
read platform
while([[ $platform != 1 ]] && [[ $platform != 2 ]])
do
echo "笨蛋,只能输入 1 or 2"
echo "请输入你要发布的平台 ? [ 1:fir 2:蒲公英] "
read platform
done
if [ $platform == 1 ];
then
echo "开始上传到fir"
#上传到Fir
# 将XXX替换成自己的Fir平台的token
fir login -T xxxx
fir publish $exportIpaPath/$scheme_name.ipa
else
echo "开始上传到蒲公英"
#上传到蒲公英
#蒲公英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 "已运行完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
exit 0
2.3 上传到App Store
注意:
如果你报如下错误,不难看出,是因为我们开启了双重认证,需要
app-specific password
。
接下来你需要去生成动态密码即可。
2.4 上传蒲公英
2.5 上传fir
二、fastlane打包
2.1 注备阶段
安装fastlane
$ sudo gem install fastlane
错误如下
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.
根据上面的错误提示,让我们尝试使用gem install signet -v 0.11.0
这条命令
gem install signet -v 0.11.0
错误如下
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
还是老问题,没有权限,使用sudo
$ sudo gem install signet -v 0.11.0
成功之后在执行
$ sudo gem install fastlane
出现如上界面,安装成功了!
拓展
第一点
Podfile.lock
的作用
防止多人开发本地CocoaPods
版本不一致
2.2 接下来我们正式使用fastlane
$ fastlane init
这里让我们选择打包到
App Store
和TestFlight
。这里我们选择2
。如果你出现如下结果,已经卡死在这里了,选择退出。
使用如下命令。
$ bundle install
我们来看下
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
,之后我们会满满丰满这里面的内容,且往下看。
继续使用如下命令
$ fastlane
注意
1
是打包到TestFlight
,与Fastfile
文件中的平台对应
因为我们开启了双向认证,所以输入我们的双向认证密码。
打包成功,这里可以看到很多信息,比如版本,
build
号以及打包所用的时间。2.3 把ipa
上传到第三方平台
首先我们需要安装插件,首先看看如下几个命令。
查询插件
fastlane search_plugins
安装蒲公英插件
fastlane add_plugin pgyer
安装fir插件
fastlane add_plugin firim
安装成功后,可以在当前目录的fastlane
下生成一个Pluginfile
文件,文件内容如下
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-pgyer'
gem 'fastlane-plugin-firim'
现在我们开始丰满一下我们的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
可以看出来,目前有四种方式选择,分别对应我们的TestFlight
、线上release
、蒲公英
以及fir
。
接下来我们以
蒲公英为例
(其他平台方式都一致):可以看到上传成功
注意
[!] Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions
可能是你安装pgyer
插件的时候,不是在项目下安装的,这个插件必须在项目下面安装。
到此,我们的fastlane
就已经实现了自动化打包。
三、Jenkins持续化集成
待更新