Framework三 使用第三方库

Contents

使用 Cocoapods来管理framework的第三方依赖库.

http://guides.cocoapods.org/making/using-pod-lib-create


创建 工程

1
pod lib create lib工程名字

然后根据提示步骤,选择如下

  • 程序语言
  • 是否添加Test Framework
  • 是否添加UI Testing
  • 工程的前缀是什么

选择完毕之后Cococpods自动创建Lib工程,添加pods配置文件 xcworkspace


然后创建一个git仓库,来管理这个Lib工程

  • 使用github创建一个仓库
  • 然后将远程git仓库,clone到本地
  • 然后将前面创建的Lib工程目录下的所有文件拷贝到本地仓库目录下
  • 最后push到远程git仓库
1
2
3
git add.
git commit -m "info"
git push origin master

那么一个问题来了,就是库工程主App工程引用了同一个第三方开源库,会造成编译报错

  • 如: 库工程使用了AFN、主App工程也使用了AFN
1
那么需要将 库工程中的 所有的AFN源码文件,都加上一个 前缀,来区分开来.
  • 上面是我们自己手动修改,太麻烦。可以使用CocoaPods来给我们完成上述的 添加前缀 的体力劳动
1
CocoaPods打包库工程的时候,会默认将库工程依赖的所有 第三方库中的源码文件,都统一添加一个 之前创建Lib工程时 指定的 前缀.
  • 最后CocoaPods将AFN的源码打包成一个,添加到App工程


进入 Lib工程的根目录下,编辑MyLib.podspec添加 库工程依赖的其他第三库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Pod::Spec.new do |s|
s.name = "MyLib"
s.version = "0.1.0"
s.summary = "A short description of MyLib."

s.description = "具体的描述信息..."

s.homepage = "https://github.com/<GITHUB_USERNAME>/MyLib"
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
s.license = 'MIT'
s.author = { "xiongzenghui" => "[email protected]" }
s.source = { :git => "https://github.com/<GITHUB_USERNAME>/MyLib.git", :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

s.platform = :ios, '7.0'
s.requires_arc = true

# 存放 所有源文件 的目录 Pod/Classes/
s.source_files = 'Pod/Classes/**/*'

# 存放所有资源文件 Pod/Assets/
s.resource_bundles = {
'MyLib' => ['Pod/Assets/*.png']
}

# 指定 头文件 的 搜索位置
# s.public_header_files = 'Pod/Classes/**/*.h'

# 依赖的系统framework
# s.frameworks = 'UIKit', 'MapKit'

# 依赖的其他自定义库
# s.libraries = 'xxx.framework', 'xxx.framework', 'xxx.framework'

# 依赖的第三方开源库,如果有多个需要填写多个 s.dependency
s.dependency 'AFNetworking', '~> 2.6.3'

end

编写完之后,验证podspec文件是否正确是使用命令 在podspec所在目录下执行 pod lib lint

  • 成功之后的输出

  • 如果失败,按照提示完成所有的操作即可

  • 注意: 一定要先创建远程git仓库,来管理Lib工程


进入 Lib工程/Example/,执行pod installpod install --no-repo-update

1
找到包含 Podfile文件 的目录


添加库工程的源码文件

  • 添加源码的路径 Xcode工程路径

  • 添加源码的路径 本地路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MyLib
├── .travis.yml
├── _Pods.xcproject
├── Example
│ ├── MyLib
│ ├── MyLib.xcodeproj
│ ├── MyLib.xcworkspace
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ └── Tests
├── LICENSE
├── MyLib.podspec
├── Pod
│ ├── Assets 添加所有的资源文件
│ └── Classes 添加所有的源码文件
│ └── RemoveMe.[swift/m]
└── README.md
  • 在Xcode工程中的: Pods/Development Pods/MyLib/Pod/Classes目录下,添加 库源码
1
2
3
4
5
6
7
8
#import <Foundation/Foundation.h>


@interface NetManager : NSObject

+ (void)log;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
#import "NetManager.h"

//使用AFN第三方库
#import <AFNetworking/AFNetworking.h>

@implementation NetManager

+ (void)log {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSLog(@"manager = %@n", manager);
}

@end
  • 如果要添加私有的库源码,不向外暴露


只要 新增 类、资源文件、依赖的三方库、podspec文件修改、都需要重新运行pod install --no-repo-update来更新配置信息


App工程中的代码中使用库工程的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
大专栏  Framework三 使用第三方库ass="line">19
20
21
#import "XZHViewController.h"

//导入库工程的代码
#import <MyLib/NetManager.h>


@interface XZHViewController ()

@end

@implementation XZHViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//使用库代码
[NetManager log];
}

@end

库代码修改完毕之后提交到远程仓库,一定要打tag,然后将tag也推送到远程仓库

  • 提交库源码
1
2
3
4
5
6
7
8
9
10
git add .

当前提交的版本
git commit -a -m 'v0.1.0'

添加远端仓库(clone下来的工程可以不用执行)
git remote add origin git地址

推送到远程仓库
git push origin master
  • 给此次提交打一个tag,以及将tag推到服务器
1
2
3
4
5
使用当前版本号打一个tag
git tag -a 0.1.0 -m 'v0.1.0'

推送tag到远端仓库
git push --tags

库代码提交到远程git仓库之后,编辑库工程根目录下的podspec文件

  • 设置远程git仓库、以及此次打包需要的哪一个tag
1
s.source           = { :git => "https://github.com/xiongzenghuidegithub/MyLib.git", :tag => "0.1.0"}

验证podspec文件是否编写正确,在库工程的根目录下执行

1
pod lib lint

打包生成类库

安装打包插件 cocoapods-packager,这个插件对引用的三方库进行重命名很好的解决了类库命名冲突的问题

1
sudo gem install cocoapods-packager

打包成 .a 或 .framework

  • 打包成 .a
1
pod package BZLib.podspec --library --force
  • 打包出 .framework,不添加 --library参数即可
1
pod package BZLib.podspec --force

  • 在库工程的根目录下,可以找到新增加的目录,其目录下就是生成的framework文件,如下所示:

  • 注意,生成的framework,默认由CocoaPods完成了多cpu架构的编译,已经完成支持所有的cpu架构
1
i386, x86_64, armv7, armv7s, arm64

需要特别强调的是,该插件通过对引用的三方库进行重命名很好的解决了类库命名冲突的问题。

OK,到此位置就可以轻松的生成framework了。


如果需要使用 pod install来安装我们的库


首先需要创建一个用于存放 podspec文件 的远程git仓库

1
https://git.coding.net/xiongzenghui/SpecRepo.git

添加一个自己的所有PodSpect文件的远程git仓库,然后执行如下命令将自己的SpecRepo添加到系统CocoaPods的Spec库

1
pod repo add XiongSpecRepo https://git.coding.net/xiongzenghui/SpecRepo.git

进入 ~/.cocoapods/repos目录下,查看我们添加的spec仓库

1
2
3
xiongzenghuideMacBook-Pro:MyLib xiongzenghui$ cd ~/.cocoapods/repos
xiongzenghuideMacBook-Pro:repos xiongzenghui$ ls
XiongSpecRepo master

如果其他人员也需要操作这个spec仓库,需要给予权限.


将库工程下的PodSpect文件提交到本地SpecRepo,如下命令同时将这个podspec文件也Push到远程SpecRepo

1
pod repo push XiongSpecRepo MyLib.podspec

进入到 ~/.cocoapods/repos/XiongSpecRepo/查看添加的

1
MyLib

然后执行pod search 库名会从本地系统CocoaPods的所有的SpecRepo搜索这个库,最终查询到我们自己的SpecRepo XiongSpecRepo

1
2
3
4
5
6
7
8
xiongzenghuideMacBook-Pro:XiongSpecRepo xiongzenghui$ pod search MyLib

-> MyLib (0.1.1)
测试pod生成framework的YohunlUtilsPod.
pod 'MyLib', '~> 0.1.1'
- Homepage: https://github.com/xiongzenghuidegithub/MyLib
- Source: https://github.com/xiongzenghuidegithub/MyLib.git
- Versions: 0.1.1 [XiongSpecRepo repo]

注意: 团队内其他项目组需要使用,那么必须手动将之前的XiongSpecRepo添加到本地CocoaPods的Spec系统库中.


小结主要步骤:

  • 建立 两个 git仓库
  • 远程git仓库1,存放 库工程源码
  • 远程git仓库2,存放 所有的 PodSpec 文件

  • PodSpec文件用于生成库文件(.a 或 .framework)时,读取的配置文件

  • 指定从哪个git远程库,拉取 库源码
  • 获取哪个tag的源码
  • 以及源码位置
  • 依赖系统framework
  • 依赖的其他静态库
  • 依赖的第三方开源库

  • pod lib create 库工程名字 创建一个库工程

  • 然后编写spec文件 库工程名字.podspec
  • 做出如上所有修改之后
  • 执行命令 pod lib lint监测podspec文件是否语法正确

  • 执行 pod install下载依赖类库、以及更新系统所有配置(各种库文件的依赖..)

  • 注意: 每一次库工程发生变动之后,都需要执行

  • 然后编写 库工程的 所有源码

  • 提交库工程源码到git远程仓库、以及提交tag到git远程仓库

  • push 所有的源码
  • 对此次提交设置一个tag
  • push tag

  • 再次编写PodSpec文件

  • 修改对应的 库源码的 git地址
  • 修改对应的 库源码的 tag

  • 然后将 库工程的 PodSpec 文件 提交到CocoaPods的Spec库

  • 本机直接可以通过 pod install 库名安装库

  • 其他机器需要首先添加之前的PodSpec git 库到自己的本地CocoaPods的Spec库,然后再执行上面的安装命令


可以看到CocoaPods其实是

  • 首先将github or 其他git仓库中,所有的 podspec文件,拷贝到本地的Spec Repo
  • 然后再查询本地podspec文件找到要下载源码库的 git地址、以及tag、依赖关系

学习来源: http://www.cnblogs.com/brycezhang/p/4117180.html

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12361698.html