美文网首页iOS开发知识小集
呈上一份你最需要的iOS打包脚本!

呈上一份你最需要的iOS打包脚本!

作者: JasonWuuu | 来源:发表于2019-02-14 17:15 被阅读4次

ios 打包步骤相对于 Android 来说稍显麻烦,先看一下在 Xcode 上打包的流程:

Xcode 打包步骤

1、打开 Product -> Scheme -> Edit Scheme,选择 Archive 的 Build Configuration 为 Debug 或者 Release:


2、点击 Product -> Archive 开始归档,归档完成后选择分发应用,然后选择分发的方式、签名、是否压缩等,选择完成后开始处理分发前的归档包:

3、归档包预处理完成后选择路径,导出最终的 ipa 包相关文件:

可以说整个流程步骤比较繁琐,所以打包流程如果能够通过脚本来一步到位实现将会节省很多的功夫,因此特意呈上一份比较完整的 ios ipa 打包 shell 脚本!

脚本打包步骤

首先配置一些常量

# 常量配置
APP_NAME="{目标名称}"  #e.g."DemoApp"
EXPORT_PLIST="Export.plist"
PACKAGE_NAME="autoPackage"

CONFIGURATION="Debug"
METHOD="development"

WORK_SPACE="{workspace工程文件}" #e.g."DemoApp.xcworkspace"
PROJECT="{项目工程文件}" #e.g."DemoApp.xcodeproj"

脚本打包是依靠 xcodebuild 命令实现的,主要的命令行有三条,实现了 Xcode 打包的各个步骤:
1、Clean

xcodebuild clean -workspace ${WORK_SPACE}\
                 -scheme ${APP_NAME}\
                 -configuration ${CONFIGURATION}
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
# CONFIGURATION 参数可选择: Debug,Release

2、Archive

ARCHIVE_PATH="./${PACKAGE_NAME}/${APP_NAME}.xcarchive"
xcodebuild archive -workspace ${WORK_SPACE}\
                   -scheme ${APP_NAME}\
                   -configuration ${CONFIGURATION}\
                   -archivePath ${ARCHIVE_PATH}
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"

3、Export

# 替换Export.plist中的export方法为指定的方法,METHOD 参数可选择:development,adhoc,app-store,enterprise
sed -i '' "s/{method}/${METHOD}/g" ${EXPORT_PLIST}
EXPORT_PATH="./${PACKAGE_NAME}/${APP_NAME}"
xcodebuild -exportArchive\
           -exportOptionsPlist ${EXPORT_PLIST}\ 
           -archivePath ${ARCHIVE_PATH}\
           -exportPath ${EXPORT_PATH}\ 
           -allowProvisioningUpdates

其中 EXPORT_PLIST 对应的是一个必须的 plist 文件,该文件包含了分发的方式、签名、是否压缩等信息,因此需要在当前目录里新建一个 Export.plist 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!--{}内为需要手动替换字段,{method}除外-->

    <!--是否编译二进制码-->
    <key>compileBitcode</key>
    <false/>

    <key>destination</key>
    <string>export</string>

    <!--此处{method}不需要手动替换,由脚本传入参数自动替换-->
    <key>method</key>
    <string>{method}</string>

    <!--签名方式 >> 自动-->
    <key>signingStyle</key>
    <string>automatic</string>

    <!--签名方式 >> 手动-->
    <!--<key>signingStyle</key>-->
    <!--<string>manual</string>-->
    <!--<key>provisioningProfiles</key>-->
    <!--<dict>-->
        <!--<key>{项目的bundleId}</key>-->
        <!--<string>{证书名称}</string>-->
    <!--</dict>-->

    <key>stripSwiftSymbols</key>
    <true/>

    <key>teamID</key>
    <string>{teamID}</string>

    <key>thinning</key>
    <string>&lt;none&gt;</string>
</dict>
</plist>

打包脚本补充

以上就是用 shell 脚本打包的主要命令行内容了,为了拓展脚本的易用性,完整脚本内容会有以下几点补充:

  • 增加 configuration、method 两个参数的传入
  • 从项目的 info.plist 文件中截取应用的版本名、版本号来重命名文件以作版本区分
  • 复制生成的 ipa 文件路径到粘贴板,以便后续上传等操作
  • 统计打包脚本运行时长

下面附上打包脚本完整内容:

#!/bin/bash
# 此脚本为ios ipa打包脚本,在当前项目目录下调用,请确保当前目录下包含Export.plist文件
# 脚本具体使用方式请参考 ./ipa_build_template -help
# 脚本执行的内容:clean -> archive -> export
# create by wuzhiqiang 14/2/2019

START_TIME=`date +%s`

# 常量配置
APP_NAME="{目标名称}"  # e.g."DemoApp"
INFO_PLIST="{info.plist文件路径}" #e.g."./Supporting Files/Info.plist"
EXPORT_PLIST="Export.plist"
PACKAGE_NAME="autoPackage"

CONFIGURATION="Debug"
METHOD="development"

WORK_SPACE="{workspace工程文件}" #e.g."DemoApp.xcworkspace"
#PROJECT="{项目工程文件}" #e.g."DemoApp.xcodeproj"

# 使用方式说明
if [[ -n "$1" ]] && [[ "$1" == "-help" ]] ; then
    echo "使用方式:"
    echo "$0 <configuration> <method>"
    echo
    echo "configuration 可接收参数(不传默认值为-r):"
    echo "  -d                        build configuration: Debug"
    echo "  -r                        build configuration: Release"
    echo
    echo "method 可接收参数(不传默认值为dev):"
    echo "  dev                       distribution method:development"
    echo "  adhoc                     distribution method:adhoc"
    echo "  as                        distribution method:app-store"
    echo "  ent                       distribution method:enterprise"
    exit
fi

# 处理输入参数,只识别-d, -r, dev, adhoc, as, ent 参数
# 打包配置和export方法均可传参或者不传参(使用默认值 CONFIGURATION="Debug",METHOD="development")。
while [[ -n "$1" ]]
do
    case $1 in
    -d) CONFIGURATION="Debug" ;;
    -r) CONFIGURATION="Release" ;;
    dev) METHOD="development" ;;
    adhoc) METHOD="adhoc" ;;
    as) METHOD="app-store" ;;
    ent) METHOD="enterprise" ;;
    *) echo "error: Unknown args '$1'."
       exit ;;
    esac
    shift
done

if [[ ! -d ${PACKAGE_NAME} ]] ; then
    mkdir ${PACKAGE_NAME}
fi

echo "clean..."
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
xcodebuild clean -workspace ${WORK_SPACE}\
                 -scheme ${APP_NAME}\
                 -configuration ${CONFIGURATION}

# 从info.plist文件中获取版本名、版本号用来重命名生成的ipa包
VERSION_NAME=$(awk '/CFBundleShortVersionString/{getline; print}' "${INFO_PLIST}")
VERSION_NAME=${VERSION_NAME#*"<string>"}
VERSION_NAME=${VERSION_NAME%"</string>"*}
VERSION_CODE=$(awk '/CFBundleVersion/{getline; print}' "${INFO_PLIST}")
VERSION_CODE=${VERSION_CODE#*"<string>"}
VERSION_CODE=${VERSION_CODE%"</string>"*}

DIR_NAME="v${VERSION_NAME}(${VERSION_CODE})"
FULL_NAME="${APP_NAME}-v${VERSION_NAME}(${VERSION_CODE})"

echo "archive..."
ARCHIVE_PATH="./${PACKAGE_NAME}/${FULL_NAME}.xcarchive"
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
xcodebuild archive -workspace ${WORK_SPACE}\
                   -scheme ${APP_NAME}\
                   -configuration ${CONFIGURATION}\
                   -archivePath ${ARCHIVE_PATH}

echo "export ${METHOD}..."
EXPORT_PATH="./${PACKAGE_NAME}/${DIR_NAME}"
# 替换文件中的export方法为指定的方法
sed -i '' "s/{method}/${METHOD}/g" ${EXPORT_PLIST}
xcodebuild -exportArchive\
           -exportOptionsPlist ${EXPORT_PLIST}\
           -archivePath ${ARCHIVE_PATH}\
           -exportPath ${EXPORT_PATH}\
           -allowProvisioningUpdates

IPA_PATH="${EXPORT_PATH}/${APP_NAME}.ipa"
NEW_IPA_PATH="${EXPORT_PATH}/${FULL_NAME}.ipa"

if [[ -f ${IPA_PATH} ]] ; then
    mv ${IPA_PATH} ${NEW_IPA_PATH}
    echo "========================================================="
    echo "\"${NEW_IPA_PATH}\""
    echo "========================================================="
    # 复制ipa文件路径到粘贴板,以便后续上传等操作
    echo "\"${NEW_IPA_PATH}\"" | pbcopy
else
    echo "export failed"
fi

# 替换文件中的export方法回默认值,以便下一次使用
sed -i '' "s/${METHOD}/{method}/g" ${EXPORT_PLIST}
# 删除archive过程中生成的.xcarchive文件
rm -rf ${ARCHIVE_PATH}

# 计算此次用时时长
END_TIME=`date +%s`
echo "本次运行共计时:"$((END_TIME - START_TIME))"s"

想要下载完整文件,请移步到 Github,欢迎 star

本文为个人原创,转载请注明出处。

相关文章

  • 呈上一份你最需要的iOS打包脚本!

    ios 打包步骤相对于 Android 来说稍显麻烦,先看一下在 Xcode 上打包的流程: Xcode 打包步骤...

  • iOS命令行自动打包脚本

    iOS命令行自动打包脚本 因为工作上的需要,可能会频繁的打包ipa,于是参考了大佬们的资料后,整合了一份自动打包的...

  • Xcode自动打包

    [iOS]从零开始写个自动打包IPA脚本 【iOS打ipa包】:使用终端实现自动打包 iOS自动打包并发布脚本

  • iOS自动打包ipa(shell脚本)

    系列 iOS自动打包ipa(shell脚本)iOS自动打包ipa(Python脚本) 安装xctool shell...

  • iOS自动打包ipa(Python脚本)

    系列 iOS自动打包ipa(shell脚本)iOS自动打包ipa(Python脚本) 安装Python库 Pyth...

  • iOS脚本一键打包

    ios打包脚本的使用 相关链接: 1. IOS工程自动打包并发布脚本的实现。 2. Xcode中Command L...

  • iOS自动打包脚本

    iOS自动打包脚本 iOS自动打包脚本,并实现图片素材、文字资源、部分代码的替换和重签名,基于python实现。 ...

  • 2019-02-15

    ios打包时签名失败 ios打包时证书和provisioningprofile都已经切换更新,打包脚本中指定tea...

  • ios-面试-脚本打包原理

    脚本打包,自然是为了方便打包,便于ios开发不用手动打包,便于非ios开发能去打包! 打包过程 Xcode打包的过...

  • iOS面试题:脚本打包

    脚本打包,自然是为了方便打包,便于ios开发不用手动打包,便于非ios开发能去打包! 打包过程 Xcode打包的过...

网友评论

    本文标题:呈上一份你最需要的iOS打包脚本!

    本文链接:https://www.haomeiwen.com/subject/uzeeeqtx.html