iOS 编译生成测试分发 ipa 包脚本

1,484 阅读3分钟

我们公司分发测试包的方式是导出一个ipa包给到测试同学,然后他们自己用软件装到手机上去进行测试工作.因为现在导出 ipa 包的步骤太多,所以就决定写一个脚本来简化操作.

ipa包究竟是什么呢,其实他就是一个叫Payload的文件夹,里边放了一个编译出来的***.app文件,Payload压缩后的一个压缩文件,只是名称叫***.ipa.

现状:

  1. command+B 编译一下
  2. 在项目中找到Products下的***.app,show in finder 找到编译好的***.app
  3. copy 到桌面的 Payload 文件夹下
  4. 右键压缩Payload生成 Payload.zip
  5. Payload.zip 改名 ***.ipa
  6. ***.ipa发给测试

业务需求:

总的来说就一个原则, 简化操作, 提高效率, 那我们就试试用最少的步骤来简化.因为是使用的通讯软件发给测试同学,所以下边的步骤应该算是最少了.

  1. 通过脚本在command+B 编译后在桌面生成***.ipa
  2. ***.ipa发给测试

需求分析:

  1. 我们的最终目标是生成***.ipa文件, 那么这个ipa包是怎么来生成呢 ?
    • 是桌面Payload/***.app压缩来的, 我们就要有这个目录和文件
  2. Payload这个文件夹创建一个就行, 那么这个***.app怎么来呢 ?
    • 毫无疑问,肯定是把编译好***.appcopy出来的
  3. 如果想copy这个***.app文件, 就要知道他在哪里 ?
    • Xcode 已经给我们准备好了环境变量 😄
  4. 在开始主要业务逻辑前要加入一些判断 Payload有没有创建, 最好是先移除旧的 ***.app***.ipa
  5. 要保证解压之后层级还是Payload/***.app
    • 这就要求脚本在开始执行前, 当前目录要切换到桌面进行, 否则ipa的层级就是错误的,
  6. 另外, 在开发阶段是不需要给没事发包的, 不需要导出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. 将 ***.appcopyPayload 文件夹
# 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

脚本的使用

方式一:

  1. touch ipa.sh 在相应的目录下创建一个脚本文件, 把完整脚本代码 copy 进去

我是用 Xcode 打开编写的, 这个自己开心就好

创建脚本文件

  1. 在 Xcode 项目工程中配置脚本执行路径, 传入是否允许打包的参数

添加脚本

方式二:

直接将完整脚本代码 copy 到 方式一 第2步中黄色区域, 是否打包只需要修改参数即可. 把下图中的变量改成

# "1" 或者 "0", $1 表示取传入的参数
ALLOW_ZIP="1" 

image.png

不管是方式一还是方式二, 都是 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