酱酱不惊

Break my life, rebuild it

0%

CocoaPods进阶使用:共享Pods.xcodeproj给其它的Project

CocoaPods是iOS平台上流行的第三方包管理工具。基本的介绍及使用方法可参考《唐巧的博客——用CocoaPods做iOS程序的依赖管理》,这里就不做介绍了。

在CocoaPods的使用过程中,会根据Podfile的内容,来抓取第三方库的源文件和生成其它相关的文件。这些文件均存放在Pods目录中,并通过生成的Pods.xcodeproj项目来进行管理。除此之外,还有几个关键的文件位于目录:Pods/Target Support Files/Pods-XXX/ 中,下面会讲到如何使用它们来解决我们标题中的问题。

问题:什么情况下需要共享Pods.xcodeproj ?

有很多iOS App会同时开发iPhone和iPad两个独立客户端,而不是开发单独的Universal客户端。这时候通常有两个.xcodeproj工程,虽然单个工程通过两个Target也能达到类似的效果,但这里不考虑这种情况。如果两个.xcodeproj工程可以共享Pods.xcodeproj,那么维护Pods会是非常的方便。

示例:共享Pods.xcodeproj给其它的Project

让我们开始,看看如何通过一些设置来满足这个需求。

准备

我们创建SharePodsDeme目录来放置我们的工程文件,包括:Phone和Pad项目文件。

创建SharePodsDemoPhone工程

我们创建一个空的示例项目SharePodsDemoPhone,放置在SharePodsDeme目录里,注意文件的层级关系如下:

SharePodsDeme/
SharePodsDeme/SharePodsDemoPhone.xcodeproj
SharePodsDeme/SharePodsDemoPhone/
SharePodsDeme/SharePodsDemoPhone/*

在SharePodsDeme目录下创建Podfile,内容如下:

1
2
3
4
5
6
platform :ios, '8.0'
#use_frameworks!

target 'SharePodsDemoPhone' do
pod 'AFNetworking'
end

执行pod install后,会生成SharePodsDemoPhone.xcworkspace,打开SharePodsDemoPhone.xcworkspace后,如下图:

创建SharePodsDemoPad工程

用同样的方式在SharePodsDeme目录下创建SharePodsDemoPad工程,此时的目录结构见下图

拖入SharePodsDemoPad工程到SharePodsDemo工作区

将SharePodsDemoPhone.xcworkspace重命名为SharePodsDemo.xcworkspace后打开。将SharePodsDemoPad.xcodeproj拖入SharePodsDemo.xcworkspace中,注意:需要拖放到最顶层。

现在就可以在SharePodsDemo工作区中同时管理SharePodsDemoPhone和SharePodsDemoPad这两个项目了,不过此时SharePodsDemoPad项目中还不能引入Pods中的文件的。

复制xcconfig

在SharePodsDemoPad项目中创建Pods的Group,然后在Pods/Target Support Files/Pods-SharePodsDemoPhone/目录下找到Pods-SharePodsDemoPhone.debug.xcconfig和Pods-SharePodsDemoPhone.release.xcconfig这两个文件,并插入到新建的Pods Group中

注意:不要勾选Copy items if needed

设置Configureations

修改SharePodsDemoPad的项目Configureations设置,添加对应的配置文件,如下图

添加Build Phases

在Link Binary With Libraries中添加libPods-SharePodsDemoPhone.a

这个时候再试试编译SharePodsDemoPad,应该可以编译成功了。

为了让CocoaPods能够正常工作,还有几个Build Phases需要添加到SharePodsDemoPad中。这些Build Phases的名字都是以[CP]开头,具体的内容直接从SharePodsDemoPhone复制过来即可。

这样所有的设置就完成了,以后可以方便的共享Pods中的内容了。上面的这个流程其实就是CocoaPods命令中所执行的部分内容。希望这篇文章能够让你对CocoaPods有进一步了了解。

最终的项目文件:

最后

其实你不需要手动完成上面的步骤,试着把Podfile改成下面的样式,然后pod install结果是一样的:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
platform :ios, '8.0'
#use_frameworks!

target 'SharePodsDemoPhone' do
workspace 'SharePodsDemo'
project 'SharePodsDemoPhone'
pod 'AFNetworking'
end

target 'SharePodsDemoPad' do
workspace 'SharePodsDemo'
project 'SharePodsDemoPad'
pod 'AFNetworking'
end

其它

替换RubyGems源

由于河蟹的原因RubyGems无法正常访问,之前Taobao维护的镜像现在已经不再维护了,所以需要切换到Ruby China提供的镜像。

请尽可能用比较新的 RubyGems 版本,建议 2.6.x 以上。

$ gem update --system # 这里请翻墙一下

$ gem -v
2.6.3

$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/

$ gem sources -l
https://gems.ruby-china.org
# 确保只有 gems.ruby-china.org

查看详情或其它问题请访问 https://gems.ruby-china.org

Pods目录是否要放入版本管理系统中?

我的建议是把Pods目录也纳入版本管理系统之中,当然Podfile和Podfile.lock是必须放入版本管理系统中的。在团队开发过程中,确保开发环境的一致性非常重要。Pods目录中生成的文件会随着执行不同的命令而产生不同的变化,比如:不同CocoaPods版本;执行pod install或者pod update命令。另外,也保证了代码的完整性,在获取到最新的代码后,就可以开始编译项目了。

这样做主要的缺点是纳入版本管理系统的文件会更多,这个应该不是什么大问题。大的二进制文件可以使用LFS来管理。

CocoaPods进阶资料