xcode多target
原文:http://www.codza.com/free-iphone-app-version-from-the-same-xcode-project
There are more than 15,000 apps in the app store and hundreds are added daily. You need a way to show off your awesome creation to the millions of potential buyers.
One of the most effective marketing tools for small fish is releasing a free version of the app. To do that, you could copy the whole project, but then you would be duplicating code, maintaining it in two places and what if there’s an update?
In this post I’ll show you a better way: building two versions of your app from the same xcode project using targets and some other magic. Source code for the sample project is available here:twoForOne.
I’ve built a very simple app, it displays an image in UIImageView and has two buttons. Looks like this:
This is the pay-for version. The free version will have a different image (blue) and the expensive button will be hidden. This will demonstrate how to use a different set of resources (red image vs blue image) and how to modify code (hide button) at compile time based on which target is active.
First we’ll add a new build phase to the target. This will allow us to modify the background and icon resources later. It’s easier to add it now because we only need to do it for one target (it will be automatically duplicated with the target.) Right click on the target and select Add / New Build Phase /New Run Script Build Phase (you can click on the screen shot to see it better).
Type ./targetSetup in the script window. targetSetup is the script that does the work; we’ll create it later.
Take the Run Script build phase and move it to the top of the stack. We want this to run before any other build phase.
Now duplicate the target and name the new target twoForOneFree (right click on the target and select duplicate). (If you don’t have a right button on your mouse, go and get one. Those stupid soap bar mice are so not cool anymore… were they ever?):
Notice that xcode made a duplicate of the Info.plist file:
Info copy.plist is not a very nice name, so rename it to InfoFree.plist. You also have to tell the target to use the renamed plist, so open the info window for thetwoForOneFree target (right click on the target and choose get info- you see how much nicer it is that you have a right mouse button?), make sure that you are looking atAll Configurations andAll Settings and typeinfo into the search box. Change theInfo.plist file setting to point atInfoFree.plist:
In the same info window change the product name to twoForOneFree (this will be the name of the .app and by default this is what the iphone will display under the icon.) Typeproduct name in the search box to find the setting quickly:
The compiler doesn’t know which target is active, so we’ll define a directive that will be easy to use in code to create version specific modifications (this is what we’ll use to hide the expensive button). Still in the same window, search forother c. If you find a key called Other C Flags, you are in luck: set it to-DTWOFORONEFREEand skip the next paragraph.
If not, you need to create one. At the bottom of the window click the settings (gears) button and selectAdd User-Defined Setting and typeOTHER_CFLAGS for the key and-DTWOFORONEFREE for the value:
This instructs the compiler to define the TWOFORONEFREE macro for this target.
Look at lines 18-20 intwoForOneAppDelegate.m. We use an #ifdef directive to hide the expensive button if this macro is defined:
#ifdef TWOFORONEFREE
[expensiveButton setHidden:YES];
#endif
Obviously you;ll need to do more than hiding a button. You can use this same approach to do other modifications to the free version. You can also define aTWOFORONEmacro on thetwoForOne target for more flexibility (you can use that macro to add features that the free version doesn’t have.)
Now we’ll look at modifying resources. We want the free version to have a different bacground and also a different icon. I created two versions of the background, you can see them in theImages folder:
The UIImageView uses bg.png. The other two files, bg_red.png andbg_blue.png are not added to the xcode project (you can add them, but it’s not necessary). I want to copybg_red.png tobg.png when building the expensive version andbg_blue.png tobg.png for the free build.
Similarly, there is a Icon_red.png and Icon_blue.png at the project level, one of those will be copied toIcon.png to get the correct icon.
We already added the run script build phase that calls the targetSetup script. Now let’s create s shell script. Right click onResources(so much milage out of that new right mouse button!) and selectAdd / New File. From the dialog select theOther category (all the way at the bottom) and then theShell Script type:
In the next dialog enter targetSetup for the name and uncheck both targets (we don’t want this script to be copied into any of the targets at build time):
The script itself is very simple. It copies the correct bg file and Icon file based on the selected target (the build process conveniently sets an environment variable with the target name).
#!/bin/tcsh -f
echo .targetSetup: $TARGET_NAME
if ($TARGET_NAME == “twoForOne”) then
cp Icon_red.png Icon.png
cp Images/bg_red.png Images/bg.png
endifif ($TARGET_NAME == “twoForOneFree”) then
cp Icon_blue.png Icon.png
cp Images/bg_blue.png Images/bg.png
endif#
That’s it! Just set the desired target and you can build the expensive or free version from the same project:
Here are some screenshots. You can see that even the icons are different (as expected):
You can download the twoForOne xcode project
here
xcode多target的更多相关文章
- [Xcode]使用target进行协同开发
协同开发时候发现难免会因为某些条件宏导致上传到SVN的代码影响到其他同时,但是每一次去修很多条件编译也不是很方便,所以可以通过新建自己的target来控制product. 一.创建自己的target: ...
- xcode 添加target
- [转]Jenkins Xcode打包ipa
本地打包. 如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/ins ...
- Xcode entitlement 问题定位和解决指南
背景故事 前两天,本来一个运行正常.打包测试都没问题的XCode工程突然爆出各种奇怪的Entitlement错误: 什么签名的内容跟配置文件的不一致. 又或者 无法安装,因为签名或者配置文件的配置错误 ...
- 【转】xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)
原文网址:http://blog.csdn.net/mad1989/article/details/8167529 最近项目到了最后的阶段,测试完一切ok后,准备打包以及提交,不料看到网上众教程,好多 ...
- xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)
链接地址:http://blog.csdn.net/mad1989/article/details/8167529 打包发布APP流程真机测试和APP发布流程APP提交审核流程真机测试打包发布上传出错 ...
- Jenkins 集成Unity3D Xcode
如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)& ...
- Jenkins Xcode打包ipa
本地打包. 如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/ins ...
- 使用多target来构建大量相似App
转自 come from : http://devtang.com/blog/2013/10/17/the-tech-detail-of-ape-client-1/ 猿题库iOS客户端的技术细节(一) ...
随机推荐
- 简单理清一下proto与prototype
这篇博客主要是为了理清自己的思路. 先上图,所有内容都从这张图来讲. 在js中,所有的东西都是对象,包括是function. prototype这个属性是函数特有的.有两层含义,第一层含义指的是某对象 ...
- SQL注入(一)普通型注入
既然说了从头开始,先从注入开始吧,先来温习一下之前会的一些注入. PHP注入 0x01: 判断是否存在注入: ' 报错 ' and 1=1 正确 ' and 1=2 错误 0x01: or ...
- 性能测试之LoadRunner11 破解
1. 下载破解文件lm70.dll和mlr5lprg.dll lm70.dll文件,覆盖x:\Program Files\Mercury\LoadRunner\bin下文件即可. ml ...
- Hibernate持久化对象状态
在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...
- <转载>CSS解决图片过大撑破DIV的方法
DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...
- IOS之【地图MapKit】
iOS地图位置开发 iPhone SDK提供了三个类来管理位置信息:CLLocation CLLocationManager 和 CLLHeading(不常用).除了使用GPS来获取当前的位置信息 ...
- 与众不同 windows phone (2) - Control(控件)
原文:与众不同 windows phone (2) - Control(控件) [索引页][源码下载] 与众不同 windows phone (2) - Control(控件) 作者:webabcd介 ...
- android apk反编译
★反编译所需工具 1.AXMLPrinter.jar 2.d2j-dex2jar.bat 3.查看Jar包的GUI工具 ★功能实现 ◇解压缩 apk文件其实就是一个MIME为zip的压缩包,可以用wi ...
- POJ 2112 Optimal Milking【网络流+二分+最短路】
求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...
- js基础语法(一)
学习网站参考:http://www.w3school.com.cn/ 写入html输出: document.write('test out put'); 例子: http://www.w3school ...