一、cocoapods 作用:

开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省配置和更新第三方开源库的时间。

如果开发项目不使用Cocopods的话,我们要做的步骤可能有:

1.把开源库的源代码复制到项目中

2.添加一些依赖框架和动态库

3.设置-ObjC,-fno-objc-arc等参数

4.管理他们的更新

二、cocoapods原理:

核心组件

CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是:CocoaPods/CocoaPods,CocoaPods/Core, 和CocoaPods/Xcodeproj(是的,CocoaPods 是一个依赖管理工具 -- 利用依赖管理进行构建的!)。

编者注CocoaPods 是一个 objc 的依赖管理工具,而其本身是利用 ruby 的依赖管理 gem 进行构建的

CocoaPods/CocoaPod

这是是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。

CocoaPods/Core

Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 Podfile 和 podspecs。

Podfile

Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅Podfile 指南。

Podspec

.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。

CocoaPods/Xcodeproj

这个 gem 组件负责所有工程文件的整合。它能够对创建并修改.xcodeproj和.xcworkspace文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个 gem。

运行pod install命令

当运行pod install命令时会引发许多操作。要想深入了解这个命令执行的详细内容,可以在这个命令后面加上--verbose。现在运行这个命令pod install --verbose,可以看到类似如下的内容:

可以上到,整个过程执行了很多操作,不过把它们分解之后,再看看,会发现它们都很简单。让我们逐步来分析一下。

读取 Podfile 文件

你是否对 Podfile 的语法格式感到奇怪过,那是因为这是用 Ruby 语言写的。相较而言,这要比现有的其他格式更加简单好用一些。

在安装期间,第一步是要弄清楚显示或隐式的声明了哪些第三方库。在加载 podspecs 过程中,CocoaPods 就建立了包括版本信息在内的所有的第三方库的列表。Podspecs 被存储在本地路径~/.cocoapods中。

版本控制和冲突

CocoaPods 使用语义版本控制 - Semantic Versioning命名约定来解决对版本的依赖。由于冲突解决系统建立在非重大变更的补丁版本之间,这使得解决依赖关系变得容易很多。例如,两个不同的 pods 依赖于 CocoaLumberjack 的两个版本,假设一个依赖于2.3.1,另一个依赖于2.3.3,此时冲突解决系统可以使用最新的版本2.3.3,因为这个可以向后与2.3.1兼容。

但这并不总是有效。有许多第三方库并不使用这样的约定,这让解决方案变得非常复杂。

当然,总会有一些冲突需要手动解决。如果一个库依赖于 CocoaLumberjack 的1.2.5,另外一个库则依赖于2.3.1,那么只有最终用户通过明确指定使用某个版本来解决冲突。

加载源文件

CocoaPods 执行的下一步是加载源码。每个.podspec文件都包含一个源代码的索引,这些索引一般包裹一个 git 地址和 git tag。它们以 commit SHAs 的方式存储在~/Library/Caches/CocoaPods中。这个路径中文件的创建是由 Core gem 负责的。

CocoaPods 将依照Podfile、.podspec和缓存文件的信息将源文件下载到Pods目录中。

生成 Pods.Xcodeproj

每次pod install执行,如果检测到改动时,CocoaPods 会利用 Xcodeproj gem 组件对Pods.xcodeproj进行更新。如果该文件不存在,则用默认配置生成。否则,会将已有的配置项加载至内存中。

安装第三方库

当 CocoaPods 往工程中添加一个第三方库时,不仅仅是添加代码这么简单,还会添加很多内容。由于每个第三方库有不同的 target,因此对于每个库,都会有几个文件需要添加,每个 target 都需要:

一个包含编译选项的.xcconfig文件

一个同时包含编译设置和 CocoaPods 默认配置的私有.xcconfig文件

一个编译所必须的文件

另一个编译必须的文件dummy.m

一旦每个 pod 的 target 完成了上面的内容,整个Podstarget 就会被创建。这增加了相同文件的同时,还增加了另外几个文件。如果源码中包含有资源 bundle,将这个 bundle 添加至程序 target 的指令将被添加到Pod文件中。还有一个名为Pod的文件,文件中包含了一些宏,这些宏可以用来检查某个组件是否来自 pod。最后,将生成两个认可文件,一个是plist,另一个是markdown,这两个文件用于给最终用户查阅相关许可信息。

写入至磁盘

直到现在,许多工作都是在内存中进行的。为了让这些成果能被重复利用,我们需要将所有的结果保存到一个文件中。所以Pods.xcodeproj文件被写入磁盘,另外两个非常重要的文件:Pod和Mani都将被写入磁盘。

Pod

这是 CocoaPods 创建的最重要的文件之一。它记录了需要被安装的 pod 的每个已安装的版本。如果你想知道已安装的 pod 是哪个版本,可以查看这个文件。推荐将 Pod 文件加入到版本控制中,这有助于整个团队的一致性。

Mani

这是每次运行pod install命令时创建的Pod文件的副本。如果你遇见过这样的错误沙盒文件与 Pod 文件不同步 (The sandbox is not in sync with the Pod),这是因为 Mani 文件和Pod文件不一致所引起。由于Pods所在的目录并不总在版本控制之下,这样可以保证开发者运行 app 之前都能更新他们的 pods,否则 app 可能会 crash,或者在一些不太明显的地方编译失败。

xcproj

如果你已经依照我们的建议在系统上安装了xcproj,它会对Pods.xcodeproj文件执行一下touch以将其转换成为旧的 ASCII plist 格式的文件。为什么要这么做呢?虽然在很久以前就不被其它软件支持了,但是 Xcode 仍然依赖于这种格式。如果没有 xcproj,你的Pods.xcodeproj文件将会以 XML 格式的 plist 文件存储,当你用 Xcode 打开它时,它会被改写,并造成大量的文件改动。

结果

运行pod install命令的最终结果是许多文件被添加到你的工程和系统中。这个过程通常只需要几秒钟。当然没有 Cocoapods 这些事也都可以完成。只不过所花的时间就不仅仅是几秒而已了。

补充:持续集成

CocoaPods 和持续集成在一起非常融洽。虽然持续集成很大程度上取决于你的项目配置,但 Cocoapods 依然能很容易地对项目进行编译。

Pods 文件夹的版本控制

如果 Pods 文件夹和里面的所有内容都在版本控制之中,那么你不需要做什么特别的工作,就能够持续集成。我们只需要给.xcworkspace选择一个正确的 scheme 即可。

不受版本控制的 Pods 文件夹

如果你的Pods文件夹不受版本控制,那么你需要做一些额外的步骤来保证持续集成的顺利进行。最起码,Podfile文件要放入版本控制之中。另外强烈建议将生成的.xcworkspace和Pod文件纳入版本控制,这样不仅简单方便,也能保证所使用 Pod 的版本是正确的。

一旦配置完毕,在持续集成中运行 CocoaPods 的关键就是确保每次编译之前都执行了pod install命令。在大多数系统中,例如 Jenkins 或 Travis,只需要定义一个编译步骤即可 (实际上,Travis 会自动执行pod install命令)。对于Xcode Bots,在书写这篇文章时我们还没能找到非常流畅的方式,不过我们正朝着解决方案努力,一旦成功,我们将会立即分享。

三、cocoapods 安装:

在iOS开发中,经常会使用到第三方库,CocoaPods可以用来方便的统一管理这些第三方库。 下面就和大家详细介绍一下CocoaPods的使用。

3.1 升级Ruby环境

$ sudo gem update --system

3.2 使用淘宝的RubyGems镜像

因为那堵墙阻挡了cocoa,我们可以用淘宝的Ruby镜像来访问cocoapods。按照下面的顺序在终端中敲入依次敲入命令:

$ gem sources --remove

//等有反应之后再敲入以下命令

$ gem sources -a

为了验证你的Ruby镜像是并且仅是taobao,可以用以下命令查看:

$ gem sources -l

只有在终端中出现下面文字才表明你上面的命令是成功的:

*** CURRENT SOURCES ***

上面所有的命令完成之后,这时候,你在终端中运行:

$ sudo gem install cocoapods

等上十几秒钟,CocoaPods就可以在你本地下载并且安装好了,不再需要其他设置。

四:使用CocoaPods

我们这里导入AFNetworking AFNetworking类库在GitHub地址

4.1 新建一个项目,名字为TextDemo

4.2 终端中,cd到项目总目录(注意:包含PodTest文件夹、PodTe、PodTestTest的那个总目录)如下图:

4.3 建立Podfile(配置文件)

接着上一步,终端输入

1

vim Podfile

回车键进入下图:

键盘输入 i,进入编辑模式,输入 低版本的cocoa pods在编写Podfile文件时这样写就可以了

1

2

platform :iOS, '8.0'

pod 'AFNetworking'

高版本的cocoa pods在编写Podfile文件必须这样写

1

2

3

4

platform :ios, '8.0'

target "TextDemo" do

pod 'AFNetworking'

end

然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq

注意:键盘输入 :后,才能输入wq。回车后发现tTextDemo项目总目录中多一个Podfile文件,如下图:

4.4 下载

然后输入

1

pod install

等待一会,大约3分钟。

安装成功,查看项目根目录:

注意:现在打开项目不是点击Tex了,而是点击打开Tex 进入项目就可以看到项目结构了:

五、使用过程中问题:

1. install和update命令的配置速度问题

在我们输入pod install或者pod update之后,CocoaPods首先会去匹配本地的spec库,在确认spec版本库不需要更新之后,才会下载相应的库文件,这样比较耗时,有时候,以为是卡死了呢。所以一般使用下面两个命令,跳过spec版本库更新匹配。

pod update --verbose --no-repo-update

pod install --verbose --no-repo-update

有朋友说不加--verbose,其实加--verbose的意义在于可以输出更详细的配置过程 debug信息,在书写时位置也可以换,跳过spec版本库更新匹配的重点是--no-repo-update,比如:

pod install --no-repo-update --verbose // 不更新,并打印出详细过程信息

2. The dependency **** is not used in any concrete target.

[!] The dependency UMengAnalytics-NO-IDFA is not used in any concrete target.

这个提示是因为,cocoapods升级为1.0以后,Podfile文件书写格式的问题,

1.0之前:

platform :ios

pod 'UMengAnalytics-NO-IDFA’

pod 'MBProgressHUD', '~> 0.9.2'

pod 'FMDB'

pod 'SDWebImage', '~> 3.7.3'

pod 'IQKeyboardManager', '~> 3.2.4'

pod 'MJRefresh', '~> 2.3.2'

pod 'MJExtension', '~> 0.2.0'

1.0之后:

platform :ios,’7.0’

target ‘ProjectName’ do #ProjectName工程名字

pod 'MBProgressHUD', '~> 0.9.2'

pod 'FMDB'

pod 'SDWebImage', '~> 3.7.3'

pod 'IQKeyboardManager', '~> 3.2.4'

pod 'MJRefresh', '~> 2.3.2'

pod 'MJExtension', '~> 0.2.0'

pod 'UMengAnalytics-NO-IDFA’

end

✨波浪线**~ > ** 含义:从指定版本到倒数第二位版本号升1为止,比如 ‘~> 0.3.7’所指的版本区间为[0.3.7, 0.4.0),即>=版本0.3.7,<版本0.4.0,详见guides.cocoa

3. Unable to satisfy the following requirements: - *** required by Podfile

这种提示主要是因为要添加的类库有最新版本,而你本地local specs repositories并没有更新其下载版本导致。

比如 Unable to satisfy the following requirements: - SDWebImage (~> 3.8) required by Podfile

处理方式有两种:

1、pod update更新本地库

2、降低Podfile文件中的版本;

4. 使用CocoaPods之后,头文件无法自动补齐问题

使用CocoaPods来管理三方库,还是比较方便的,但是突然发现一个美中不足的小问题,在使用import引入文件时,不能自动补齐,需要手工copy文件名,纠结了半天:

解决办法:

Target -> Build Settings ,User Header Search Paths条目中,添加${SRCROOT}或者$(PODS_ROOT),并且选择Recursive,递归搜索,然后就可以自动补齐了。

5. 在项目中移除CocoaPods三方库配置文件

如果我们在配置CocoaPods的三方库文件后,不在需要了可以移除指定库文件配置,具体步骤如下:

  • 删除工程文件夹下的Podfile、Pod和Pods文件夹;
  • 删除xcworkspace文件;
  • 打开xcodeproj文件,删除项目中的lib和Pods.xcconfig引用;
  • 打开Build Phases选项,删除Check Pods Mani和Copy Pods Resources;
  • 重新pod install
  • 如果不想使用pod了,可以使用 pod deintegrate,移除三方库,手动添加。

6. Pods written in Swift can only be integrated as frameworks; add use_frameworks! to your Podfile or target to opt into using it.

这种提示,主要是因为要添加的这个库有专有swift库,或者demo中有swift代码。

解决办法:在Podfile文件的target后面添加use_frameworks!,注意,这里有!。

比如[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pods being used are: ReactiveCocoa, ReactiveSwift, and Result

7. The XXXX [Debug] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-XXXX;. This can lead to problems with the CocoaPods installation

或者

The XXXX [Debug] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods-XXXX;. This can lead to problems with the CocoaPods installation

参考:the-target-overrides

解决方法:

  • Go to your target Build Settings -> Other linker flags -> double click . Add $(inherited) to a new line.
  • All these 3 errors would be gone by adding $(inherited) to

Header Search Paths

Other Linker Flags

Preprocessor Macros

in Project -> Target -> Build Settings

重新pod

pod install

1.《afnetworking如何使用》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《afnetworking如何使用》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3228257.html