iOS开发知识体系之《脚本自动化打包--xcodebuild》

iOS脚本自动化打包方案--xcodebuild

本文主要xcodebuild脚本自动化打包并上传到蒲公英或者AppStore,废话不多说,直接上干货!

先了解一下xcodebuild打包需要的一些指令

-workspace XXX.xcworkspace

XXX.xcworkspace需要编译工程的工作空间名称,如果工程不是.xcworkspace的,可以不需要-workspace XXX.xcworkspace这段话

-scheme XXX

XXX是工程名称,-scheme XXX是指定构建工程的名称

-configuration Release

填入打包的方式是Debug或Release,就跟在Xcode中编译前需要在Edit scheme的Build configuration中选择打出来的包是Debug还是Release包一样,-configuration就是配置编译的Build configuration

-archivePath ./myArchivePath

配置生成.xcarchive的路径, ./表示生成在当前目录下,myArchivePath是生成的.Archive文件名称

ODE_SIGN_IDENTITY=证书

配置打包的指定证书,如果该工程的Xcode已经配置好了证书,那么不加入这段话也可以,打包出来的证书就是Xcode中配置好的。

PROVISIONING_PROFILE=描述文件UUID

配置打包的描述文件,同上,Xcode已经配置好了就不用在填入这段话了

CONFIGURATION_BUILD_DIR

配置编译文件的输出路径,如果需要用到.xcarchive文件内部的dSYM等文件,可以使用改字段指定输出路径。

如果工程是勾选了Automatically manage signing,那么就不用在配置ODE_SIGN_IDENTITY和PROVISIONING_PROFILE,今天这里讲到的Automatically manage signing自动配置证书,手动配置的就不多说了,有兴趣的话可以自己研究。

xcode工程配置自动获取证书,如下图:

image

打包所需要文件

配置打包的ExportOptions.plist文件,可以在任意一个Xcode工程中新建一个ExportOptions.plist文件。dev和adHoc和AppStore的配置文件内容不一样,可以先手动打包后看下plist文件的样式,这里提供一个样例:

image

这里method对应的value为打包对应的环境,有development、ad-hoc、app-store、enterprise根据打包环境来配置不同的值


编译脚本命令

xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath ./myArchivePath CONFIGURATION_BUILD_DIR ./dir ODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID

导出ipa包命令

xcodebuild -exportArchive -archivePath ./myArchivePath.xcarchive -exportOptionsPlist ./ExportOptions.plist -exportPath ./out

-archivePath ./myArchivePath.xcarchive指定需要打包的.xcarchive路径,./myArchivePath.xcarchive表示在当前终端路径下的myArchivePath.xcarchive文件

-exportOptionsPlist ./ExportOptions.plist指定打包需要的ExportOptions.plist配置文件路径

-exportPath ./out指定打包输出的路径, ./out表示打包结果输出在终端的当前路径下的out文件家中。如果没有out文件夹会自动创建一个


脚本操作

首先:cd到需要自动打包的工程下

然后:在终端中输入touch xcodebuild.sh创建xcodebuild.sh脚本文件

然后:双击打开脚本写入下面 脚本内容(请确保所有版本的plist配置文件都写好了)

最后:在终端中输入./xcodebuild.sh运行脚本,按照步骤完成打包选择(如果运行的时候出现Permission denied,请先在终端中执行chmod a+x *.文件的后缀名后,在运行,相当于提高脚本文件的权限)


脚本内容

此脚本包含了自动上传蒲公英的选择操作,根据输入指令来执行具体操作

image

脚本实现


Workspace_Name="***.xcworkspace"

#工程名字

Project_Name="***"

#配置打包方式Release或者Debug

Configuration="Release"

#在终端中提示 根据输入的序号不同,打包成不同版本的ipa

echo "~~~~~~~~~~~~选择打包环境(输入序号)~~~~~~~~~~~~~~~"

echo "  1 Debug"

echo "  2 Release"

# 读取用户在终端中输入并存到变量里

readparameter_dev

sleep0.5

method_dev="$parameter_dev"

# 判读用户是否有输入

if[ -n"$method_dev"]

then

if["$method_dev"="1"]

then

Configuration="Debug"

echo "~~~~~~~~~~~~即将进行Debug环境打包~~~~~~~~~~~~~~~"

elif["$method_dev"="2"]

then

Configuration="Release"

echo "~~~~~~~~~~~~即将进行Release环境打包~~~~~~~~~~~~~~~"

fi

fi

#基础主路径

BUILD_PATH=./build

#不同版本的基础子路径

#dev

DEV_PATH=${BUILD_PATH}/dev

#adHoc

ADHOC_PATH=${BUILD_PATH}/adHoc

#appStore

APPSTORE_PATH=${BUILD_PATH}/appStore

#enterprise

ENTERPRISE_PATH=${BUILD_PATH}/enterprise

#配置打包结果输出的路径

#dev版本

DevProjectOutPath=${DEV_PATH}/devOut

#AdHoc版本

AdHocProjectOutPath=${ADHOC_PATH}/adHocOut

#AppStore版本

AppStoreProjectOutPath=${APPSTORE_PATH}/appStoreOut

#企业版本

EnterpriseProjectOutPath=${ENTERPRISE_PATH}/enterpriseOut

#加载各个版本的plist文件

DEVExportOptionsPlist="./ExportOptions/ExportOptions-dev.plist"

ADHOCExportOptionsPlist="./ExportOptions/ExportOptions-adhoc.plist"

AppStoreExportOptionsPlist="./ExportOptions/ExportOptions-appStore.plist"

EnterpriseExportOptionsPlist="./ExportOptions/ExportOptions-enterprise.plist"

#在终端中提示 根据输入的序号不同,打包成不同版本的ipa

echo "~~~~~~~~~~~~选择打包方式(输入序号)~~~~~~~~~~~~~~~"

echo "  1 dev"

echo "  2 adHoc"

echo "  3 AppStore"

echo "  4 Enterprise"

# 读取用户在终端中输入并存到变量里

readparameter

sleep0.5

method="$parameter"

# 判读用户是否有输入

if[ -n"$method"]

then

if["$method"="1"]

then

#这里都执行命令中是在xcworkspace工程中执行的,如果工程不是xcworkspace,可以把-workspace的内容删掉,加入了证书和描述文件,如果不需要请删除

#如果用户选择的是1,就执行dev脚本

#首先清除原来的文件夹

rm -rf ${BUILD_PATH}

#创建文件夹,路径需要一层一层创建,不然会创建失败

mkdir ${BUILD_PATH}

mkdir ${DEV_PATH}

#打包输出的文件

mkdir ${DevProjectOutPath}

#编译

xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${DEV_PATH}/$Project_Name-dev.xcarchive -allowProvisioningUpdates

#打包

xcodebuild  -exportArchive -archivePath ${DEV_PATH}/$Project_Name-dev.xcarchive -exportOptionsPlist $DEVExportOptionsPlist -exportPath ${DevProjectOutPath}

#上传操作

uploadPGY ${DevProjectOutPath} ${Project_Name}

elif["$method"="2"]

then

#这里都执行命令中是在xcworkspace工程中执行的,如果工程不是xcworkspace,可以把-workspace的内容删掉,加入了证书和描述文件,如果不需要请删除

#如果用户选择的是2,就执行adhoc脚本

#首先清除原来的文件夹

rm -rf ${BUILD_PATH}

#创建文件夹,路径需要一层一层创建,不然会创建失败

mkdir ${BUILD_PATH}

mkdir ${ADHOC_PATH}

#打包输出的文件

mkdir ${AdHocProjectOutPath}

#编译

xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${ADHOC_PATH}/$Project_Name-adhoc.xcarchive -allowProvisioningUpdates

xcodebuild  -exportArchive -archivePath ${ADHOC_PATH}/$Project_Name-adhoc.xcarchive -exportOptionsPlist $ADHOCExportOptionsPlist -exportPath ${AdHocProjectOutPath}

#上传操作

uploadPGY ${AdHocProjectOutPath} ${Project_Name}

elif["$method"="3"]

then

#如果用户选择的是3,就执行appstore脚本

#首先清除原来的文件夹

rm -rf ${BUILD_PATH}

#创建文件夹,路径需要一层一层创建,不然会创建失败

mkdir ${BUILD_PATH}

mkdir ${APPSTORE_PATH}

#打包输出的文件

mkdir ${AppStoreProjectOutPath}

xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${APPSTORE_PATH}/$Project_Name-appstore.xcarchive -allowProvisioningUpdates

xcodebuild  -exportArchive -archivePath ${APPSTORE_PATH}/$Project_Name-appstore.xcarchive -exportOptionsPlist $AppStoreExportOptionsPlist -exportPath ${AppStoreProjectOutPath}

#验证ipa是否打包成功

if[ -e $AppStoreProjectOutPath/$Project_Name.ipa ];then

echo '----ipa包已生成----'

open $AppStoreProjectOutPath

echo '----打包ipa完成----'

echo '**---------------**'

echo '****开始发布ipa包****'

echo '**---------------**'

#验证后上传到App Store

# 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码

altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

"$altoolPath"--validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml

"$altoolPath"--upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u  XXX -p XXX -t ios --output-format xml

else

echo '----ipa包导出失败----'

fi

elif["$method"="4"]

then

#如果用户选择的是4,就执行企业脚本

#首先清除原来的文件夹

rm -rf ${BUILD_PATH}

#创建文件夹,路径需要一层一层创建,不然会创建失败

mkdir ${BUILD_PATH}

mkdir ${ENTERPRISE_PATH}

#打包输出的文件

mkdir ${EnterpriseProjectOutPath}

xcodebuild archive -workspace $Workspace_Name -scheme $Project_Name -configuration $Configuration -archivePath ${ENTERPRISE_PATH}/$Project_Name-enterprise.xcarchive -allowProvisioningUpdates

xcodebuild  -exportArchive -archivePath ${ENTERPRISE_PATH}/$Project_Name-enterprise.xcarchive -exportOptionsPlist $EnterpriseExportOptionsPlist -exportPath ${EnterpriseProjectOutPath}

#上传操作

uploadPGY ${EnterpriseProjectOutPath} ${Project_Name}

else

#如果是其他输入,则在终端中提示参数无效并退出

echo "参数无效...."

exit 1

fi

fi```

**上传蒲公英**

```#上传蒲公英

uploadPGY(){

    echo "~~~~~~~~~~~~选择完成是否上传蒲公英(输入序号)~~~~~~~~~~~~~~~"

    echo "  1 上传"

    echo "  2 不上传"

    readuploadPara

    sleep0.5

    upload="$uploadPara"

    # 判读用户是否有输入

    if[ -n"$upload"]

    then

    if["$upload"="1"]

    then

    echo "~~~~~~~~~~~~即将进行上传蒲公英~~~~~~~~~~~~~~~"

    echo "****** 开始上传IPA包到蒲公英 ******"

    filePath=$1/$2.ipa

    echo "~~~~~~~~~~~~filePath为$filePath~~~~~~~~~~~~"

    U_key="your u_key"

    APP_KEY="your app_key"

    if[ -e"${filePath}"];then

    echo "进入上传"

    curl -F"file=@${filePath}"\

    -F"uKey=${U_key}"\

    -F"_api_key=${APP_KEY}"\

    "http://www.pgyer.com/apiv1/app/upload"

    echo "****** IPA包上传到蒲公英成功 ******"

    else

    echo "IPA包不存在 上传蒲公英失败"

    fi

    elif["$upload"="2"]

    then

    echo "~~~~~~~~~~~~打包结束~~~~~~~~~~~~~~~"

    fi

    fi

}

具体详细脚本见GitHub地址:https://github.com/Luck-666/xcodebuild.sh.git 如果好用记得给star,谢谢!

如脚本打包执行遇到问题可留言沟通!

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

推荐阅读更多精彩内容

  • 夜莺2517阅读 127,695评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,863评论 1 6
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,503评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,570评论 2 9