我们公司分发测试包的方式是导出一个ipa包给到测试同学,然后他们自己用软件装到手机上去进行测试工作.因为现在导出 ipa 包的步骤太多,所以就决定写一个脚本来简化操作.
ipa包究竟是什么呢,其实他就是一个叫
Payload
的文件夹,里边放了一个编译出来的***.app
文件,Payload
压缩后的一个压缩文件,只是名称叫***.ipa
.
现状:
command+B
编译一下- 在项目中找到
Products
下的***.app
,show in finder
找到编译好的***.app
copy
到桌面的Payload
文件夹下- 右键压缩
Payload
生成Payload.zip
- 把
Payload.zip
改名***.ipa
- 把
***.ipa
发给测试
业务需求:
总的来说就一个原则, 简化操作, 提高效率, 那我们就试试用最少的步骤来简化.因为是使用的通讯软件发给测试同学,所以下边的步骤应该算是最少了.
- 通过脚本在
command+B
编译后在桌面生成***.ipa
- 把
***.ipa
发给测试
需求分析:
- 我们的最终目标是生成
***.ipa
文件, 那么这个ipa
包是怎么来生成呢 ?- 是桌面
Payload/***.app
压缩来的, 我们就要有这个目录和文件
- 是桌面
Payload
这个文件夹创建一个就行, 那么这个***.app
怎么来呢 ?- 毫无疑问,肯定是把编译好
***.app
的copy
出来的
- 毫无疑问,肯定是把编译好
- 如果想
copy
这个***.app
文件, 就要知道他在哪里 ?- Xcode 已经给我们准备好了环境变量 😄
- 在开始主要业务逻辑前要加入一些判断
Payload
有没有创建, 最好是先移除旧的***.app
和***.ipa
- 要保证解压之后层级还是
Payload/***.app
- 这就要求脚本在开始执行前, 当前目录要切换到桌面进行, 否则ipa的层级就是错误的,
- 另外, 在开发阶段是不需要给没事发包的, 不需要导出
ipa
包 为了提高编译速度, 需要再加一个判断参数, 是否允许导出ipa
包
脚本实现步骤
接下来我们来一步一步实现这个脚本一, 在最后会给出完整脚本代码
准备变量 (路径 / 名称 / 参数)
#!/bin/sh
# TARGET_NAME target名称
# 有些项目名称被修改后, 这个变量就不是要找的名称, 所以可以自己改
APP_NAME=${TARGET_NAME}
# 脚本传入的能数是否打包, 1 打包, 其他不打包
ALLOW_ZIP="$1"
# 桌面
DESKTOP="/Users/guofei/Desktop"
# Payload文件夹, 保存临时文件
PAYLOAD_DIR="Payload"
# 最终 ipa 路径
IPA_NAME="${APP_NAME}.ipa"
# payload 中 app 路径
TEMP_APP_PATH="${PAYLOAD_DIR}/${APP_NAME}.app"
# 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
TARGET_APP_PATH="${BUILT_PRODUCTS_DIR}/${APP_NAME}.app"
打印部分变量
echo "-->> payload:${TEMP_APP_PATH}"
echo "-->> app路径 :${TARGET_APP_PATH}"
echo "-->> ALLOW_ZIP: ${ALLOW_ZIP}"
打包功能封装
因为我们要根据传入的参数来决定是否执行打包功能, 所以要将此功能封装成一个函数.
function zipApp(){
//...
}
下面是函数中的各步骤详解.
1. 切换到桌面
# 切到桌面目录
cd ${DESKTOP}
2. 创建Payload
文件夹
# 0. 创建文件夹
if [ ! -d ${PAYLOAD_DIR} ]; then
mkdir ${PAYLOAD_DIR}
echo "-->> create Payload dir successed ^O^"
fi
3. 移除旧的 ***.app
包和***.ipa
# 1. 移除上次的 app(实际是个文件夹) 和 ipa 文件
if [ -e ${TEMP_APP_PATH} ]; then
rm -rf ${TEMP_APP_PATH}
echo "-->> old app remove successed ^O^"
fi
if [ -e ${IPA_NAME} ]; then
rm -f ${IPA_NAME}
echo "-->> old zip remove successed ^O^"
fi
4. 将 ***.app
包 copy
到 Payload
文件夹
# 2. 将 app 包 copy 到 payload 文件夹
cp -rf ${TARGET_APP_PATH} ${PAYLOAD_DIR}
5. 压缩成 ***.ipa
文件
# 3. 压缩成 ipa 文件
zip -r ${IPA_NAME} ${PAYLOAD_DIR}
# 给出提示
if [ -e $IPA_PATH ]; then
echo "-->> zip successed ^O^"
else
echo "-->> zip failed ^><^"
fi
判断是否允许打包
# 判断是否相等, 两边必须加空格
if [ ${ALLOW_ZIP} == "1" ]; then
zipApp
fi
脚本的使用
方式一:
- 用
touch ipa.sh
在相应的目录下创建一个脚本文件, 把完整脚本代码
copy 进去
我是用 Xcode 打开编写的, 这个自己开心就好
- 在 Xcode 项目工程中配置脚本执行路径, 传入是否允许打包的参数
方式二:
直接将完整脚本代码
copy 到 方式一
第2步中黄色区域, 是否打包只需要修改参数即可.
把下图中的变量改成
# "1" 或者 "0", $1 表示取传入的参数
ALLOW_ZIP="1"
不管是方式一还是方式二, 都是 command+B
编译一下, 就可以在桌面生成一个 ***.ipa
,这样就可以直接发送给测试同学进行愉快的测试了,
走过路过不要错过, 文章都看到这里了, 相信一定对你有所帮助, 动动你的小手, 点个赞, 鼓励一下, 谢谢😜
完整脚本代码
此代码是按照 方式一
的使用方法写的, 建议这样使用, 方式二 注意 ALLOW_ZIP
这个变量的使用.
#!/bin/sh
# app name
APP_NAME=${TARGET_NAME}
# 是否打包, 1 打包, 其他不打包
ALLOW_ZIP="$1"
DESKTOP="/Users/guofei/Desktop"
# Payload文件夹, 保存临时文件
PAYLOAD_DIR="Payload"
# 最终 ipa 路径
IPA_NAME="${APP_NAME}.ipa"
# payload 中 app 路径
TEMP_APP_PATH="${PAYLOAD_DIR}/${APP_NAME}.app"
# 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="${BUILT_PRODUCTS_DIR}/${APP_NAME}.app"
echo "-->> payload:${TEMP_APP_PATH}"
echo "-->> app路径 :${TARGET_APP_PATH}"
echo "-->> ALLOW_ZIP: ${ALLOW_ZIP}"
function zipApp(){
# 切到桌面目录
cd ${DESKTOP}
# 0. 创建文件夹
if [ ! -d ${PAYLOAD_DIR} ]; then
mkdir ${PAYLOAD_DIR}
echo "-->> create Payload dir successed ^O^"
fi
# 1. 移除上次的 app(实际是个文件夹) 和 ipa 文件
if [ -e ${TEMP_APP_PATH} ]; then
rm -rf ${TEMP_APP_PATH}
echo "-->> old app remove successed ^O^"
fi
if [ -e ${IPA_NAME} ]; then
rm -f ${IPA_NAME}
echo "-->> old zip remove successed ^O^"
fi
# 2. 将 app 包 copy 到 payload 文件夹
cp -rf ${TARGET_APP_PATH} ${PAYLOAD_DIR}
# 3. 压缩成 ipa 文件
zip -r ${IPA_NAME} ${PAYLOAD_DIR}
if [ -e $IPA_PATH ]; then
echo "-->> zip successed ^O^"
else
echo "-->> zip failed ^><^"
fi
}
# 判断是否相等, 两边必须加空格
if [ ${ALLOW_ZIP} == "1" ]; then
zipApp
fi