ios批量打包
最近我们接到了新的需求,需要打出类似xx001-xx100共100个这样的ipa渠道包,不需要签名。(这批ipa包后续会用企业证书签名,不会影响AppStore的)
这些包所有的功能、内容都是一样的,区别在于不同的包在统计、连接我们服务器时会提供一个不同的字符串标示。
如果按照常规的打包方式,我们需要不断的修改工程中的值,然后一个个打包。。。这种毫无技术含量的活怎么能忍受!
简单思考之后可以想到,我们可以通过使用shell脚本来实现批量打包,渠道信息可以保存在应用的info.plist里面。
批量处理思路:
1. 通过改变某个设置或变量,引起工程中info.plist中某个值改变
2. 使用xcodebuild命令进行打包等处理
细分的话其实又可以有几种做法:
1.使用多个target
这种的优点是可以更深度的定制信息,参见唐巧的文章:http://blog.devtang.com/blog/2013/10/17/the-tech-detail-of-ape-client-1/
缺点是对于我们这种简单需求来说,操作略繁琐,代价较高。
脚本和下面的2类似,只是变量是target而已。
2.使用多个buildSetting
不同的build active architecture 设置不同的User-Defined值
第一版脚本由我的同事提供,采用的就是这种方式,比上面那种方式稍微简单了点
思路和步骤如下:
1. 在Xcode的build设置中,通过拷贝release生成多个build active architecture,分别以渠道名命名
2. User-Defined属性下增加名为Channel的key,针对不同的build设置不同的渠道值
3. info.plist中增加Channel键,值引用User-Defined下的设置${Channel}
(由于方案不够完美,该脚本就不在此贴出了)
当我看到这种方案的时候其实还是不满足的,因为需要改动工程配置等相关信息,还是很麻烦。
对于我们来说,打出来的包其实只有info.plist中一个预设的值不一样而已,其实可以不需要那么多的target或者那么多的buildsetting,只需要在打包时,用脚本改一下info.plist中对应的键值即可。
查找资料发现,命令修改plist值已经有内置的工具PlistBuddy,不过这工具使用时需要使用其绝对路径才能引用到,路径为/usr/libexec/PlistBuddy,工具的更多功能有兴趣的可以自己搜一下。
调整后,脚本为:
|
1
2
3
4
5
6
7
8
9
|
channels=( 渠道1 渠道2 渠道3 )for i in ${channels[@]}do xcodebuild -project ./你的工程.xcodeproj -scheme 你的scheme名称 -configuration Release archive -archivePath ./$i /usr/libexec/PlistBuddy -c "Set :Channel ""$i" ./$i.xcarchive/Products/Applications/*.app/info.plist rm -Rf ./$i.ipa xcodebuild -exportArchive —exportFormat ipa -archivePath ./archive.xcarchive -exportPath ./$i.ipa -exportWithOriginalSigningIdentity rm -Rf ./$i.xcarchivedone |
好了,完事具备,可以批量打包了
打包没有问题,嗯,不过好像很费时间啊。。。
回过头来我们再分析下打包流程:
1. 使用xcodebuild命令根据工程生成xcarchive文件
2. 使用xcarchive文件导出ipa,此过程中可以签名
对于一次打包过程来说,期间生成了xx.xcarchive文件,这个文件此时还没有进行任何的签名之类的操作,其实我们可以直接修改这个 xcarchive包中对应app文件内的plist,然后再导出成ipa,这样就可以共用一个xcarchive文件,节省下了N多次打包出该文件的时间。
好了调整一下得到我们的最终版:
|
1
2
3
4
5
6
7
8
9
|
xcodebuild -project ./你的工程.xcodeproj -scheme 你的scheme名称 -configuration Release archive -archivePath ./archivechannels=( 渠道1 渠道2 渠道3 )for i in ${channels[@]}do /usr/libexec/PlistBuddy -c "Set :Channel ""$i" ./archive.xcarchive/Products/Applications/*.app/info.plist rm -Rf ./$i.ipa xcodebuild -exportArchive —exportFormat ipa -archivePath ./archive.xcarchive -exportPath ./$i.ipa -exportWithOriginalSigningIdentitydonerm -Rf ./archive.xcarchive |
需要注意的是
1. 项目的info.plist文件中要提前设置一个Channel的键,值写上默认渠道。
2. 工程中相应的证书等还是要配置好,否则可能打包失败
3. 本文中打出来的ipa都是未签名的,需要签名的话自行搜索下,比较简单
将这脚本保存为archive文件,丢在工程目录下,使用方式:
打开终端,执行两行命令
cd 你的工程目录
./archive
好了,打完收工,这样你在工程中,使用
NSString* channel = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"Channel"];
拿到的就是渠道信息了。
来自:http://blog.csdn.net/u010124617/article/details/46547523
ios批量打包的更多相关文章
- 关于 iOS 批量打包的总结
关于 iOS 批量打包的总结 本文作者: 伯乐在线 - Tsui YuenHong .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 如果你曾经试过做多 target 的项目,到了测试人员要 ...
- iOS 批量打包--Shell脚本
由于公司有批量打包的需要,只是渠道号不一样,网上搜索一番,大致有两个方式:a) 从源程序一次性打出所有渠道的ipa包,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号 ...
- iOS 批量打包
如果你曾经试过做多 target 的项目,到了测试人员要测试包的时候,你就会明白什么叫“生不如死”.虽然 Xcode 打包很方便,但是当你机械重复打 N 次包的时候,就会觉得这纯粹是浪费时间的工作.所 ...
- Unity3D研究院之脚本批量打包渠道包研究
原地址:http://www.xuanyusong.com/archives/2418#comments 最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的 ...
- (转)最近研究xcodebuild批量打包的一些心得
以前的时候只知道做安卓开发的兄弟挺辛苦的,不但开发的时候要适配一堆的机型,好不容易开发完了还要打一堆不同的包给不同的市场.没想到现在这些市场都开辟iOS市场,于是需要打一堆的包给不同的市场,面对暂时给 ...
- Unity3D脚本批量打包渠道包
最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的机器,可能还有不同的渠道包,不同渠道可能用的SDK都不一样,这一切的一切都表明你的代码无法做到自适应的,除 ...
- 最近研究xcodebuild批量打包的一些心得
http://blog.csdn.net/tlb203/article/details/8131707 转自Rainbird的个人博客 以前的时候只知道做安卓开发的兄弟挺辛苦的,不但开发的时候要适配一 ...
- 在Android开发中使用Ant 三:批量打包
批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包.上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可. 在打包之前要做两个准备工作,一个是读取渠道,一个是修改存 ...
- iOS企业版打包(转载)
转自 http://www.cnblogs.com/shenlaiyaoshi/p/5472474.html 神来钥匙-陈诗友 iOS 企业版 打包 使用 iOS 企业版的证书发布应用可以跳过 A ...
随机推荐
- ubuntu 常用命令集合版(一)【大侠勿喷,菜鸟欢迎】(转载)
1:apt-get:(一般是要加sudo) debian系系统的软件包管理程序(其图形化前端就是大名鼎鼎的新立得了),会自动帮你搞定依赖关系最常用参数:update —-与你的软件源(在 ...
- android studio 引入第三方类库jar包
第三方类库jar包 这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile 'com. ...
- [3] 智能指针std::auto_ptr
[1]std::auto_ptr 对于编译器来说,智能指针实质是一个栈对象,而并非指针类型. 智能指针通过构造函数获取堆内存的管理所有权,而在其生命期结束时,再通过析构函数释放由它所管理的堆内存. 所 ...
- UICollectionViewDelegateFlowLayout 使用
import UIKit //UICollectionViewLayout //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell的尺寸,可以使用下面方法: // - (C ...
- Centos7下安装配置Redsocks
Redsocks是一个开源的网络程序,代码依赖开源的libevent网络库.Redsocks允许你将所有TCP连接重定向到SOCKS或HTTPS代理,比如Shadowsocks(Centos7下安装配 ...
- 给tabBar设置图片和字体颜色的几种方法
现在很多应用都使用到了tabBar,我们往往在给tabBar设置图片和字体的时候,当选中状态下,往往字体的颜色和图片的颜色不匹配,有时候就显得无从下手,我也常常忘了,所有写这个博客的目的,相当于给自己 ...
- java中的23中设计模式(转载的,有时间一定要熟读)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Android 网络框架 volley源码剖析
转载请注明出处: http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了, ...
- Unity-Animator在Editor状态下的单个/批量预览工具
网上有一个版本,但是调了半天用不了.于是自己动手写了一个 单个预览 批量预览 使用: 下载地址: http://files.cnblogs.com/files/hont/AnimatorClipPre ...
- AC自动机——Uva 11468 子串
题目链接:http://vjudge.net/contest/142513#problem/A 题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串, ...