如果同一个应用, 需要做一个带广告Lite版本, 一个不带广告的Pro版本. 那么问题来了, 该如何优雅的去实现呢?
一般来说有两种实现方法:
-
一个把当前工程拷贝然后再修改, 这样做会导致后期维护成本过高, 每次修改都要同时改两个工程, 到后期修改简直提心掉胆, 不过操作傻瓜式.
-
另外一个种就是在一个Project里面创建两个Target, 然后通过判断Target来修改代码, 这样都是基于同一套代码做修改, 只是部分不相同的地方通过Target来添加不同代码, 后期修改维护成本低, 推荐大家使用这种方式.
• 不想看教程的童鞋, 点击这里可以下载我已经完成好的代码.
• 创建两个Target:
1.首先先选中Target一个已经存在的版本, 右键 Duplicate
![](https://i-blog.csdnimg.cn/blog_migrate/1ccdbd5d531fcc9d79ce4a27eadd30de.webp?x-image-process=image/format,png)
2.然后在弹出来的选择框选择 Duplicate Only
![](https://i-blog.csdnimg.cn/blog_migrate/ae51344642d9341cc62977e46a9c42c7.webp?x-image-process=image/format,png)
3.创建完之后你的新Target应该是和我的一样, 接下来我们就要修改Target, Scheme, Info-plist, 如图这样修改:
![](https://i-blog.csdnimg.cn/blog_migrate/9390bd476564c7ca4ddd890370805462.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/abd15c9982b4e6bdc9ea6325713fb1f1.webp?x-image-process=image/format,png)
4.修改完了之后Target, Scheme, plist的名字之后, 你需要在新的Target添加对应的plist文件, 修改CFBundleDisplayName
就可以修改应用的名字了.
![](https://i-blog.csdnimg.cn/blog_migrate/fe171e583d783e81c2d56a416ef19dd1.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/df7f9fa9b8fdd8c3fc26c026ee523bc2.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/97955c44ffac8100cc26cb07a214f4e6.webp?x-image-process=image/format,png)
5.还要记得修改一下Product Name
不然你的Bundle Identifier的后缀名有copy
和你的Target名字不一样, 你还需要在Bundle Setting
做一下修改.
![](https://i-blog.csdnimg.cn/blog_migrate/9c50da71c36b3e3ba24e3092fa9c19c8.webp?x-image-process=image/format,png)
• 开始为两个不同的应用添加不同的AppIcon, LaunchImage
- 在这个选择使用
Images.xcassets
里面设置AppIcon
和LaunchImage
, 注意这里一个是AppIcon
,另一个是AppIcon-2
, 以后编译Target的时候他就会跟随这里的设置去拿了开机图和Icon
77F1268E-6961-402F-8E39-51B135B4563C.png
![](https://i-blog.csdnimg.cn/blog_migrate/789ee83cbb79535d6dcbfa2fb64f4b11.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/9df73365cc5f4b27ea2497b84c8885b9.webp?x-image-process=image/format,png)
2.进入Images.xcassets
看下图片是不是都是勾选了两个Target, 保持和我下图一样的勾选, 如果没有勾选的话, 你在编译的不同Target的时候会获取不到资源.
![](https://i-blog.csdnimg.cn/blog_migrate/033e3d8015fa2c2e4b57dd928b495ce0.webp?x-image-process=image/format,png)
3.选择不同Target进行编译, 你的运行结果应该和我的截图一样, 有着不同的AppName
和AppIcon
,还有不同的LaunchImage
,但是代码是共用, 到这里你已经成功了一半了, 接下来你肯定是想知道如何在代码里面区别不同Target, 然后给它们添加其他的特性.
![](https://i-blog.csdnimg.cn/blog_migrate/e2c49503cf05818da2806cd62c6b09a8.webp?x-image-process=image/format,png)
• 在代码里面利用宏定义来区分不同的Traget
1.在Bundle Setting
里面设置一下Proprecessor Macros
添加一份KFREE
KPRO
的参数来区分到底是那个Traget. 在代码里面为需要用到这个宏去判断代码块.
![](https://i-blog.csdnimg.cn/blog_migrate/4ee3bbb9260714426bde34e6ee72fbf7.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/1225e16d95b071d5ab251df96bc5ce14.webp?x-image-process=image/format,png)
2.在代码里面添加Proprecessor Macros
里面宏定义, 你就会发现编译之前Xcode就会智能的选择不同代码. 这样你就共用一个项目管理两个不同版本的应用了, 大部分的代码都复用, 维护管理非常轻松.
![](https://i-blog.csdnimg.cn/blog_migrate/1d32b2d20f62958d45abb363b35a8f0e.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/aeccd774f9841f14217add092f59ef3f.webp?x-image-process=image/format,png)
总结:
苹果每年都会推出新的技术, 都是为了减少开发成本和更好的设计, 作为开发者的开发模式应当和苹果的理念一致. 用最优雅, 简洁的方式去实现功能.
原文链接:http://www.jianshu.com/p/1dc5f11fde96
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。