`
ggsonic
  • 浏览: 260032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS auto build

阅读更多
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环境中执行。
分享到:
评论

相关推荐

    iOS 10 App Development Essentials

    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 ...

    Mastering iOS 11 Programming, 2nd Edition 2017年出版553页

    This book is for developers who have some experience with iOS programming, but want to take their skills to next level by unlocking the full potential of latest version of iOS with Swift to build ...

    ios_auto_build:使用node.js实现ios定时触发fastlane自动打包

    ios_auto_build 使用node.js实现ios定时触发fastlane自动打包

    iOS.8.App.Development.Essentials

    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.9.App.Development.Essentials

    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 ...

    auto_build:Python 代码自动构建 xcode 项目。 目前,它仅适用于 iOS 项目。 并使用默认代码签名内容构建

    自动构建 Python 代码自动构建 xcode 项目。 目前,它仅适用于 iOS 项目。 并使用默认代码签名内容构建。

    Learning.iOS.UI.Development.17852881

    Chapter 4: Auto Layout Chapter 5: Adaptive User Interfaces Chapter 6: Layers and Core Animation Chapter 7: UI Interactions – Touches and Gestures Chapter 8: How to Build Custom Controls Chapter 9: ...

    iOS 7 App Development Essential

    Fully updated for iOS 7 and Xcode 5 and consisting of 89 in-depth chapters, the aim of this book is to teach you the skills necessary to build your own iOS 7 apps for the iPhone, iPad and iPod Touch....

    iOS自动打包脚本

    github找了很久自动打包的脚本(shell,python),最后我测试成功的只有2个(1:https://github.com/735344577/build,2:https://github.com/hytzxd/iOS-AutoBuild)。 相比而言1更加简便,2则配置化太发杂和繁琐。...

    Learning iOS UI Development pdf 无水印 0分

    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 9 Application Development in 24 Hours(SAMS,2016)

    • Use Auto Layout and Size Classes to adapt to different screen sizes and orientations • Build advanced UIs with Tables, Split Views, Navigation Controllers, and more • Read and write preferences ...

    Xcode自动化打包

    Usage: autobuild.py [options] Options: -h, --help show this help message and exit -w name.xcworkspace, --workspace=name.xcworkspace Build the workspace name.xcworkspace. -p name.xcodeproj, --...

    Xcode.6.Start.to.Finish.iOS.and.OS.X.Development.2nd.Edition

    Chapter 12 Auto Layout in a New View Chapter 13 Adding Table Cells Chapter 14 Adding an Editor Chapter 15 Unit Testing Chapter 16 Measurement and Analysis Chapter 17 An iOS Extension Chapter 18 ...

    Modern Auto Layout.zip

    How to build programmatic layouts without storyboards What is Auto Layout? What is a constraint? Who owns a constraint? How many constraints do I need? The many ways to create and edit a constraint ...

    Beginning iOS 8 Programming with Swift

    01 Build Your First App 02 Hello World App Explained 03 Introduction to Auto Layout 04 Prototyping Your App Before Writing Code 05 Creating a Simple Table Based App 06 Customize Table View Using ...

    iOS-2048-master

    tap "Auto Run" to run AI automatically. Check it out in the `AI` branch. You can also check out [this demo video on YouTube](https://www.youtube.com/watch?v=GF0ANNPpF8E). Thanks to [ov3y]...

    Agisoft Metashape Professional 1.5.3 Build 8407

    Agisoft Metashape Professional 1.5.3 Build 8407 (x64) Multilingual | 161.2 Mb Agisoft Metashape (formerly PhotoScan) is a stand-alone software product that performs photogrammetric processing of ...

    ios-bump-version

    iOS-Bump-版本 ... # If build-number is not set, auto-increment build number. build-number : ' ' 注意:在 Xcode 项目设置Versioning System Current Project Version和Versioning System为Apple Generi

Global site tag (gtag.js) - Google Analytics