iOS自动化编译打包

作为一名客户端开发人员,每次给测试打包都是一件很痛苦的事情,因为有时候随便改点一些小Bug,测试要回归测试,一天之内可能会不断的打包n个版本,如果让开发人员每次都手动打包,不仅是浪费了开发者的时间,同时也浪费了测试组的时间。所以此时自动化打包是显得多么的重要,节省了开发者和测试组的大量时间。有了自动化打包工具,开发人员只需要将修改的代码提交到远程仓库即可,剩下的事就交给自动化打包工具吧。在一切都OK后需要打包上传到iTunes Connect上,此时只需要修改一个.plist配置文件就可以。给测试组的宝宝们教一下如何把ipa文件上传到iTunes Connect,并发布,以后这些小事就可以交给他们做了。O(∩_∩)O哈哈哈~


coverImage.jpg
基本命令

主要有以下2种方法:

  1. xcrun: 把*.app打包成ipa。
  2. xcodebuild: 生成Archive、导出ipa。

由于之前在网上查到资料,对比了两者的区别,有人说是第一种命令,xcrun有点out了,不太适合现在的打包了,本人也没有去真正测试是否到底好用,所以在此只介绍第二种命令xcodebuild的使用,这也是我目前正在用的。在我们的项目中有2个shell脚本,一个是用来打包测试版的,一个是用来打发布到App Store版的,不用的环境运行不同的脚本。

xcodebuild 的基本使用

xcodebuild命令打包主要有2个步骤,搞清楚这两个步骤,其他的就是个性化的东西了(比如:打包前修改一些配置文件,生成的ipa的命名等都可以放在脚本里去做)。
第一步:编译打包成Archive 就如在Xcode操作「Product -> Archive」
xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath ${ARCHIVE_PATH} CONFIGURATION_BUILD_DIR=${CONFIGURATION_BUILD_PATH}
参数说明:

-workspace:指定工作空间文件XXX.xcworkspace
-scheme:指定构建工程名称
-configuration:[Debug/Release]可选项,选择Debug或者Release构建
-archivePath:保存生成.xcarchive包路径
CONFIGURATION_BUILD_DIR:build时的文件路径(主要包含.a文件、XXX.app文件和XXX.app.dSYM文件)如果不需要用到XXX.app.dSYM文件中的二进制文件(有些第三方崩溃统计需要用到此文件),可以不加此项

第二步:用生成的XXX.xcarchive文件导出为XXX.ipa文件
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${EXPORT_OPTIONS_PLIST_PATH} -exportPath ${EXPORT_DIR}
参数说明:

-archivePath:第一步中生成XXX.xcarchive文件的路径
-exportOptionsPlist:导出过程中需要的配置文件路径(我是放在工程文件夹中的)
-exportPath:导出ipa保存目录

exportOptionsPlist文件参数如下图:


上传App Store版本
测试组使用版本

以上两步是最核心的两步,理解了各个参数的用意,就明白是怎么回事了。xcodebuild还有其他用法,可以通过命令xcodebuild -usage查看相关说明。

具体使用

下面是我用的打包脚本,是用于打包发布到App Store版的,需要用到打包测试版的话,自己动手修改一下,也当做学习了。其中很多用到了变量名,可能看起来会有点费劲,自己看的时候捋一捋吧。

# !/bin/bash
# 时间字符串格式化输出 eg:2016-11-14 22:40
# date_value=` date "+%Y-%m-%d %H:%M"`
# 执行 ./build-redlips_appStore.sh release 打包
PROJECT="XXX"
WORKSPACE_FILE=${PROJECT}.xcworkspace
TARGET="XXX"
BUILD_CONFIGURATION="Debug"
if [ "$1" = "release" ]; then
BUILD_CONFIGURATION="Release"
fi

#新建3个文件夹路径(我是都放在桌面),用来保存打包时相关的文件
CONFIGURATION_BUILD_DIR=~/Desktop/build_configuration
ARCHIVE_DIR=~/Desktop/build_archive
EXPORT_DIR=~/Desktop/build_ipa
# LOG_PATH=~/Desktop/build_log
# LOG_PATH是一个文档路径,只是用来记录命令的输出,因为都打在终端会很多,另外也方便后面分析。后面的命令也是如此。这里面带的选项可以根据需要参考xcodebuild -help的信息。
# clean
# 清理构建目录  就如在Xcode操作「Product -> Clean」。
xcodebuild clean -configuration ${BUILD_CONFIGURATION} -alltargets
# 移除之前的目录并创建新的文件夹(可以不执行此操作)
rm -rf ${CONFIGURATION_BUILD_DIR}
rm -rf ${ARCHIVE_DIR}
rm -rf ${EXPORT_DIR}
mkdir ${CONFIGURATION_BUILD_DIR}
mkdir ${ARCHIVE_DIR}
mkdir ${EXPORT_DIR}
# 编译打包成Archive  就如在Xcode操作「Product -> Archive」
CONFIGURATION_BUILD_PATH=${CONFIGURATION_BUILD_DIR}/${BUILD_CONFIGURATION}-iphoneos
# archivePath="~/Desktop/build_archive/${TARGET}.xcarchive"
ARCHIVE_PATH=${ARCHIVE_DIR}/${TARGET}.xcarchive
# CODE_SIGN_IDENTITY="$codeSignIdentity" PROVISIONING_PROFILE="$provisioningProfile"
xcodebuild archive -workspace ${WORKSPACE_FILE} -scheme ${TARGET} -configuration ${BUILD_CONFIGURATION} -archivePath ${ARCHIVE_PATH} CONFIGURATION_BUILD_DIR=${CONFIGURATION_BUILD_PATH}
# 将Archive导出 (注意路径加""号和不加""的写法)
# exportOptionsPlist="/Users/apple/Desktop/XXX/XXX/Src/Common/AppStoreExportOptions.plist"
# 取出当前目录的路径进行拼接(每人的项目文件名可能不一样)
BASE_PATH=${PWD}
EXPORT_OPTIONS_PLIST_PATH=${BASE_PATH}/XXX/Src/Common/AppStoreExportOptions.plist
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${EXPORT_OPTIONS_PLIST_PATH} -exportPath ${EXPORT_DIR}

****************************** 分割线 ******************************

#下面是获取上传到第三方统计崩溃日志的文件,如果没有用到可以到此结束
# 复制(or压缩) CONFIGURATION_BUILD_PATH 目录下的 XXX.app.dSYM 文件(其实是个文件夹)到 EXPORT_DIR 目录下
DSYM_PATH=${CONFIGURATION_BUILD_PATH}/${TARGET}.app.dSYM
DSYM_ZIP_PATH=${EXPORT_DIR}/${TARGET}.app.dSYM.zip
DSYM_COPY_PATH=${EXPORT_DIR}
# zip -r 目标路径  源文件路径
zip -r ${DSYM_ZIP_PATH} ${DSYM_PATH}
# cp -r 源文件路径 目标路径
cp -r ${DSYM_PATH} ${DSYM_COPY_PATH}
# 复制 XXX.app.dSYM 包里的 XXX 文件 上传到听云
TARGET_PATH=${DSYM_COPY_PATH}/${TARGET}.app.dSYM/Contents/Resources/DWARF/${TARGET}
cp ${TARGET_PATH} ${EXPORT_DIR}
温馨提醒
  1. 打包前记得把你的证书和签名设置正确,否则打包必定失败。
  2. 如果添加了iOS10的通知特性(PushNotificationService),记得在工程中TARGETS下选择PushNotificationService,Build Settings栏目下,Enable Bitcode属性设置为NO。否则打包成功在上传到iTunes Connect时,会出现如下错误:

ERROR ITMS-90635: "Invalid Mach-O Format. The Mach-O in bundle "XXX.app/PlugIns/XXXPushNotificationService.appex" isn’t consistent with the Mach-O in the main bundle. The main bundle Mach-O contains armv7(machine code) and arm64(machine code), while the nested bundle Mach-O contains armv7(bitcode) and arm64(bitcode). Verify that all of the targets for a platform have a consistent value for the ENABLE_BITCODE build setting."

以上就是我打包用到的脚本,至于打包测试版的,我就不展示了,伙伴们可以自己动手写一个,就当练习了,毕竟自己动手丰衣足食嘛,哈哈....

有其他好想法的伙伴,可以互相交流学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容