前言
多环境:即不同环境,比如开发、测试、正式。保证安全生产,环境隔离的作用。
多Target: 在项目中添加多个 Target,,以达到代码复用。比如开发同一项目多App(那些App有高度复用性,有很多模块都是通用的。某某洗车用户端和商家端)都具有相同的登录注册页面流程,大部分共用的请求接口。
多环境配置
参考手把手教你一个ios App配置多环境变量,文章介绍了 build configuration 、xcconfig文件、多Target的配置。
多target 构建相似App
场景应用举例:
如何创建target
方式1:复制某个target
以某个基target为基础复制出一个新的 target,能够使用基 target之前存在的代码和文件资源,只需要做少量改动即可共享。
iOS开发之多个targetcsdn--浪得虚名
方式2:新建target
引入的target内容完全独立(包括Appdelegate info.plist等),当然也可以共享。
iOS一个工程实现多个Target (csdn -- 王颜华)
三、如何实现共享
![](https://i-blog.csdnimg.cn/blog_migrate/cf82c0ac75fa1ce66b382f9a3434bbb7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c78c0c61d7dbae7b8713128f63955a2d.png)
扩展:preprocessing Macors 通过宏切换
参考:preprocessor Macors : 全局宏命令的应用
swift 通过宏定义(进行条件编译[比如多app和或不同环境]) 如果是纯swift中调用的话 只需要在Swift Compiler - Custom Flags 的Other Swift Flags中添加即可。如果是OC与Swift 混编则还需要在preprocessing Macors 中设置。
代码中的条件编译:
let label = UILabel(frame: CGRect.init(x: 20, y: 20, width: 101, height: 50))
// ...
var appName = ""
#if APP_2 //通过预编译命令 来区别不同target
appName = "这是App2"
#else
appName = "这是App1"
#endif
label.text = appName
多target' podFile配置
方式1:(推荐)
platform :ios, '8.0'
# 多个target共用一套pod的写法,项目中不能有名字为CommonPods,防止冲突;
abstract_target 'CommonPods' do
# 共用的pod第三方
pod 'AFNetworking'
pod 'IQKeyboardManager'
# 项目中的target各自的设置
target ‘Target1’ do
#可以在这里添加Target1独自引用的pod第三方
end
target 'Target2’ do
#可以在这里添加Target2独自引用的pod第三方
end
end
方式2:
platform :ios, '8.0'
# 共用的pod第三方
pod 'AFNetworking'
pod 'IQKeyboardManager'
# 项目中的target各自的设置
target ‘Target1’ do
#可以在这里添加Target1独自引用的pod第三方
end
target 'Target2’ do
#可以在这里添加Target2独自引用的pod第三方
end
方式3:
platform :ios, '10.0'
use_frameworks!
def common_pods #定义为一个模块 这样就可以多target方便使用
#MVVM 框架 rx化所需支持库
pod 'RxSwift', '~> 3.5.0'
pod 'RxCocoa', '~> 3.5.0'
pod 'RxOptional', '~> 3.1.3'
pod 'RxDataSources', '~> 1.0.3'
pod 'NSObject+Rx', '~> 2.3.0'
pod 'Alamofire', '~> 4.6.0' #网络请求
pod 'ObjectMapper', '~> 2.2.5' #数据模型
pod 'AlamofireObjectMapper', '~> 4.1.0'
pod 'SwiftyJSON', '~> 3.1.4' #Swift 的json 解析
pod 'MJRefresh', '~> 3.1.12' #下拉刷新(OC)
pod 'Kingfisher', '~> 3.10.1' #网络图片加载
pod 'SnapKit', '~> 3.2.0' #布局
pod 'PKHUD', '~> 4.2.3' #hud提示框 swift
pod 'Diff', '~> 0.5.3' # 函数式tableview编程
pod 'AMapLocation-NO-IDFA' #高德地图定位 无广告
pod 'AMap3DMap-NO-IDFA’
pod 'AMapSearch-NO-IDFA' #高德地图搜索 无广告
pod 'JPush' #极光推送
pod 'JShare' #极光分享
pod 'QRCodeReader.swift’, ’~> 7.5.1' #扫二维码
pod 'EFQRCode' #也是扫二维嘛的
pod 'EFAutoScrollLabel', '~> 1.0.2'
pod 'WechatOpenSDK', '~> 1.8.0' #微信支付/分享SDK
end
target 'CarWashing' do
common_pods
end
target 'CarWashing-Staff' do
common_pods
pod 'AMapNavi-NO-IDFA', '~> 5.2.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'RxSwift'
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['-D', 'TRACE_RESOURCES']
end
end
end
end
end
参考
手把手叫你一个 iOS app 多环境变量
介绍 Build Configuration、xcconfig、多 target 配置。
在 Xcode 中管理不同的 Build Configuration
除了介绍 Configuaration 理解和配置,还介绍如何在 info.plist 中使用定义 key,以便在代码中使用。