ios-第三方库引入之CocoaPods


title: ios-第三方库引入之CocoaPods
categories: Ios
tags: [ios, xcode, CocoaPods, 第三方库]
date: 2021-02-03 11:26:31
comments: false
mathjax: true
toc: true

ios-第三方库引入之CocoaPods


前篇

  • CocoaPods使用 - https://juejin.cn/post/6844903731008536590
  • 看一遍就会的CocoaPods的安装和使用教程 - https://www.jianshu.com/p/1711e131987d

CocoaPods是iOS开发、macOS开发中的包依赖管理工具,效果如Java中的Maven,nodejs的npm。

CocoaPods是一个开源的项目,源码是用ruby写的,源码地址在GitHub上。

无论是做iOS开发还是macOS开发,都不可避免的要使用到一些第三方库,优秀的第三方库能够提升我们的开发效率。如果不使用包依赖管理工具,我们需要手动管理第三方包,包括但不限于:

  1. 将这些第三方库的源码拷贝到项目中
  2. 第三方库代码有可能依赖一些系统framework,我们需要把第三方库依赖的framework导入到项目中
  3. 当第三方库有更新时,需要将更新过的代码拷贝到项目中

以上工作虽然简单,但是如果项目中的第三方库较多,需要耗费大量的时间和精力。CocoaPods可以将我们从这些繁琐的工作中解放出来。


安装 CocoaPods

安装 CocoaPods 比较方便。通常情况下,macOS都安装了 ruby,直接使用 ruby 的 gem 命令即可安装 CocoaPods。

  1. 查看有没有安装ruby, 如果能正确的输出版本号,则说明 ruby 已经正确安装

    $ ruby --version
    ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]
    
  2. 查看gem的版本号, 并替换源

    $ gem --version
    3.0.3
    

    替换源. ruby的软件源 rubygems.org 使用的是亚马逊云的服务,国内普通网络是不能访问的。如果不能访问,可以将ruby的源换成国内淘宝的源

    $ gem sources --remove https://rubygems.org/ // 删除源
    $ gem sources -a https://gems.ruby-china.com/ // 添加 淘宝源
    
    $ gem source -l // 查看源
    *** CURRENT SOURCES ***
    https://gems.ruby-china.com/
    
    • 如果gem的版本号过低,安装CocoaPods可能会失败。所以在安装CocoaPods之前可以升级一下gem

      $ sudo gem update --system --verbose
      Latest version already installed. Done.
      
  3. 安装 CocoaPods

    $ sudo gem install cocoapods --verbose
    Fetching concurrent-ruby-1.1.8.gem
    ...
    33 gems installed
    
  4. 初始化 CocoaPods

    $ pod setup --verbose
    // 等待过程可能有点长,成功后会看到
    Setup completed
    
    • 查看 CocoaPods 有没有安装成功, 搜索 MJExtension 第三方库看看

      $ pod --version
      1.10.1
      
      $ pod search MJExtension
      

      ios-第三方库引入之CocoaPods

      表示 pod 已经已经 ok 了.

      若果报错: [!] Unable to find a pod with name, author, summary, or description matching MJExtension, 先不用管, 直接进行下一步引入试试看能不能安装成功


CocoaPods 工作原理

CocoaPods的使用相对来说是比较简单的。那么CocoaPods是如何完成这些工作的?以及为何生成了一个Pods工程?

实际上,CocoaPods是将所有依赖的第三方库都放到了Pods项目中

ios-第三方库引入之CocoaPods

所有的源码管理工作从住项目转移到了Pods项目中。

Pods项目最终会编译成一个libPods-项目名.a的文件,主项目只需要依赖这个.a文件即可。


引入 第三方库

  1. 在项目的指定模块引入 第三方库

    1. 在项目新建一个文件, 名为: Podfile, 内容如下 (规则参考: [Podfile 规则](#Podfile 规则))

      platform :ios, '9.0'
      
      target 'UnityApi' do
          pod 'YYModel'
      end
      
      • target 就是要引入第三方库的 模块
      • pod 就是第三方库
    2. cd 到 Podfile 所在目录, 安装

      $ pod install --verbose
      

      然后会自动生成一个 pods 工程

      ios-第三方库引入之CocoaPods

      同时主工程也也会引入对应的静态库

      ios-第三方库引入之CocoaPods

      此时的静态并不存在, 所以下一步是构建静态库

    3. 打开 pods 工程, 默认是没有 scheme, 创建需要的模块的 scheme, 然后 cmd + b 编译出 静态库, 默认输出到项目中的 build 目录下

      ios-第三方库引入之CocoaPods

      将这几个编译出来的 静态库 移到 UnityApi 模块找的到的地方, 如:

      ios-第三方库引入之CocoaPods

      (如果不移动这个编译出来的库, 会报错: library not found for -lPods-UnityApi)

    4. UnityApi 模块下编写代码

      // model
      @interface User : NSObject
      @property UInt64 uid;
      @property NSString *name;
      @end
          
      @implementation User
      @end
          
      // 将 model 转成 字段
      User* usr = [User new];
      usr.name = @"hello";
      usr.age = 123;
      NSDictionary *dict = [usr yy_modelToJSONObject];
      NSLog(@"--- dict: %@", dict);
      

      结果:

      2021-02-03 16:48:57.523644+0800 MyIosTest[34885:15899485] --- dict: {
          age = 123;
          name = hello;
      }
      

      之后追加其他第三方库, 在 Podfile 增加其他第三方库, 重走引入流程即可.


踩坑

编译报错: 链接不到第三方库

错误: library not found for -lPods-UnityApi

其实就是没有把 pods 工程编译出对应的 静态库移到正确的目录下


运行时闪退, 找不到第三方库

报错: unrecognized selector sent to instance

解决办法: 在 build settings -> other linker flags 中加多一个 -ObjC

ios-第三方库引入之CocoaPods

  • -ObjC: 这个flag告诉链接器把库中定义的OC类和Category或nib都加载进来,编译后app会变大,以为加载了很多不必要的文件导致可执行文件变大。但是如果静态库中有类和分类只有加入这个flag才行;但是当静态库中只有分类而没有类时,-ObjC就失效了,这时需要加-all_load 或 -force_load了

参考: https://cloud.tencent.com/developer/article/1624205


Podfile 规则

多 模块 组合 第三方库

  • 不同项目引入不同的第三方库 - https://*.com/questions/14906534/how-do-i-specify-multiple-targets-in-my-podfile-for-my-xcode-project

    platform :ios, '9.0'
    
    def shared_pods01
        pod 'YYModel'
        pod 'AFNetworking', '~> 4.0'
    end
    
    target 'UnityApi' do
        shared_pods01
    end
    
    target 'MyIosTest' do
        shared_pods01
    end
    

CocoaPods 相关的其他操作

增加新的第三方

如果使用过程中我还想添加其他的第三方怎么办,只要在Podfile里面接着添加,然后终端再执行pod install就可以了。

ios-第三方库引入之CocoaPods


更新CocoaPods中的第三方们。

第三方库们都有人在维护升级,我们需要隔断时间就要更新下我们工程中第三方库的版本。只需要终端输入命令pod update就可以了。

如果遇到pod install或者pod update慢的问题,原因在于当执行以上两个命令的时候会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少。加参数的命令如下:
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update


删除CocoaPods中的某些第三方们。

当我们需要去掉某个第三方库时,只需要在Podfile删除该引入该库的语句,然后执行pod update或者pod install就可以了。


将CocoaPods从项目中删除

如果你在以后的使用过程中不想用CocoaPods了怎么办?很简单,把多出来的东西们都删掉就可以了,不过为了项目正常运行,你需要手动导入已经使用的第三方们哦。

ios-第三方库引入之CocoaPods


升级CocoaPods

升级CocoaPods版本的命令和安装CocoaPods的命令一样,都是sudo gem install cocoapods
如果老版本升级cocoapods的时候提示Operation not permitted - /usr/bin/xcodeproj,改用命令sudo gem install -n /usr/local/bin cocoapods --pre就可以了。


卸载CocoaPods

卸载CocoaPods的命令是sudo gem uninstall cocoapods

执行完命令后,最下面打印Successfully uninstalled cocoapods字样就代表已经成功卸载了。


上一篇:Ruby's Adventure 08 添加网格陷阱 回存档点 敌人


下一篇:ruby-on-rails-将视频转换为Flash和mp4 ruby​​ on rails?