iOS shell实现自动打包修改网络环境、自动命名并上传svn
设计自动打包的原因
对于多个项目的情况下,测试包要的频繁,而且手动切换网络的时候,有时可能写错了还不知道,对于我们iOS来说,我们的线上包和测试包是不一样的证书有区别,防止测试看的包和我们打的线上包不一致的情况发生,自动打包就尤为重要,省区自动命名导出上传svn等没有智商的工作.自动打包方便了我们,我今天讲的是使用xcode自带的xcodebuild来打包,使用它来做打包的原因是,成本低,不用在安装一些第三方插件什么的.
1修改网络环境
修改网络环境 参数网络环境
将网络全局文件修改为如下方式进行网络切换 我是放在ServiceConstant这个文件中,你可以自定义文件
// 在此处切换环境变量 1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内
#define APPType 1
#if APPType == 1 // 生产cs
#define kAPPBaseUrl @""
#elif APPType == 2 // 预发布
#define kAPPBaseUrl @""
#elif APPType == 3 // 测试 外
#define kAPPBaseUrl @“”
#else //测试 内
#define kAPPBaseUrl @“”
#endif
modifyServicehost(){
#判断参数是否为空
if [ ! -n "$1" ]
then
echo "请输入参数:网络环境:1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内 5:appstore线上环境"
exit
fi
xhlhost=${1}
#-gt 检测左边的数是否大于右边的,如果是,则返回 true。
#-lt 检测左边的数是否小于右边的,如果是,则返回 true。
if [[ $xhlhost -gt 5 || $xhlhost -lt 1 ]]
then
echo "请输入参数:网络环境:1:生产环境 2:预发布环境 3:测试环境外 4:测试环境内 5:appstore线上环境"
exit
fi
modifyHost=$xhlhost
if [ $xhlhost == 5 ];then #线上appStore环境
modifyHost=1
fi
#修改网络环境
echo $modifyHost
for ServiceConstant in 1 2 3 4
do
#修改网络状态,Constant/ServiceConstant.h自己的文件路径
sed -i "" "s/#define APPType ${ServiceConstant}/#define APPType ${modifyHost}/g" ${projectName}/Constant/ServiceConstant.h
done
severPath=''
case $xhlhost in
1) severPath='生产环境'
;;
2) severPath='预发布环境'
;;
3) severPath='测试环境'
;;
4) severPath='测试环境'
;;
5) severPath='appstore线上环境'
;;
esac
#检测网络是否成功
if [ `grep -c "#define APPType $modifyHost" ${projectName}/Constant/ServiceConstant.h` -eq '0' ]; then
echo "网络没有修改成功.请检查ServiceConstant.h文件"
exit
else
echo '网络环境切换:'$severPath' 成功'
fi
#调用打包
iosBuildIpa $xhlhost
}
iOS使用xcodebuild打包
创建2个pilst表,一个表示appStore的,一个表示develpent开发环境的
#自动打包脚本 参数网络环境
iosBuildIpa(){
xhlhost=$1
echo $xhlhost
# 删除build包
if [[ -d build ]]; then
rm -rf build -r
fi
#工程名
project_name=$projectName
#打包模式 Debug/Release
development_mode=Debug
#scheme名
scheme_name=$projectName
appStoreExport=$projectPath/AppStoreExportOptionsPlist.plist
#plist文件所在路径
if [ $xhlhost == 5 ]
then #线上appStore环境
exportOptionsPlistPath=$appStoreExport
echo 'appstore线上包正在打.....'
else
exportOptionsPlistPath=$projectPath/DevelopmentExportOptionsPlist.plist
echo '测试包正在打.....'
fi
#导出.ipa文件所在路径
exportFilePath=~/Desktop/XHL_AAU/${appName}`date +%Y-%m-%d`'-ipa'
echo '*** 正在 清理工程 ***'
xcodebuild \
clean -configuration ${development_mode} -quiet || exit
echo '*** 清理完成 ***'
echo '*** 正在 编译工程 For '${development_mode}
xcodebuild \
archive -workspace ${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath build/${project_name}.xcarchive || exit
echo '*** 编译完成 ***'
echo '*** 正在 打包 ***'
xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportFilePath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-quiet || exit
if [ -e $exportFilePath/$scheme_name.ipa ]; then
echo "*** .ipa文件已导出 ***"
# cd ${exportFilePath}
# echo "*** 开始上传.ipa文件 ***"
echo ${exportFilePath} "包名"
echo $exportFilePath/$scheme_name.ipa "ipa路径"
if [[ $xhlhost == 5 || $xhlhost == 1 ]]
then
#备份dSYM
archive_path=build/${project_name}.xcarchive
dsym_path=${archive_path}/dSYMs/${project_name}.app.dSYM/Contents/Resources/DWARF/${project_name}
cp -R "${dsym_path}" "${exportFilePath}/${project_name}.dSYM"
fi
# #此处上传分发应用
# echo "*** .ipa文件上传成功 ***"
else
echo "*** 创建.ipa文件失败 ***"
fi
echo '*** 打包完成 ***'
renameIpa $xhlhost $exportFilePath/$scheme_name.ipa
#线上环境同时导出一个线上包
if [ $xhlhost == 1 ]
then #线上appStore环境
echo '*** 正在 打appStore包 ***'
xcodebuild -exportArchive -archivePath build/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportFilePath}/'appstore' \
-exportOptionsPlist ${appStoreExport} \
-quiet || exit
echo '*** appstore包打包完成 ***'
renameIpa 5 ${exportFilePath}/'appstore'/$scheme_name.ipa
fi
# 删除build包
if [[ -d build ]]; then
rm -rf build -r
fi
}
对导出的ipa包进行重命名,我们这里是要求的时间—V版本号—构建号—环境
原理:将ipa解压,取出里面的plist表获取版本号和构建号,重命名
#修改文件名 第一个参数网络环境,第二个参数ipa路径
renameIpa(){
#脚本接收一个参数是ipa路径
severHost=$1
#ipa路径
IPA_FILE=$2
#解压路径
IPA_DIR=.ipaTemp
#删除临时解包目录
if [ -d "$IPA_DIR" ]; then
echo "rm ipatemp"
rm -rf "${IPA_DIR}"
else
echo "mkdir ipatemp"
mkdir -p "${IPA_DIR}"
fi
#解包IPA
if [[ -f "$IPA_FILE" ]]; then
echo "unzip $IPA_FILE begin ..."
unzip -q "$IPA_FILE" -d "$IPA_DIR"
if [[ $? != 0 ]]; then
echo "unzip $IPA_FILE failed"
exit 2
else
echo "unzip $IPA_FILE successed"
fi
fi
# 定位到*.app目录
appDir="$IPA_DIR/Payload/`ls "$IPA_DIR/"Payload`"
infoPlist="${appDir}/Info.plist"
echo $appDir
echo ${infoPlist}
#构建号
CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" $infoPlist`
echo 'CFBundleVersion:'$CFBundleVersion
#版本号
CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" $infoPlist`
echo 'CFBundleShortVersionString:'$CFBundleShortVersionString
ls_date=`date +%Y%m%d`
echo $ls_date
severStr='' #ipa环境命名
case $severHost in
1) severStr='prod_1'
;;
2) severStr='ready_1'
;;
3) severStr='test_1'
;;
4) severStr='test_1'
;;
5) severStr='prod' #appstore线上环境
;;
esac
ipaName=$ls_date"_V"${CFBundleShortVersionString}'_'${CFBundleVersion}'_'$severStr'.ipa'
echo $ipaName
echo $IPA_FILE
newIpaName=$(dirname "$IPA_FILE")
newIpaPath="$newIpaName/$ipaName" #命名后的文件
echo $newIpaName
echo $newIpaPath
mv -f "$IPA_FILE" $newIpaPath
# if [ ! -f "$newIpaPath" ];then
# echo '重命名成功 $newIpaPath'
# else
# echo "重命名失败"
# exit
# fi
echo '重命名成功'
rm -rf "${IPA_DIR}"
uploadSvn $severHost $newIpaPath
}
上传svn或者蒲公英
#上传svn路径
#第一个个参数网络环境,第二个参数本地ipa路径
uploadSvn(){
echo '上传svn.......'
severHost=$1 #网络环境地址 正式环境,测试环境,预发布
ipaPath=$2
severPath='' #ipa路径
case $severHost in
1) severPath='生产环境'
;;
2) severPath='预发布环境'
;;
3) severPath='测试环境'
;;
4) severPath='测试环境'
;;
esac
ipaFile=${ipaPath##*/} #获取目录下的文件
echo $ipaFile
echo $severPath
if [ $severHost == 5 ];then #线上appStore环境
svnPath="" svn appStore线上路径
else
svnPath=“”svn路径 测试路径
fi
echo $svnPath
svn delete -m "修改文件" $svnPath
svn import -m "New Import" $ipaPath $svnPath
echo '上传svn成功'
echo "请到${svnPath}查看"
#自动上传到蒲公英
# curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload
# USER_KEY='d9382d83bcdf6e5ce6e4361e9e63bbeb'
# API_KEY='1c9264c3a4e879976950a3f4787cd396'
# curl -F "file=@{$ipaPath}" \
# -F "uKey={$USER_KEY}" \
# -F "_api_key={$API_KEY}" \
# https://www.pgyer.com/apiv1/app/upload
}
注意的点,
1.网络请求必须在ServiceConstant.h文件中
2.ServiceConstant.h文件中的网络请必须用宏定义域变异判断操作
#define APPType 4
这句代码格式不能改,包括空格
3.必须保证项目能跑起来,不报错
4.在执行过程中可能需要输入你的svn账号和密码
5.保证项目证书环境
执行打包
1.cd到AAU目录下
2.执行./AAU.sh 中间屏幕就会一直滚动起来,并打印一些日志,注意看是否有错
执行完整代码
cd AAU所在目录
./AAU.sh 1 //带参数:1线上,2予发布,3测试外网,4测试内网这个可能跟你代码中自己判断有区别,自己对照
到这一步,所有打包流程都完成了,在svn查看自己包是否打包成功
执行中的可能遇到的错误错误解决
执行./AAU.sh 提示没有权限
chmod a+x ./AAU.sh
后面从新执行 ./AAU.sh 参数
xcode-select 报错
执行
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
/Applications/Xcode.app/Contents/Developer是你xcode路径,请选择最新xcode路径
参考:
iOS自动化打包 ---- xcodebuild 命令详解
Xcode命令行脚本打包
XZ_iOS命令行打包和Python脚本打包出现错误的解决
shell脚本语言学习