http://www.weste.net/2011/12-3/78382.html
xcodebuild和xcrun实现自动打包iOS应用程序
2011-12-03 20:30:07来源:百度搜索研发部作者:
随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各种不便。
随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各种不便。
自动化打包背景介绍
1、背景
随着ios程序发布的渠道逐渐的增多,为每个渠道打包也成为特别耗费时间和体力的一项技术活了,而这一般大多数都是由rd来完成的。这样就占用了 rd很多的开发时间,何不把这些东西写成一个自动化的脚本,然后交给qa 或是 pm来完成这个打包过程了。经过一番调研发现网上这种脚本还是很少的,不过xcode 提供了shell编译工具 xcodebuild 和 ipa打包工具xcrun ,这就有理由让我们利用这两个工具写一个自动化的打包脚本来提高我们的工作效率和自动化程度。
2、ios程序包格式、渠道包格式
1) 产生多渠道的原因及多渠道带来的打包问题:随着iphone、ipad、itouch等手持设备火热销售,而它们上面的应用也随之火爆了起来,而随之而来的就是以上设备被越狱后就可以在越狱的设备上直接运行ipa程序包 而不用通过appstore去下载,这样一来国内就产生了众多的专门为越狱手机而开设的渠道提供ipa程序包的下载。随着越来越多的渠道,推广时为各个渠道打包就成了一项比较耗费时间和精力的技术活了,因此我们必须寻找一种自动化的方式 让打包变得高效简单。
2) Ios程序包分为appstore二进制文件跟渠道包两种格式
appstore二进制文件:通过xcode工具可以生成一个.app格式的二进制文件。
渠道包:格式为.ipa格式,在没有自动化打包工具之前都是利用xcode来生成相应的渠道包,而且每次只能生成一个渠道包,每次打包之前都得手动该渠道ID,带来的问题就是耗费时间、效率低下、容易出错、增加风险。
3、传统的ios打包方式
利用xcode 打包
1) appstore 二进制程序包
打开你的项目,进入“Edit Project Settings”,进入Configuration页面,选中Release点击下面的Duplicate,复制一个新的配置项出来,命名为 Distribution。然后进入Build页面,顶上的Configuration下拉框选中Distribution,下面的Code Signing Identity里面的Any iPhone OS Device后面对应的值选中你的那个Distribution的证书。然后点击“Build”–> “Build” 就可以编译程序了
编译成功后,你就可以在相应的build目录下看到一个.app的二进制文件。
2) 渠道ipa包
根据以上步骤同样配置好Distribution 证书 ,然后点击 “Build”–> “Build and Archive” 就可以编译程序了。接着打开“Window””Organizer” 左边栏中选择”ARCHIVED APPLICATIONS” 然后再右侧列表中选中刚才编译的程序包 再点击右侧右边顶部的”Share”按钮 保存到磁盘即可。就会生成一个.ipa的文件 即为渠道包。
注意:以上运行设备必须选择“Deveice“
4、传统的打包带来的问题
耗费时间、耗费体力、效率低下、只能依赖RD来完成、容易出错、发布风险比较高、QA回归确认比较困难、 不智能化。
自动化打包具体实现
C/C++ Code复制内容到剪贴板
xcodebuild[-project][-activetarget][-alltargets][-target]...[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]...[]...
xcodebuild[-version[-sdk |]]
xcodebuild[-showsdks]
xcodebuild[-find ][-sdk |]
xcodebuild[-list]
1、xcodebuild 介绍:
也可以在终端输入:xcodebuild –help 或 –h查看具体的选项
显示xcodebuildversion:xcodebuild –version
显示当前系统安装的sdk:xcodebuild –showsdks
显示当前目录下project Information:xcodebuild –list
需要注意的是:执行以上命令时必须把位置定位在ios项目文件的根目录下 否则会提示找不相关命令的。
2、xcrun 介绍:
此工具主要用于将app文件打包成ipa格式的程序包。(主要用于已越狱手机)。
具体用法如下:
其中:-v 对应的是app文件的绝对相对路径 –o 对应ipa文件的路径跟文件名 –sign
对应的是 发布证书中对应的公司名或是个人名 –embed 对应的是发布证书文件
注意如果对应的Distribution 配置中已经配置好了相关证书信息的话 –sign 和 –embed可以忽略
3、具体方案
a) 从源程序一次性打出所有渠道的ipa包 跟appstore的二进制包
为了让自动化脚本执行一次把所有的渠道包都打好,所以必须有一个配置文件用来存储所有的渠道名跟渠道号,而项目文件中也应该有个对应存储当前渠道号的文件,每次程序都从这个存放渠道号的文件中读取渠道号即可,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号的文件为当前循环的最新渠道号,让后逐个打包。
注:具体事例见附录
b) 提供一个ipa格式的母包 从母包生成其它所有的渠道包跟 appstore 包
qa的一些疑问,如何确保所有的渠道包就是他们验证过的那份代码呢?
的确,以上代码每次都是重新对程序进行打包,可qa往往测试验证的只有一个包,如果个个去验证无意中之中又增加了qa的工作量哈!!而且风险也不可控。因此基于上面的问题我们想出了一下办法:qa只验证一个程序包(即母包)如果这个包通过验证 我们就通过母包去生成其它渠道的包,这样一来qa也不用确认那么多的渠道包了,风险也得到了有效的控制。
可能你会问:用一个包生成其他的包可行么??
原因是这样的:因为每个渠道只是渠道号发生变化,而其他的内容又不会发生变化,而我们的渠道号又是存储在sourceid.dat这个文件中的,所以只要改变母包中的sourceid.dat文件的内容即可,而ipa包又是同zip格式进行压缩,所以基本思路就是通过zip先对母包进行解压,然后改变sourceid.dat的内容 最后再用zip进行压缩成相应的渠道包即可。
Ipa包的目录:
注:具体事例见附录
一些问题
当有些shell命令在mac的终端中运行不通过时,请确保你的shell脚本是在mac环境下编写的而不是同xp等其他环境中copy过来的。因为mac跟xp的编码是不一样所以会有问题。
总结:
通过从母包打出其他渠道的包这种方法:得到以下好处
i. 降低了rd的工作量,一起qa的工作量。
ii. 让测试发布程序时的风险得到了控制。
iii. 提高了打包发布工作效率。(几十个包 只需短短的几分钟)。
iv. 提高了自动化。
v. 不依赖mac 以及xcode环境 直接在linux 下即可完成 从母包生成其它包
附录
利用xcode环境一次生成所有包的shell 脚本代码:
C/C++ Code复制内容到剪贴板
#!/bin/sh
xcodebuild clean -configuration Distribution //clean项目
distDir="/Users/xxxx/dist"
releaseDir="build/Distribution-iphoneos"
version="1_0_0"
rm -rdf "$distDir"
mkdir "$distDir"
for line in $(cat data.dat) //读取所有渠道号data.dat文件
do
ipafilename=`echo $line|cut -f1 -d':'` //渠道名
sourceid=`echo $line|cut -f2 -d':'` //渠道号
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="youtargename" //项目名称(xcode左边列表中显示的项目名称)
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
echo "$sourceid" > sourceid.dat
echo "sourceid.dat: "
cat sourceid.dat
rm -rdf "$releaseDir"
ipapath="${distDir}/${targetName}_${version}_from_${sourceid}.ipa"
echo "***开始build app文件***"
xcodebuild -target "$targetName" -configuration Distribution -sdk iphoneos build
appfile="${releaseDir}/${targetName}.app"
if [ $sourceid == "appstore" ]
then
cd $releaseDir
zip -r "${targetName}_${ipafilename}_${version}.zip" "${targetName}.app"
mv "${targetName}_${ipafilename}.zip" $distDir 2> /dev/null
cd ../..
else
echo "***开始打ipa渠道包****"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipapath" --sign "iPhone Distribution:xxxxxx"
fi
done
注:以上的data.dat文件为存放渠道号列表的文件 其格式为:3g:1001b 即 (渠道名:渠道号) sourceid.dat 为项目文件中存放渠道号的文件(内容只有一个渠道号)。当然了上面脚本只是说明了下如何利用xcodebuild 和 xcrun 进行打包 以及自动打包的一个逻辑,shell脚本好的同学可以自由发挥哈。。。
从ipa格式的母包生成其它渠道包的shell脚本实例:
复制内容到剪贴板
#!/bin/sh
sourceipaname="母包名.ipa"
appname=”app文件名.app” //加压后Pauload目录项.app文件名需要根据自己的项目修改
distDir="/Users/lxxx/Qa" //打包后文件存储目录
version="1.0.0"
rm -rdf "$distDir "
mkdir "$distDir" unzip $sourceipaname //解压母包文件
for line in $(cat data.dat) //读取渠道号文件并进行循环
do
ipafilename=`echo $line|cut -f1 -d':'`
sourceid=`echo $line|cut -f2 -d':'`
echo "ipafilename=$ipaname"
echo "sourceid=$sourceid"
targetName="ipa包名"
echo "sourceid=$sourceid"
echo "ipafilename=$ipafilename"
cd Payload
cd $appname
echo "replace sourceid.dat before: "
cat sourceid.dat
echo "$sourceid" > sourceid.dat
echo "replace sourceid.dat after: "
cat sourceid.dat
if [ $sourceid == "appstroe" ]
then
cd ..
zip -r "${targetName}_${version}_from_${sourceid}.zip" $appname //appstore二进制文件
mv "${targetName}_${version}_from_${sourceid}.zip" $distDir
cd ..
else
cd ../..
zip -r "${targetName}_${version}_from_${sourceid}.ipa" Payload //打成其他渠道的包
mv "${targetName}_${version}_from_${sourceid}.ipa" $distDir
fi
done rm -rdf Payload
注:以上data.dat也是用来存储所有渠道号的,sourceipaname就是通过qa验证的母包,appname为ipa包加压后Payload 目录下的app文件名并且以上所有文件必须与脚本文件保持在同一目录下以及在mac环境中执行。
分享到:
相关推荐
这篇文章将深入探讨`xcodebuild`工具的使用以及如何编写一个类似`auto_build.sh`的自动化脚本来处理iOS应用的打包流程。 首先,我们需要理解`xcodebuild`。它是Xcode命令行工具的一部分,允许开发者在命令行环境中...
19. Working with iOS 10 Auto Layout Constraints in Interface Builder 20. An iOS 10 Auto Layout Example 21. Implementing iOS 10 Auto Layout Constraints in Code 22. Implementing Cross-Hierarchy Auto ...
1. Python脚本文件(如`autobuild.py`),实现了自动编译和上传的功能。 2. 配置文件(如`config.ini`),用于存储如API key、证书路径等信息。 3. 可能还有辅助脚本或工具,用于处理特定任务,如处理Plist文件、...
标题中的"auto_build"是一个表明该项目专注于自动化构建的术语,而“Python 代码自动构建 xcode 项目”则意味着它使用Python脚本来自动化Xcode的构建过程。Xcode是Apple开发的集成开发环境(IDE),主要用于编写iOS...
The aim of this book is to teach the range of skills necessary to build apps for iOS 8. iOS 8 App Development Essentials takes a modular approach to the subject of iOS 8 application development for ...
`ios_auto_build`项目就是针对这一需求,利用Node.js和Fastlane技术实现了一个定时触发的iOS自动打包解决方案。以下是这个项目的核心知识点及详细说明: 1. **Node.js**:Node.js是一个基于Chrome V8引擎的...
The aim of this book, therefore, is to teach you the skills necessary to build your own apps for iOS 9. Assuming you are ready to download the iOS 9 SDK and Xcode 7, have an Intel-based Mac and ideas ...
- 由于iOS设备有多种屏幕尺寸,Auto Layout和Size Classes被用来自动调整界面布局,确保在不同设备上都能正确显示。"无需添加约束"可能意味着"MineVC"已经预设了合适的约束,或者它的布局是动态计算的。 6. **MVC...
3. Build Your First App and HelloWorldAppExplained: 这部分内容会引导读者如何构建自己的第一个iOS应用,并对“Hello World”应用进行详细解析,让初学者理解应用的基本结构。 4. AutoLayout和Stack Views: 在...
在压缩包文件名"Autobuild-master"中,我们可以推断这是一个包含整个自动化构建系统的仓库主分支。通常,这样的仓库会包含Python脚本、配置文件、README文档等,指导用户如何设置和运行这个自动化流程。其中,Python...
Xcode, Apple's integrated development environment (IDE), is the primary tool for developing iOS applications. The build settings within Xcode are crucial for configuring how your application is built ...
github找了很久自动打包的脚本(shell,python),最后我测试成功的只有2个(1:https://github.com/735344577/build,2:https://github.com/hytzxd/iOS-AutoBuild)。 相比而言1更加简便,2则配置化太发杂和繁琐。...
Build compelling user interfaces that users will enjoy using the iOS UIKit framework Make your iOS apps easily recognizable and familiar with the UIKit framework Use this comprehensive, step-by-step ...
《XcodeAutoBuild-master:Python实现iOS代码自动化打包与上传至蒲公英平台》 在iOS应用开发过程中,持续集成和自动部署是提高效率、确保质量的重要环节。"XcodeAutoBuild-master"项目就是这样一个解决方案,它利用...
13. **Build Settings**:理解并熟练调整Build Settings,如Compiler Settings,可以定制编译选项,优化代码性能。 14. **Simulator的多设备管理**:Xcode的Simulator可模拟多种iOS设备,方便开发者在不同环境下...
由于iOS设备的屏幕尺寸和方向各异,源码中可能包含了Auto Layout或Size Classes的使用,以确保分享界面在不同设备上都能正确显示。 10. **权限管理** 分享内容可能涉及用户的隐私,因此源码可能涉及到获取用户...
源代码包含了Xcode项目文件,你可以通过它们了解项目的结构,包括目标(Target)、配置(Configuration)、构建阶段(Build Phases)以及资源(Resources)的组织方式。 4. **多线程编程**: 在iOS中,多线程通常...