前言
在客户端开发中,最频繁耗时的操作应该就是打包了 , 在打包的时候 , 开发工具不能进行其他操作 , 并且打包完了之后还需要导出iPa包 , 上传到Fir上截图下载二维码提供给测试同学使用 , 如果频繁需要打包就会十分浪费时间 , 因此便有了自动化打包的脚本~
[本文前面部分为脚本流程、工具及命令说明 , 使用方法在最后三部分]
需要的工具
必须的工具
- Xcode(编译 、打包需要使用Xcode自带的命令行工具)
- 下载Fir命令行工具并安装 (这里也可以用Fir的api接口 , 但命令行毕竟方便点~)
- Fir账号的Token
其他可选的工具
- Bugly 的APPID、AppKey(用来上传符号表到bugly上 , 方便查线上问题) 以及符号表提取上传脚本(下载自动配置符号表工具包)
- 企业微信机器人webHook地址(用来打包并上传完成后发送消息到对应的企业微信群通知测试产品同学)
- myqr 命令行工具,用来生成炫彩二维码图片(因为测试同学觉得Fir自带的二维码太丑了)
了解需要使用的命令
- 首先了解最主要的几个Xcode build命令
- 清理编译过程生成的文件(包括上次的) , -configuration选项直接用release就阔以
xcodebuild clean -configuration <Debug|Release>
- 编程工程指定Scheme , 并且导出生成.xcarchive文件 , archivePath可指定编译文件导出目录
xcodebuild build -workspace <xxx.workspace> -scheme <schemeName> -configuration <Debug|Release> -archivePath <PathName>
- 利用生成的.xcarchive导出iPa文件 , archivePath是.archive文件的全路径。 需要注意的是 , 这里需要配置文件路径(exportOptionsPlist) , 但是自己写比较懵逼 , 这里可以先利用XCode本身的打包功能 , 打个ad-hoc包之后在对应的目录下可以找到ExportOptions.plist文件 , 直接拿来使用就可以了
2. **Fir命令行的命令**
+ 使用token登录Fir
> ````fir login -T ${FIR_TOKEN} ````
+ 上传指定目录ipa到fir上 , changeLog 为更新文案
> ````fir publish -Q --changelog=$changeLog $exportIpaPath/$scheme_name.ipa````
3. **Bugly符号表上传命令** , BUNDLE_IDENTIFIER 是包名 , DWARF_DSYM_FOLDER_PATH 是.xcarchive文件全路径 , SYMBOL_OUTPUT_PATH是提取后DSYM文件的存放路径 , UPLOAD_DSYM_ONLY直接传1表示上传 , run是bugly脚本自己定义的方法 , 内部也调用了其他的方法, 需要从它的脚本里面copy过来
> ```` run ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${DWARF_DSYM_FOLDER_PATH} ${SYMBOL_OUTPUT_PATH} ${UPLOAD_DSYM_ONLY}````
4. ***myqr生成二维码命令** , 生成指定字符串的二维码 , -p合并图片 , -c彩色图片 , -n 控制文件名 , -d 控制位置
```` myqr ${qrString} -p bg.jpg -c -n {name}.png -d ${exportIpaPath}````
### 打包流程
1. 用xcodebuild clean清理旧文件
2. 编辑工程导出.xcarchive文件
3. 打包.xcarchive导出ipad文件
4. 登录fir , 填写更新内容并上传ipa包
5. 上传符号标到Bugly
6. myqr生成fir下载地址的二维码图片
7. 使用企业微信机器人发文本消息及图片消息到群聊
8. 调起浏览器打开下载页面
### 开始编写脚本
1. 在脚本的最前面把一些常量定义一下 , 方便修改和查找
企业微信机器人地址
robotUrl='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ea9c0393-bec9-4c6a-805b-422304b3cf4e'
fir下载地址
fir_path=https://fir.im/f1zn
FIR token
FIR_TOKEN="b9abbaf4036afef59d7dde9"
FIR app id 暂时没用(可以用来调api获取app信息)
FIR_APP_ID="5b68285d9249e72edb"
bugly app id
BUGLY_APP_ID="7d28a254"
bugly app key
BUGLY_APP_KEY="6e2c3b45-0858-4294-8293-88bc734ca"
bundle id
BUNDLE_IDENTIFIER="com.meishakeji.xxx"
Bugly服务域名
BUGLY_DSYM_UPLOAD_DOMAIN="api.bugly.qq.com"
名称 用来发消息到群聊的时候用
APP_name="VSChool教师端"
路径名称 在桌面新建的文件夹名称
PATH_name=TEACHER
打包模式 Debug/Release 直接用release就可以
development_mode=Release
工程名 后面编译要用 看项目里面的设置
project_name=VSchool
scheme名 后面编译要用 看项目里面的设置
scheme_name=VSchool
build文件夹路径
build_path=~/Desktop/${PATH_name}/build
导出.ipa文件所在路径 这里直接就丢桌面了
exportIpaPath=~/Desktop/{development_mode}
工程绝对路径 也是脚本应该放的位置 , 不过也可以放其他地方 , 这里为了方便定死了
project_path=0`; pwd)
plist文件所在路径
exportOptionsPlistPath=${project_path}/ExportOptions.plist
注意jar工具的路径跟dSYMUpload.sh脚本路径一致, 请务必保证jar路径的正确性 这一部分根据bugly文档来
BUGLY_SYMBOL_JAR_PATH="dsymtool/buglySymboliOS.jar"
查找添加到系统目录的jar工具
if [ ! -f "${BUGLY_SYMBOL_JAR_PATH}" ]; then
BUGLY_SYMBOL_JAR_PATH="~/bin/buglySymboliOS.jar"
fi
2. 中间有一些需要填写和选择的操作(比如填更新内容), 统一放在最前面 , 避免多次打扰
3. 清理工程 , 并且打印一些操作说明
echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild clean -configuration ${development_mode} -quiet || exit
echo '///--------'
echo '/// 清理完成'
echo '///--------'
4. 编译工程 , 注意这里的workspace路径以及archivePath导出路径拼好 , allowProvisioningUpdates是Xcode9的一个报错*requires a provisioning profile with the Push Notifications feature*需要的参数
echo '///-----------'
echo '/// 正在编译工程:'{project_path}/{scheme_name} -configuration {build_path}/${project_name}.xcarchive -quiet -allowProvisioningUpdates || exit
echo '///--------'
echo '/// 编译完成'
echo '///--------'
5. 打包导出ipa文件 , 导出路径就跟build目录一样就好了 , 主要是exportOptionsPlistPath要正确不然会打包失败
echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath {project_name}.xcarchive -configuration {exportIpaPath} -exportOptionsPlist ${exportOptionsPlistPath} -allowProvisioningUpdates -quiet || exit
6. 检查打包情况
if [ -e scheme_name.ipa ];
then
open $exportIpaPath #把目录打开下
7. 登录fir 和上传ipa包 , changeLog是前面填写的更新内容
fir login -T changeLog scheme_name.ipa
8. 把bugly上传脚本中几个方法的copy过来 , 注意看一下Bugly原本脚本的注释说明 , 解析需要Java环境以及要依赖于buglySymboliOS.jar
+ 打印错误信息的**exitWithMessage**方法
+ 上传dsym的**dSYMUpload**方法
+ 解析dsym的**dSYMParse**方法
+ 执行逻辑的**run**方法
9. 上传dsym文件到Bugly上
ipa所在的目录
SYMBOL_OUTPUT_PATH=${exportIpaPath}
.xcarchive所在的目录
DWARF_DSYM_FOLDER_PATH={project_name}.xcarchive
需要上传
UPLOAD_DSYM_ONLY=1
run {BUGLY_APP_KEY} {DWARF_DSYM_FOLDER_PATH} {UPLOAD_DSYM_ONLY}
10. 生成二维码 , 自定义一下图片名 , 并且使用彩色合并模式
myqr {PATH_name}.png -d ${exportIpaPath}
11. 企业微信机器人发送文字到群聊
发文字
curl {APP_name}打包好啦\n这次的更新内容是:{fir_path}"}}"
12. 企业微信机器人发送二维码图片到群聊 , 这一步需要获取图片的base64 以及 md5 做校验才能发送
图片的base64
imageBase64=exportQrcodeImgPath)
图片的md5 , 这里需要做一下截取 , 把没用的截掉
imageMd5String=exportQrcodeImgPath)
imageMd5=${imageMd5String##* }
13. 发送图片到群聊
发图片
curl {imageBase64}" , "md5": "${imageMd5}"}}"
14. 打开浏览器 打开二维码地址
````#打开下载网址
open -a "/Applications/Google Chrome.app" ${fir_path}````
---
---
# 如何使用
### 使用前准备
> 如果只需要打包 , 做好以下的几个准备 使用附件中的**simpleShell.sh**脚本就可以简单的打包并上传Fir了
1. [安装Fir命令行工具](https://github.com/FIRHQ/fir-cli/blob/master/README.md)
2. 通过XCode获取ExportOptions文件, 也可以下载附件自己修改teamID字段为开发账号的teamID;
3. 拿到Fir的token , 个人或者公司的都可以
4. 拿到APP对应的Fir短链接地址(fir会给每个APP分配一个固定短链接)
---
> 如果想使用所有功能的话 就需要以下的准备 , 根据自己需求可以删掉某些部分(修改附件的**fullShell.sh**)
1. 首先在需要发消息的企业微信群建一个机器人拿到webhook地址
2. 下载并根据Bugyly上传脚本说明安装java环境 , 添加jar包到指定目录
3. 获取Bugly的AppID、AppKey
4. [安装myqr的命令行工具](https://github.com/sylnsfar/qrcode/blob/master/README-cn.md)
### 配置相关参数和常量(需配置一次 , 脚本把参数和变量定义都放在了第一部分)
1. 将robotUrl 变量改为自己创建的webHook地址
2. fir_path 修改为APP对应的fir短链接
3. FIR_TOKEN 修改为fir的token
4. BUGLY_APP_ID、BUGLY_APP_KEY 分别是Bugly的AppId和AppKey
5. BUNDLE_IDENTIFIER 修改为项目包名
6. APP_name 这个是用来发消息到群里用的 , 提醒打的是什么APP的包
7. PATH_name 这个是用来区分不同项目打包路径的,随意起个名字
8. project_name , scheme_name 根据项目里面的设置修改
9. 准备一张用来合成二维码的背景图片 , 名称改为bg.jpg(可以改 , 把脚本里面的bgImageName改掉就好了 , 注意企业微信只支持发送jpg、png类型)
### 使用步骤
1. 将ExportOptions、脚本文件以及bg.jpg 放到项目根目录下(一般就是.xcodeproj文件所在目录)
2. 打开命令行 , cd 到根目录 , 执行脚本命令 , 根据提示输入更新内容
3. 脚本会自动完成打包流程 , 用机器人发送文本和图片消息到群聊 , 并且会用Chrome打开下载链接
4. Enjoy the time ! ~