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,谢谢!

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

你可能感兴趣的:(iOS开发知识体系之《脚本自动化打包--xcodebuild》)