xcode多target管理不同的环境(pod多target配置)

说一下背景

自从这个项目不死不活的迭代了2年,从项目搭建到现在,一直都是自己在开发和维护,所以项目结构非常清晰,但是之前的水平写的代码现在看来也是惨不忍睹,不过本人比较懒,也就没有考虑过重构的事情 - - 是不是一位不合格的程序员呢,哈哈哈!

这个项目中开始是用oc写的,今年开始,由于喜欢上了swift,所以导致这次的迭代使用了swift开发,所以项目目前应该算是oc和swift混编(也没看到swift编译快到哪里去呀?),如何混编,这里就不多赘述了,百度搜一下很多,总结一下,大致就两点:

1.swift调用oc的代码,需要使用“桥接文件”,桥接文件基本上在你创建swift代码的时候会提示你创建,桥接文件里导入的是在swift代码中要使用到的oc代码。 

 桥接文件的配置路径在BuildSettings 中搜索  Swift

  只要路径正确,配置完成后,在桥接文件里引入swift代码中要使用的oc库即可。

2. oc代码调用swift代码文件。 在创建swift文件的时候,系统会自动创建一个 "productName-Swift.h"的文件,productName就是项目名,在要使用swift代码文件的地方 引入即可。这个文件是找不到的,但实际上是存在的。

--------------------------分割线-------------------------

以上是项目的背景,下面要说到使用targets了

在这个项目之前,从来没有使用过targets,不是懒 而是因为之前的项目没这个必要

但是这次客户有一个需求,这个app需要有一个内部版本,内部版本开放一些特殊的功能,而线上版本没有,所以才考虑使用targets来配置一下两种环境。

如果在相同代码或者90%代码不变的情况下,有部署多端或者部署多个环境的要求下,建议还是使用targets来管理,很方便。

1.创建targets

 这个不多说,很简单,单击目前已有的targets,选择“Duplicate”,复制一个相同环境的tagets,然后修改tagets名称。 然后  Manage Schemes,

 将两个tagets都选上,这样打包或者debug的时候,就可以选择不同的环境配置了

2.配置内部版target

  上面第一步创建好了targets后,需要对这个targets进行配置,首先就是在BuildSettings中搜索 “preprocessing”,设置一个内部环境独有的宏 kTargetInternal,这样就可以在代码中使用此宏了。

 

除了配置宏,还要配置info.plist。在上面的步骤中,当我们重新"Duplicate'一个targets的时候,也会重新生成一个plist文件,buildsetting搜索 'Packaging'

OK,配置结束,这个时候运行基本上没问题,你可以在这个targets中配置属于这个环境独有的图片,启动图等等。

一定要注意一下,如果你是用oc和swift混编的话,注意这里:

 由于不管有几个targets,在创建swift文件的时候,会默认生成一个productName-Swift.h的文件,所以这里一定不要配 $(TARGET_NAME)-Swift,这样会使你的程序报错,会提示你找不到xxxswift文件。不管在哪个targets中,一定要写死,

=------------------------------------------------------------------------------------------------------------------------------------------------------------

以下说一下

一个工程多个target引入CocoaPods的方式

(推荐)方式一:通过abstract方式引入

#targetA: [AFNetworking,Masonry]
#targetB:[AFNetworking,SDWebImage]
abstract_target 'abstract_pod' do  #这里的abstract_pod在实际targets中不存在,是虚拟
    pod 'AFNetworking'
    
    target 'targetA' do
        pod 'Masonry'
    end
    
    target 'targetB' do
        pod 'SDWebImage'
    end
end

方式二:循环target 添加pod

#多个target的pod引入,方式一:如每个pod都引入masonry
targetArray = ['target1','target2']
targetArray.each do |t|
    target t do
        pod 'Masonry', '~> 1.1.0'
    end
end

方式三:提取公共pods 各个target引入

#多个target的pod引入,方式二:如每个pod都引入masonry
def commonPods
    pod 'Masonry', '~> 1.1.0'
end

#工程一:
target 'AnyDoorDemo' do
    commonPods
    pod 'AFNetworking', '~> 3.2.1'
target 'AnyDoorDemoTests' do
    inherit! :search_paths
    pod 'Specta', '~> 1.0.7'
    pod 'OCMock', '~> 3.4.2'
    pod 'Expecta', '~> 1.0.6'
end

  target 'AnyDoorDemoUITests' do
    inherit! :search_paths
    # Pods for testing
  end
end

#工程二:
target 'HostApp' do
    commonPods
end

模板样例

#添加索引库索引文件地址
source 'https://github.com/LGLee/MySpaces.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

#多个target的pod引入
def commonPods
    pod 'Masonry', '~> 1.1.0'
end

#工程一:
target 'AnyDoorDemo' do
    commonPods
    pod 'AFNetworking', '~> 3.2.1'
    
    #测试相关↓
target 'AnyDoorDemoTests' do
    inherit! :search_paths
    pod 'Specta', '~> 1.0.7'
    pod 'OCMock', '~> 3.4.2'
    pod 'Expecta', '~> 1.0.6'
end

  target 'AnyDoorDemoUITests' do
    inherit! :search_paths
    # Pods for testing
  end
end

#工程二:
target 'HostApp' do
    commonPods
end
原文地址:https://www.cnblogs.com/niit-soft-518/p/11453449.html