因 Xcode 手动编译打包太繁琐, 最近简单实现了一个自动编译打包的 https://github.com/zhifenx/shell 脚本这里分享给大家.
实现功能:
自动编译出 xcarchive 文件.
自动打包导出 ipa 文件.
自动将 ipa 上传 App Store, 蒲公英.
自动压缩, 上传 dYSM(什么是 dYSM?) 文件到 Bugly https://bugly.qq.com/v2/index .
三种设置 version 和 build 版本号模式:
1, 不做修改, 保留当前版本.
2,build 号自动 + 1.
3, 随心设置 version 和 build 号.
准备工作:
下载 shell 脚本
首先请在这里下载文件 https://github.com/zhifenx/shell 文件, 然后将文件夹里的 b.sh,
ADHOCExportOptionsPlist.plist
和
AppStoreExportOptionsPlist.plist
放到你的工程根目录下 (和你. xcodeproj 文件同级).
重新配置属于你项目的 ExportOptionsPlist 文件
最简单的配置方式是用你自己项目的 ExportOptionsPlist 文件替换刚刚放到你项目根目录中的
ADHOCExportOptionsPlist.plist
和
AppStoreExportOptionsPlist.plist
文件. 至于生成 ExportOptionsPlist 文件, 你可以配置好项目证书后, 使用 Xcode 分别用 Debug 和 Release 模式 Archive, 然后导出 ipa 包, 在 ipa 包同级文件夹中就可以找到相应模式的 ExportOptionsPlist 文件.
配置属于你的脚本
替换 b.sh 脚本中的变量值, 详情请看 shell 脚本.
执行脚本:
打开终端 cd 到你的项目根目录.
使用./b.sh 指令执行脚本.
选择编译环境
Place enter the number you want to export ? [ 1:App-store 2:ad-hoc]
设置 version 和 build 版本号
- Do you want to set a new version for xxxxx ? [ 1:NO 2:Build version + 1 3:YES ]
- .
设置完编译环境和版本号后静待编译打包和上传, 脚本默认将 xxxxxx.xcarchive 和 xxxxxx.ipa 导出到~/Desktop 桌面 Build 和 IPAs 文件夹中.
脚本简介:
获取当前 shell 脚本所在文件夹路径, 即工程的绝对路径, 后面的一切基于这个路径开始, 便于获取到工程文件.
- #$0: 当前 Shell 程序的文件名
- #dirname $0, 获取当前 Shell 程序的路径
- #cd `dirname $0`, 进入当前 Shell 程序的目录
- # 工程绝对路径
- project_path=$(cd `dirname $0`; pwd)
你需要替换的基本变量
- # 工程名
- project_name="替换成你的工程名字"
- # scheme 名
- scheme_name="替换成你的 scheme 名字"
获取日期和时间, 用于设置存放 xxxxxx.xcarchive 和 xxxxxx.ipa 文件夹的后缀, 便于之后查找相应的文件.
- # 包名后缀 (日期 + 时间)
- date="$(date"+%Y-%m-%d_%H-%M-%S")"
- temp_date="_${date}"
获取你所选择编译环境, read 用来获取终端输入的值, 这里用来获取你所选择 1,2 三种模式.
- echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc]"
- # 读取用户输入的信息
- read number
- while([[ $number != 1 ]] && [[ $number != 2 ]])
- do
- echo "Error! Should enter 1 or 2"
- echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc]"
- read number
- done
根据前面选择的编译环境, 选择 ExportOptionsPlist 文件.
- if [ $number == 1 ];then
- development_mode=Release
- exportOptionsPlistPath=${
- project_path
- }/AppStoreExportOptionsPlist.plist
- else
- development_mode=Debug
- exportOptionsPlistPath=${
- project_path
- }/ADHOCExportOptionsPlist.plist
- fi
通过 Info.plist 获取项目的 version 和 build 版本号, 即设置 version 和 build 版本号的三种模式模式.
- # 设置项目版本号
- mainVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${project_path}/${project_name}/Info.plist)
- mainBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${project_path}/${project_name}/Info.plist)
- new_mainVersion=$mainVersion
- new_mainBuild=$mainBuild
- echo "${project_name} version:$mainVersion build:$mainBuild"
- echo "Do you want to set a new version for ${project_name} ? [ 1:NO 2:Build version + 1 3:YES ]"
- #
- read v_number
- while([[ $v_number != 1 ]] && [[ $v_number != 2 ]] && [[ $v_number != 3 ]])
- do
- echo "Error! Should enter 1 ,2,3"
- echo "Do you want to set a new version for ${project_name} ? [ 1:YES 2:NO 3:Build version + 1 ]"
- read v_number
- done
- #
- if [ $v_number == 1 ];then
- echo "/+++++++ 未更改版本号 +++++++/"
- elif [[ $v_number == 2 ]]; then
- #build + 1
- new_mainBuild=$((${mainBuild} + 1))
- else
- echo "Please enter a new version:?"
- read version
- new_mainVersion=$version
- echo "Please enter a new build:?"
- read build
- new_mainBuild=$build
- fi
- # 设置新的 Version 和 Build
- plutil -replace CFBundleShortVersionString -string $new_mainVersion ${project_path}/${project_name}/Info.plist
- plutil -replace CFBundleVersion -string $new_mainBuild ${project_path}/${project_name}/Info.plist
使用 xcodebuild 编译打包项目
- echo '/+++++++ 正在清理工程 +++++++/'
- xcodebuild \
- clean -configuration ${
- development_mode
- } -quiet || exit
- echo '/+++++++ 清理完成 +++++++/'
- echo '正在编译工程:'${
- development_mode
- }
- xcodebuild \
- archive -workspace ${
- project_path
- }/${
- project_name
- }.xcworkspace \
- -scheme ${
- scheme_name
- } \
- -configuration ${
- development_mode
- } \
- -archivePath ${
- build_path
- }/${
- project_name
- }.xcarchive -quiet || exit
- echo '/+++++++ 编译完成 +++++++/'
- echo '/+++++++ 开始 ipa 打包 +++++++/'
- xcodebuild -exportArchive -archivePath ${
- build_path
- }/${
- project_name
- }.xcarchive \
- -configuration ${
- development_mode
- } \
- -exportPath ${
- exportIpaPath
- } \
- -exportOptionsPlist ${
- exportOptionsPlistPath
- } \
- -quiet || exit
- # 判断 IPAs 内是否有 ipa 包
- if [ -e $exportIpaPath/$scheme_name.ipa ]; then
- echo '/+++++++ ipa 包已导出 +++++++/'
- open $exportIpaPath
- else
- echo '/+++++++ ipa 包导出失败 +++++++/'
- fi
根据前面选择的编译环境将 ipa 包上传到 App Store 或蒲公英 (关于 curl 上传蒲公英 https://www.pgyer.com/doc/view/jenkins_ios ), 这里要替换相应的 apple id 和蒲公英 user key,API key 等参数. 上传成功过后
mv $exportIpaPath $exportIpaPath$append_path
这里使用 mv 指令修改文件夹名称用于区分上传平台. 最终存放 ipa 包的文件夹的名称由工程名称, 时间, 版本号和平台名称组成.
- if [ $number == 1 ];then
- # 上传 App Store
- echo '/+++++++ 上传 App Store +++++++/'
- # 验证并上传到 App Store
- 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 这里是你的 appleid -p 这里是你的密码 -t iOS --output-format xml
"$altoolPath" --upload-App -f ${$exportIpaPath}/${scheme_name}.ipa -u 这里是你的 appleid -p 这里是你的密码 -t iOS --output-format xml
- append_path="已上传到 App Store"
- # 修改存放 ipa 包文件夹路径, 添加后缀, 以便区分上传平台
- mv $exportIpaPath $exportIpaPath$append_path
- echo '/+++++++ 成功上传到 App Store +++++++/'
- else
- # 上传蒲公英
- echo '/+++++++ 上传蒲公英 +++++++/'
- PASSWORD=123456
- # 将 Git 最后一次提交作为更新说明
- MSG=`git log -1 --pretty=%B`
- curl -F "file=@$exportIpaPath/$scheme_name.ipa" \
- -F "uKey = 蒲公英的 user key" \
- -F "_api_key = 蒲公英的 api key" \
- -F "updateDescription=${MSG}" \
- -F "password=${PASSWORD}" \
- https://qiniu-storage.pgyer.com/apiv1/app/upload
- append_path="已上传到蒲公英"
- mv $exportIpaPath $exportIpaPath$append_path
- echo '/+++++++ 成功上传到蒲公英 +++++++/'
- fi
上传 dSYM 和 symbol``.zip 文件到 Bugly https://bugly.qq.com/v2/index , 关于 Curl 上传 iOS 符号表请看: Curl 上传符号表
- #Bugly
- buglyAppKey="替换成你的 bugly app key"
- buglyAppId="替换成你的 bugly app id"
- bundleId="替换成你的 bundle id"
- echo '/+++++++ 压缩 dSYM 文件 +++++++/'
- cd $build_path/$project_name.xcarchive/dSYMs
- zip -r -o '${project_name}.app.dSYM.zip' "${project_name}.app.dSYM"
- echo '/+++++++ 压缩 dSYM 文件完成 +++++++/'
- echo '/+++++++ 上传 dSYM 文件 +++++++/'
- curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=$buglyAppKey&app_id=$buglyAppId" --form "api_version=1" --form "app_id=$buglyAppId" --form "app_key=$buglyAppKey" --form "symbolType=2" --form "bundleId=${bundleId}" --form "productVersion=${new_mainVersion}(${new_mainBuild})" --form "channel=appstore" --form "fileName=$project_name.app.dSYM.zip" --form "file=@$build_path/$project_name.xcarchive/dSYMs/$project_name.app.dSYM.zip" --verbose
- echo '\n/+++++++ 上传 dSYM 文件结束 +++++++/'
- echo '/+++++++ 压缩 symbol 文件 +++++++/'
- cd $build_path/$project_name.xcarchive
- zip -r -o 'symbol.zip' "BCSymbolMaps"
- echo '\n/+++++++ 压缩 symbol 文件结束 +++++++/'
- echo '/+++++++ 上传 Symbol 文件 +++++++/'
- curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=$buglyAppKey&app_id=$buglyAppId" --form "api_version=1" --form "app_id=$buglyAppId" --form "app_key=$buglyAppKey" --form "symbolType=2" --form "bundleId=${bundleId}" --form "productVersion=${new_mainVersion}(${new_mainBuild})" --form "fileName=symbol.zip" --form "file=@$build_path/$project_name.xcarchive/symbol.zip" --verbose
- echo '/+++++++ 上传 Symbol 文件结束 +++++++/'
以上便是整个 iOS 自动编译打包的 https://github.com/zhifenx/shell 脚本内容, 可以根据你的需要自行裁剪修改脚本内容, 但是这一切的基础是配置好你项目的编译环境 Certificates 和 Provisioning Profiles, 从而获取正确的 ExportOptionsPlist 文件.
来源: https://juejin.im/entry/5c10dc98f265da614d090990