Cocoapods作为OS X和iOS开发平台的类库管理工具,已经非常完善和强大。通常我们用pod来管理第三方开源类库,但我们也极有可能会开发一个用pod管理依赖关系的静态类库给其他人使用,而又不愿意公开源代码,比如一些SDK,那么就需要打包成.a文件。本文将以一个依赖于ASIHTTPRequest的静态类库,来演示如何创建使用了CocoaPods的静态类库以及打包的过程。

开发静态库(Static Library)

创建静态库,有2种方法。

不基于pod手动创建(deprecated)

过程比较繁琐,纯体力活不推荐,大体步骤说下

  1. 在Xcode中创建一个Cocoa Touch Static Library
  2. 创建Podfile文件;
  3. 执行pod install完成整个项目的搭建;
  4. 如果需要demo,手动创建示例程序,使用pod添加对私有静态库的依赖,重复执行pod install完成示例项目的搭建。

基于pod自动创建

只需要输入pod的lib命令即可完成初始项目的搭建,下面详细说明具体步骤,以BZLib作为项目名演示。

1.执行命令pod lib create BZLib。在此期间需要确认下面4个问题。

Would you like to provide a demo application with your library? [ Yes / No ]
yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Kiwi
Would you like to do view based testing? [ Yes / No ]
No
What is your class prefix?
BZ

第一个问题询问是否提供一个demo项目,通常选择Yes,其他的可以根据需要选择。命令执行完后,就会创建好一个通过cocoapods管理依赖关系的基本类库框架。

2.打开BZLib.podspec文件,修改类库配置信息,结果像这样。

Pod::Spec.new do |s|
s.name = "BZLib"
s.version = "0.1.0"
s.summary = "A short description of BZLib."
s.description = <<-DESC
An optional longer description of BZLib * Markdown format.
* Don't worry about the indent, we strip it!
DESC
s.homepage = "https://github.com/<GITHUB_USERNAME>/BZLib"
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
s.license = 'MIT'
s.author = { "brycezhang" => "brycezhang.cn@gmail.com" }
s.source = { :git => "https://github.com/<GITHUB_USERNAME>/BZLib.git", :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' s.platform = :ios, '6.0'
s.requires_arc = true s.source_files = 'Pod/Classes/**/*.{h,m}'
s.resource_bundles = {
'BZLib' => ['Pod/Assets/*.png']
} s.public_header_files = 'Pod/Classes/**/*.h'
s.frameworks = 'MobileCoreServices', 'CFNetwork', 'CoreGraphics'
s.libraries = 'z.1'
s.dependency 'YSASIHTTPRequest', '~> 2.0.1'
end

按照默认配置,类库的源文件将位于Pod/Classes文件夹下,资源文件位于Pod/Assets文件夹下,可以修改s.source_filess.resource_bundles来更换存放目录。s.public_header_files用来指定头文件的搜索位置。

s.frameworkss.libraries指定依赖的SDK中的framework和类库,需要注意,依赖项不仅要包含你自己类库的依赖,还要包括所有第三方类库的依赖,只有这样当你的类库打包成.a.framework时才能让其他项目正常使用。示例中s.frameworkss.libraries都是ASIHTTPRequest的依赖项。

podspec文件的详细说明可以看Podspec Syntax Reference

3.进入Example文件夹,执行pod install,让demo项目安装依赖项并更新配置。

localhost:Example bryce$ pod install --no-repo-update
Analyzing dependencies
Fetching podspec for `BZLib` from `../`
Downloading dependencies
Installing BZLib 0.1.0 (was 0.1.0)
Using Kiwi (2.3.1)
Installing Reachability (3.2)
Installing YSASIHTTPRequest (2.0.1)
Generating Pods project
Integrating client project

4.添加代码。因为是示例,只简单封装一下GET请求。

添加BZHttphelper类,注意文件存放的位置在Pod/Classes目录下,跟podspec配置要一致。

运行Pod install,让demo程序加载新建的类。也许你已经发现了,只要新增加类/资源文件或依赖的三方库都需要重新运行Pod install来应用更新

编写代码。示例代码很简单,创建了一个GET请求的包装方法。

#import "BZHttphelper.h"
#import <YSASIHTTPRequest/ASIHTTPRequest.h> @implementation BZHttphelper - (void)getWithUrl:(NSString *)url withCompletion:(void (^)(id responseObject))completion failed:(void (^)(NSError *error))failed
{
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];
__weak ASIHTTPRequest *weakrequest = request;
[request setCompletionBlock:^{
NSString *responseString = [weakrequest responseString];
completion(responseString);
}]; [request setFailedBlock:^{
NSError *error = [weakrequest error];
failed(error);
}];
[request start];
} @end

demo项目中调用测试。

#import "BZViewController.h"
#import <BZLib/BZHttphelper.h> @interface BZViewController ()
{
BZHttphelper *_httpHelper;
}
@end @implementation BZViewController - (void)viewDidLoad
{
[super viewDidLoad];
_httpHelper = [BZHttphelper new];
[_httpHelper getWithUrl:@"http://wcf.open.cnblogs.com/blog/u/brycezhang/posts/1/5" withCompletion:^(id responseObject) {
NSLog(@"[Completion]:%@", responseObject);
} failed:^(NSError *error) {
NSLog(@"[Failed]:%@", error);
}];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

成功打印,调用成功!

2014-11-23 16:52:23.946 BZLib[6329:96133] [Completion]:<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园
...

提交本地代码库

1.修改s.source。根据你的实际路径修改。

s.source = { :git => "/Users/name/workspace/BZLib", :tag => '0.1.0' }

2.提交源码,并打tag。

git add .
git commit -a -m 'v0.1.0'
git tag -a 0.1.0 -m 'v0.1.0'

验证类库

开发完成静态类库之后,需要运行pod lib lint验证一下类库是否符合pod的要求。可以通过添加--only-errors忽略一些警告。

pod lib lint BZLib.podspec --only-errors --verbose
...
BZLib passed validation.

打包类库

需要使用一个cocoapods的插件cocoapods-packager来完成类库的打包。当然也可以手动编译打包,但是过程会相当繁琐。

  • 安装打包插件

    终端执行以下命令
sudo gem install cocoapods-packager
  • 打包

    命令很简单,执行
pod package BZLib.podspec --library --force

其中--library指定打包成.a文件,如果不带上将会打包成.framework文件。--force是指强制覆盖。最终的目录结构如下

|____BZLib.podspec
|____ios
| |____libBZLib.a

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

文中的示例代码下载

BZLib

本文是通过pod及其插件实现了创建和打包的功能,如果对具体实现细节感兴趣可以查看相关源码,或者查看文末的扩展阅读进一步了解。

扩展阅读

使用CocoaPods开发并打包静态库的更多相关文章

  1. iOS开发——打包静态库与Framework

    最近老是需要做接口给别的客户,就顺便把打包的过程也写一下吧! 一.静态库 静态图里面只能是纯文件,里面不能再有第三方打包的静态库,也就是说,静态库不能打包静态库.这个用的比较多,一般自己公司写出来的东 ...

  2. iOS开发拓展篇—静态库

    iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 ...

  3. 【转】iOS开发拓展篇—静态库

    原文网址:http://www.cnblogs.com/wendingding/p/3893095.html iOS开发拓展篇-静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码 ...

  4. iOS打包静态库(完整篇)

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

  5. iOS项目开发常用功能静态库

    YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...

  6. ios打包静态库

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

  7. 打包静态库.a文件的方法(ar,ranlib,nm命令介绍)

    一 常用脚本 1 打包脚本 脚本如下,下面附上ar 和 ranlib命令参考(命令来自于网络) ALLLIB=*.aFILE=`ls *.a`#原来的库解压重命名 for F in $FILEdo   ...

  8. iOS 打包静态库.a文件(真机版 + 虚拟机)

    我们以打包IOS开发中封装的高地地图基础功能包 GDMap为例. 1>我们需要准备好需要打包的GDMap     2>接下来我们开始新建一个工程文件取名GDMap     3>删掉无 ...

  9. iOS开发中使用静态库 .a 文件

    ​​iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...

随机推荐

  1. DropDownList默认选中

    一.DropDownList默认选中 开始的笨方法: foreach (ListItem item in DropDownList1.Items)                       {    ...

  2. GPU大百科全书索引(有助于理解openGL工作流程)

    GPU大百科全书索引 0.GPU大百科全书 前传 看图形与装修的关系 1.GPU大百科全书 第一章:美女 方程与几何 2.GPU大百科全书 第二章 凝固生命的光栅化 3.GPU大百科全书 第三章:像素 ...

  3. 微信小程序 - 开发指南

    一.下载并安装开发工具 下载地址 二.创建项目 打开开发工具 添加项目 进入预览和调试界面 代码编辑器 编译并预览 三.启动流程 四.适用场景 五.技术框架 六.科普 [图片较大 - 点击查看]

  4. 重装win7、vs15、sqlserver08、驱动经验教训

    问自己:为什么要进行系统清洗 1.C盘已经接近爆满,vs2015无法安装. 2.C盘以前的残留软件.文件不知道如何化解,原vs2010卸载困难. 3.整个系统反应迟缓. 改进方案: 1系统C盘 2软件 ...

  5. Linux命令学习总结:cd命令

    命令简介: 该命令用来切换当前目录.cd 是change directory 的缩写 命令语法: cd [-L|-P] [dir] 使用示例 1:切换到当前目录的上一级目录 1: [root@DB-S ...

  6. oradebug/strace/pstack等分析数据库性能问题系列一

    对于性能问题或者一些比较奇怪妖异的问题,有很多点可以着手去分析. 准备写一个系列关于用ash/dba_hist_active_sess_history,用oradebug,用linux命令strace ...

  7. 笔记整理之BCP

    很多时候,需要批量的导数据,可能大家想到的第一反应就是右键数据库->任务->导入导出数据.但是其实微软自身提供的大容量导入导出工具,有bcp, bulkinsert 之类的也是很好用.今天 ...

  8. MySQL有关Group By的优化

    昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法 ...

  9. 1. 什么是Docker?

    ##### 一.什么是Dokcer?> Docker是一个开源项目, 诞生于2013年初, 最初是dotCloud公司内部的一个业余项目. 它基于Google公司推出的Go语言实现. 项目后来加 ...

  10. 【转】What is an SDET

    What is an SDET? SDET stands for Software Development Engineer in Test (or Software Design Engineer ...