altool 文档

使用xcode自带的xcodebuild 命令通过脚本进行打包

打包->导出ipa, 两行关键的脚本代码

1.Archive

xcodebuild archive
-archivePath <archivePath>
-project <projectName>
-workspace <workspaceName>
-scheme <schemeName> #从-list命令中获取
-configuration <Debug|Release>

2.Export

xcodebuild -exportArchive
-archivePath <xcarchivepath>
-exportPath <destinationpath>
-exportOptionsPlist <plistpath> #这个plist文件可以通过打一次ipa包里面去获取

3.upload

altool 是xcode自带的Application Loader 的命令行,可以完成提交到App Store

if [[ $number ==  ]]; then

    echo "///--------------------"
echo "/// 开始发布到 app store"
echo "///--------------------" altoolPath=/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool
"$altoolPath" --validate-app -f $export_ipa_path/$project_scheme.ipa\
-u <你的开发者账号> -p <你的开发者账号密码>\
--output-format xml
"$altoolPath" --upload-app -f $export_ipa_path/$project_scheme.ipa\
-u <你的开发者账号> -p <你的开发者账号密码>\
--output-format xml
else echo "///--------------------"
echo "/// 开始上传ipa包到蒲公英"
echo "///--------------------"
curl -F "file=@$export_ipa_path/$project_scheme.ipa"\
-F "uKey=<你的蒲公英uKey>"\
-F "_api_key=<你的蒲公英ApiKey>" https://qiniu-storage.pgyer.com/apiv1/app/upload
fi

参考:

xcodebuild命令介绍

iOS自动化打包 ---- 集成shell脚本

Xcodebuild自动打包总结

详解Shell脚本实现iOS自动化编译打包提交

iOS-如何实现每次打包编译号自动增加

https://github.com/monetking/AutoPacking-iOS

shell 脚本

#!/bin/sh

#  WallPaperScript.sh

#计时
SECONDS= #取当前时间字符串添加到文件结尾
now=$(date +"%Y%m%d-%H:%M") # 获取 setting.plist 文件路径
setting_path=./setting.plist # 项目名称
project_name=$(/usr/libexec/PlistBuddy -c "print project_name" ${setting_path}) # 项目路径
project_path=$(/usr/libexec/PlistBuddy -c "print project_path" ${setting_path}) # workspace/xcodeproj 路径(根据项目是否使用cocoapod,确定打包的方式)
if [ -d "./${project_name}.xcworkspace" ];then # 项目中存在workspace
workspace_path="${project_path}/${project_name}.xcworkspace"
else # 项目中不存在 workspace
workspace_path="${project_path}/${project_name}.xcodeproj"
fi # scheme名称
scheme_name=$(/usr/libexec/PlistBuddy -c "print scheme_name" ${setting_path}) # 项目版本
project_version=$(/usr/libexec/PlistBuddy -c "print project_version" ${setting_path}) # 开发者账号
dev_account=$(/usr/libexec/PlistBuddy -c "print dev_account" ${setting_path}) # 开发者密码
dev_password=$(/usr/libexec/PlistBuddy -c "print dev_password" ${setting_path}) # 配置打包样式:Release/ad-hoc/Debug
configuration=$(/usr/libexec/PlistBuddy -c "print configuration" ${setting_path}) # 发布地址:蒲公英->PGY,苹果->APPStore, fir.im->FI
upload_address=$(/usr/libexec/PlistBuddy -c "print upload_address" ${setting_path}) # ipa包名称:项目名+版本号+打包类型
ipa_name=$(/usr/libexec/PlistBuddy -c "print ipa_name" ${setting_path}) # ipa包路径
ipa_path2=$(/usr/libexec/PlistBuddy -c "print ipa_path" ${setting_path})/${now}
ipa_path="${ipa_path2}-V${project_version}-${upload_address}" # 打包配置plist文件路径 (初始化)
plist_path=$(/usr/libexec/PlistBuddy -c "print plist_path" ${setting_path}) # 编译build路径
archive_path="${ipa_path}/${project_name}.xcarchive" # 上传到蒲公英设置
user_key=$(/usr/libexec/PlistBuddy -c "print user_key" ${setting_path})
api_key=$(/usr/libexec/PlistBuddy -c "print api_key" ${setting_path})
password=$(/usr/libexec/PlistBuddy -c "print password" ${setting_path}) # 上传fir.im 设置
fir_token=$(/usr/libexec/PlistBuddy -c "print fir_token" ${setting_path}) #打包方式配置,以及相应的需求配置
if [ ${upload_address} == "APPStore" ];then # 发布到 AppStore 配置 Release
configuration="Release"
plist_path=${project_path}/exportAppstore.plist
elif [ ${upload_address} == "PGY" ] ||[ ${upload_address} == "FI" ];then # 发布到第三方平台可 配置 Release、Debug
if [ ${configuration} == "Release" ];then
plist_path=${project_path}/exportAdHoc.plist
else
plist_path=${project_path}/exportDevelopment.plist
fi
else # 只打包,不发布到任何平台
if [ ${configuration} == "Release" ];then
plist_path=${project_path}/exportAppstore.plist
else
plist_path=${project_path}/exportDevelopment.plist
fi
fi echo '=============正在清理工程============='
xcodebuild clean -configuration ${configuration} -quiet || exit echo '清理完成-->>>--正在编译工程:'${configuration} # 通过workspace方式打包
if [ -d "./${project_name}.xcworkspace" ];then # 项目中存在workspace
xcodebuild archive -workspace ${workspace_path} -scheme ${scheme_name} \
-configuration ${configuration} \
-archivePath ${archive_path} -quiet || exit
else #通过xcodeproj 方式打包
xcodebuild archive -project ${workspace_path} -scheme ${scheme_name} \
-configuration ${configuration} \
-archivePath ${archive_path} -quiet || exit
fi # 检查是否构建成功(build)
if [ -d "$archive_path" ] ; then
echo '=============项目构建成功============='
else
echo '=============项目构建失败============='
exit
fi echo '编译完成-->>>--开始ipa打包'
xcodebuild -exportArchive -archivePath ${archive_path} \
-configuration ${configuration} \
-exportPath ${ipa_path} \
-exportOptionsPlist ${plist_path} \
-quiet || exit if [ -e ${ipa_path}/${ipa_name}.ipa ]; then
echo '=============ipa包导出成功============='
open $ipa_path
else
echo '=============ipa包导出失败============'
fi echo '打包ipa完成-->>>--开始发布ipa包' if [ ${upload_address} == "APPStore" ];then # 发布到APPStore
echo '发布ipa包到 =============APPStore============='
altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
"$altoolPath" --validate-app -f ${ipa_path}/${ipa_name}.ipa -u ${dev_account} -p ${dev_password} -t ios --output-format xml
"$altoolPath" --upload-app -f ${ipa_path}/${ipa_name}.ipa -u ${dev_account} -p ${dev_password} -t ios --output-format xml if [ $? = ];then
echo "=============提交AppStore成功 ============="
else
echo "=============提交AppStore失败 ============="
fi elif [ ${upload_address} == "PGY" ];then # 发布到蒲公英平台
echo '发布ipa包到 =============蒲公英平台============='
curl -F "file=@${ipa_path}/${ipa_name}.ipa" -F "uKey=${user_key}" -F "_api_key=${api_key}" -F "password=${password}" https://www.pgyer.com/apiv1/app/upload if [ $? = ];then
echo "=============提交蒲公英成功 ============="
else
echo "=============提交蒲公英失败 ============="
fi elif [ ${upload_address} == "FI" ];then # 发布到fir.im 平台
echo '发布ipa包到 =============fir.im平台============'
# 需要先在本地安装 fir 插件,安装fir插件命令: gem install fir-cli
fir login -T ${fir_token} # fir.im token
fir publish ${ipa_path}/${ipa_name}.ipa if [ $? = ];then
echo "=============提交fir.im成功 ============="
else
echo "=============提交fir.im失败 ============="
fi
else # 未配置发布地址
echo "=============未发布 ipa包(打包方式:$configuration) 到任何平台============="
fi # 输出总用时
echo "执行耗时: ${SECONDS}秒" exit

me测试项目

#!/bin/sh
#计时
SECONDS=
# 项目名称
project_name='AudioVideo'
# 项目路径
project_path='/Users/xueshan1/Desktop/AudioVideo/AudioVideo' # workspace/xcodeproj 路径(根据项目是否使用cocoapod,确定打包的方式)
if [ -e "${project_path}/${project_name}.xcworkspace" ];then
workspace_path="${project_path}/${project_name}.xcworkspace"
else
workspace_path="${project_path}/${project_name}.xcodeproj"
fi # scheme名称
scheme_name='AudioVideo'
# 项目版本
project_version='1.2'
# 开发者账号
dev_account=''
# 开发者密码
dev_password=''

 api_key=''
 issuer_id=''

# 配置打包样式:Release/ad-hoc/Debug
configuration='Release'
# 发布地址:蒲公英->PGY,苹果->APPStore, fir.im->FI
upload_address='APPStore'
# upload_address='PGY'
# 编译build路径
archive_path="/Users/xueshan1/Desktop/AudioVideo打包/Test.xcarchive"
# ipa包名称:项目名+版本号+打包类型
ipa_name='AudioVideo'
# ipa包路径
ipa_path2='/Users/xueshan1/Desktop/AudioVideo打包/ipa'
ipa_path="${ipa_path2}-V${project_version}-${upload_address}"
ipa_pathIPA=${ipa_path}/${ipa_name}.ipa # 打包配置plist文件路径
plist_path='/Users/xueshan1/Desktop/AudioVideo/AudioVideo/exportAppstore.plist' #打包方式配置,以及相应的需求配置
if [ ${upload_address} == "APPStore" ];then
configuration="Release"
plist_path=${project_path}/exportAppstore.plist
else
# if [ ${configuration} == "Release" ];then
# plist_path=${project_path}/exportAppstore.plist
# else
plist_path=${project_path}/exportDevelopment.plist
# fi
fi echo '=============正在清理工程============='
echo $configuration xcodebuild \
clean -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${configuration} -quiet || exit echo '清理完成-->>>--正在编译工程:'${workspace_path}
# build
if [ -d ${workspace_path} ];then
xcodebuild archive -workspace ${workspace_path} \
-scheme ${scheme_name} \
-configuration ${configuration} \
-archivePath ${archive_path} -quiet || exit
else
echo 'workspace 不存在'
fi # 检查是否构建成功(build)
if [ -d ${archive_path} ] ; then
echo '=============项目 build 成功============='
else
echo '=============项目 build 失败============='
exit
fi # exprot
echo '编译完成-->>>--开始ipa打包'
xcodebuild -exportArchive -archivePath ${archive_path} \
-configuration ${configuration} \
-exportPath ${ipa_path} \
-exportOptionsPlist ${plist_path} \
-quiet || exit if [ -e ${ipa_pathIPA} ]; then
echo '=============ipa包导出成功============='
open $ipa_path
else
echo '=============ipa包导出失败============'
echo "${ipa_pathIPA}"
exit
fi echo "-->>>--开始发布ipa包 ${ipa_pathIPA}" if [ ${upload_address} == "APPStore" ];then # 发布到APPStore
echo '发布ipa包到 =============APPStore=============' altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
# "$altoolPath" --validate-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml
# "$altoolPath" --upload-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml   #新命令, 使用api_key
xcrun altool --validate-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml  --apiKey ${api_key} --apiIssuer ${issuer_id}
xcrun altool --upload-app -f ${ipa_pathIPA} -u ${dev_account} -p ${dev_password} -t ios --output-format xml  --apiKey ${api_key} --apiIssuer ${issuer_id}   if [ $? = ];then
echo "=============提交AppStore成功 ============="
else
echo "=============提交AppStore失败 ============="
fi else # 蒲公英
echo '发布ipa包到 =============蒲公英============='
curl -F "file=@${ipa_pathIPA}" -F "_api_key=eb4171585a2f2df5674db48745520bc0" -F "password=maxueshan123" -F "buildInstallType=2" -F "buildPassword=2" https://www.pgyer.com/apiv2/app/upload if [ $? = ];then
echo "=============提交蒲公英成功 ============="
else
echo "=============提交蒲公英失败 ============="
fi fi # 输出总用时
echo "执行耗时: ${SECONDS}秒" exit

上传验证ipa包时候报错,  将开发者账号密码替换成 秘钥的方式

参考1

参考2

xcodebuild 自动化打包的更多相关文章

  1. XCode 自动化打包总结

    最近一个礼拜折腾xcode 中ipa 自动化打包,对我来说也说是磕磕碰碰.毕竟对mac下的命令行模式完全不熟悉.而且我们的项目是基于cordova的一个项目. 之前我自己对cordova 项目的命令行 ...

  2. iOS Jenkins 自动化打包构建

    前言 在测试app项目过程中,通常都是需要开发打测试包给到测试,但是无论是iOS还是Android的打包过程都是相当漫长的,频繁的回归测试需要频繁的打包,对于开发同学影响还是蛮大的.因此在这种情况下, ...

  3. IOS自动化打包介绍

    IOS自动化打包介绍  标签: app打包 , Ios打包 , iphone打包 , iphone自动化打渠道包    分类:无线客户端技术, 贴吧技术 摘要 随着苹果手持设备用户的不断增加,ios应 ...

  4. Jenkins实现Android自动化打包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77102359 本文出自[赵彦军的博客] 1.Tomcat 进入 https://t ...

  5. 自动化打包 Jenkins 持续集成 Git Gradle MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. ios实现fastlane自动化打包

    终于抽出时间来学习自动化打包了,app在测试阶段一天总会经历好几次的打包,每次打包真是身心疲惫,刚打完的包说不定就被测试妹子反应还要微调什么地方,我就真的有气没法出,打一次包怎么也得浪费十几分钟,还不 ...

  7. gulp自动化打包及静态文件自动添加版本号

    前端自动化打包发布已是一种常态,尤其在移动端,测试过程中静态资源的缓存是件很头疼的事情,有时候明明处理的bug测试还是存在,其实就是缓存惹的祸,手机不比pc浏览器,清理缓存还是有点麻烦的.所以自动化实 ...

  8. Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发

    Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 直接入正题: Screen Shot 2015-09-18 at 16.56.20.png Mac上安装Jekins jekins下 ...

  9. 使用Jenkins集成和自动化打包资料

    1.手把手教你利用Jenkins持续集成iOS项目 http://www.jianshu.com/p/41ecb06ae95f 2.Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 ...

随机推荐

  1. 标准标签库JSTL(JSP Standard Tag Library)

    1, 核心标签(最常用, 最重要的) 表达式控制标签 out 输出常量 value---直接赋值 输出变量 default---默认值 escapeXml---控制转义字符(默认为true, 如果需要 ...

  2. Map3

    map切片: 切片的数据类型如果是map,则我们称为 slice of map, map切片,这样使用则map个数就可以动态变化了. 案例演示:要求:会用一个map来记录monster的信息 name ...

  3. java_第一年_JDBC(3)

    事务 我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性.提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的set ...

  4. BZOJ 4675(点分治)

    题面 传送门 分析 由于期望的线性性,我们可以分别计算每个点对对答案的贡献 有三个人取数字,分开对每个人考虑 设每个人分别取了k个数,则一共有\(C_n^k\)种组合,选到每种组合的概率为\(\fra ...

  5. Codeforces 1156E Special Segments of Permutation(单调栈)

    可以用单调栈直接维护出ai所能覆盖到的最大的左右范围是什么,然后我们可以用这个范围暴力的去查询这个区间的是否有满足的点对,一个小坑点,要对左右区间的大小进行判断,只需要去枚举距离i最近的一段区间去枚举 ...

  6. python学习二十一天文件可读,可写,可执行的操作

    文件无非是可读,可写,可执行的操作,分别对应的模式 r ,w,x,只读模式,只写模式,只执行模式,a模式为追加模式,实际也是写操作模式,r+,w+,a+ 可读写模式,下面详细说模式的用法 1,文件的模 ...

  7. 【TWRP】使用adb sideload线刷ROM的方法

    本教程详细介绍 手机刷三方ROM 之前需要安装的 TWRP 这个神器工具 楼主的手机是小米,所以此教程以小米手机为例.其他手机原理类似 第一步,解锁引导程序 访问小米的官方解锁网站并申请解锁权限. 等 ...

  8. nginx的4层负载均衡配置

    前言:所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. 换句换说,二层负载均衡会通过一个虚拟MAC地 ...

  9. pyspider启动错误解决(Python 3.7)

    问题一 安装好pyspider之后,在启动的时候,报出上图错误. 原因 async和await从 python3.7 开始已经加入保留关键字中. 参考: What’s New In Python 3. ...

  10. css浮动、定位到底什么鬼?

    css操作元素位置有以下几种方式:float.position.top等. I float part 1.浮动首先会先将元素在正常文档流中删除,父容器无法获取元素高度,但是该元素依然影响布局. 2.任 ...