iOS-如何将自己的动态库上传到CocoaPods

开篇

作为一名iOS开发者,一定用过CocoaPods吧?如果没有用过,可以查看CocoaPods官网

CocoaPods是一款用来帮助我们管理第三方依赖库的工具。它可以解决库与库之间的依赖关系,下载库中源代码,同时通过创建一个.xcworkspace文件来将这些第三方依赖库和我们的工程连接起来,供我们开发使用。其目的是让我们能够更直观、集中地管理第三方库。

下面介绍一下如何将自己的动态库添加到CocoaPods中。由于在创建的过程中,遇到了许多坑,这篇文章希望可以让后来者少走一些弯路。


一. 准备工作

1.申请GitHub账号(如果已有账号,可以忽略该步骤)

GitHub官网 具体申请流程这里就不说了,可以根据提示完成注册 (ps:完成注册之后GitHub会发送验证邮件到你的邮箱,先验证一下)

2. 创建GitHub仓库

(1)登录成功之后,右上角自己的头像下方,选择“New repository”,如图1-2-1

image

(2)创建新仓库,如图1-2-2

image

说明:LICENSE文件,开源协议,建议选择。会自动生成一个格式是 MIT的文本文件,里面有开发者名字和年份。当然也可以不选择,copy别人工程里的LICENSE文件到自己的工程中(ps:顺便修改一下里面的年份和作者信息)。如果没有LICENSE文件,在后续验证.podspec文件的时候,会出现警告。.podspec文件在下文会详细介绍。

(4)创建完成之后,如果没什么问题的话,GitHub仓库里面有LICENSE文件。

3. 将本地项目上传到GitHub仓库

下载GitHub客户端,将自己的代码上传至GitHub!

之后在github仓库里面会有添加的本地文件,如图1-3-9

image

或者用终端传上去,具体可参考我写的Mac如何用终端将本地项目上传到自己的github

此时,所有的准备工作就已经完成。


二. 创建podspec文件流程

1. 注册trunk账号

(1)在注册trunk之前,通过 pod --version 查看当前的CocoaPods版本是否足够新。trunk需要pod在0.33及以上版本,如果版本太低,需要升级版本,执行以下命令:

$ sudo gem install cocoapods

(2)等待升级完成之后,执行注册操作:

$ pod trunk register 你自己的邮箱 '你自己的用户名' --description='imac' --verbose

说明:需要替换成你自己的邮箱和名字,--description是简介,加不加都可以,加上 --verbose 可以看到详细信息。如果顺利的话你会收到一份邮件,需要点击验证。

(3)查看自己的注册信息,如图2-1-3:

$ pod trunk me

image

附:如果你的pod是由多人维护的,你也可以添加其他维护者

$ pod trunk add-owner 项目的POD名称 其他人的邮箱

2.配置podspec文件

(1)添加podspec文件

$ cd 到工程目录下,添加podspec文件

$ pod spec create SDKManager

之后会出现以下界面,你会发现本地文件目录下多了一个.podspec文件

说明:该.podspec文件是自动生成的,里面有一些文件规范,可以根据里面的注释填写,下文会详细介绍到。

(2)podspec文件讲解

spec.name 必须和这个文件的名字相同
spec.version 当前的版本号,要与稍后的GitHub上的tag同步
spec.summary 简单描述
spec.description = <<-DESC
详细描述
DESC
spec.homepage GitHub仓库地址
spec.license 和创建时候填一样的 MIT
spec.author 名字和邮箱
spec.platform 系统和最低支持的版本
spec.source git的地址和tag号 tag => specversion 即可
spec.source_files 这个是以后通过pod下载下来的代码文件,注意路径,第一个双引号内是本地仓库的名字,第二个双引号是具体的.h和.m的路径,从工程名字开始,如果要包含MyLogin和他的子文件夹中的所有.h和.m,第二个双引号可以这么写"MyLoginDemo/MyLoginDemo/MyLogin/**/*.{h,m}"
spec.frameworks 用到的系统框架,这里可以写多个,用逗号分隔
spec.libraries 依赖的系统资源
spec.vendored_frameworks 用到的你手动拖入工程的三方SDK,这些到时候在使用时也会跟着一起下载下来,同样注意路径,这里可以写多个,用逗号分隔
spec.resource 用到的资源文件,如果有多个可以这么写( MyLoginDemo/MyLoginDemo/MyLogin/**/*.{bundle, plist,json} )
spec.vendored_libraries 用到的你手动拖入工程的三方.a,同样是注意路径
spec.dependency 依赖的第三方库,通过pod导入的,如( spec.dependency “SDWebImage”, “~> 3.8” ),可以写多个,后边最好跟版本号,避免不必要的错误
spec.requires_arc 支持ARC
spec.pod_target_xcconfig 这个是稍后验证的时候,当报这个错的时候添加的:
( 去除模拟器可写为 spec.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => '' }   )

示例文件如下:

Pod::Spec.new do |s|

  s.name         = "Demo"
  s.version      = "1.0.0" # 版本号
  s.summary      = "This is a Demo"
  s.description  = <<-DESC
                   ‘This is a Demo file’
                   DESC
  s.license      = { :type => "MIT", :file => "LICENSE" }
  s.author       = { "Demo" => "text@email.com" }

  s.homepage     = "https://github.com/demo/Demo"
  s.source       = { :git => "https://github.com/demo/Demo.git", :tag => s.version.to_s }

  s.platform     = :ios, "10.0"
  s.ios.deployment_target = '10.0'

  s.frameworks = 'UIKit', 'Foundation'
  s.libraries = 'c++', 'c++abi', 'xml2'

  s.vendored_frameworks =  'Demo.framework'
  s.vendored_libraries = 'Demo_Test/*.a'

  s.resources = ['Demo.bundle']
  s.source_files = ['Demo_Test/*.h']

  s.xcconfig = { "OTHER_LDFLAGS" => "-ObjC" }
  s.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => '' }

  s.dependency 'SDWebImage', '~> 5.0' # 依赖的第三方库
  
end

说明:以上就是.podspec文件的解释,podspec文件是开发整个SDK的关键性文件,里面有一些不常用的属性只是做了简单介绍,如果有兴趣的小伙伴,可以深入研究,一起探讨。

(3)验证.podspec文件的正确性

$ pod lib lint --verbose --allow-warnings

说明:

① pod lib lint是利用脚本执行代码文件,--verbose是查看详细执行过程,--allow-warnings是允许warn出现。

② 此处可以根据提示信息修改podspec文件配置,由于情况比较多,此处就不一一给大家介绍了,错误大多数出现在分组形式的依赖关系错误,所以在xcode工程里引用头文件尤其注意,组与组之间切记不可相互引用,否则在验证podspec文件时报错。

③ 如果不是分组情况,应该没什么问题,无非是引入文件夹时,文件夹没有响应的文件。

注意:建议大家在每次修改完.podspec文件之后执行上面命令,这样有利于Code Review,什么是Code Review?

(4)验证成功之后,提交code到git仓库中,打上tag版本号并上传。

$ git tag -a 0.0.1 -m "update tag is v0.0.1"

$ git push origin 0.0.1

如果上传成功,则出现如图2-2-4所示

image

注意:先提交再打tag

(5)通过trunk推送podspec文件

$ pod trunk push YXLaunchAD.podspec

这个过程比较耗时,休息一下,喝口茶...

image

如果出现上图所示信息,那么,恭喜你,你完成了一个CocoaPods私有库的提交,别人可以在Podfile里面使用这个私有库了。


附录


一、为了减少静态库的体积,我们只发布支持真机的SDK,在验证.podspec文件出现了error,解决方式如下:

  1. 设置VALID_ARCHS

在 podspec 文件中添加 s.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => '' },如果项目已经设置 pod_target_xcconfig,添加到已有值的后面

  1. 验证时跳过验证

pod repo lint XXX.podspec --skip-import-validation

  1. 发布更新跳过验证

pod repo push XXX.podspec --skip-import-validation

  1. 发布跳过验证

pod trunk push XXX.podspec --skip-import-validation

如果有提示下面这种情况,代表身份过期需要验证
[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.
解决办法:
在终端执行命令:
pod trunk register '你的邮箱' '你的名称' --description='iMac'
然后会在你的邮箱收到一条链接,点击它,此时可以回到终端验证身份:
pod trunk me
如果打印你的信息了,证明验证完成!


一些相关指令

添加其他人员写作开发
pod trunk add-owner PODNAME OWNER-EMAIL(注册Trunk的邮箱)
删除一个所有者(开发维护人员)
pod trunk remove-owner PODNAME OWNER-EMAIL
查看pod Trunk 信息
pod trunk info PODNAME
关于自己
pod trunk me
删除Pod库
pod trunk delete PODNAME VERSION

二、更新pod库

  1. 首先修改podspec文件的s.version值,然后提交代码和改动的.podspec

  2. 最后再执行上面的(3)(4)(5)步骤即可


3. 搜索私有库

$ pod search YXLaunchAD

搜索过程比较耗时,耐心等待...坚持就是胜利。

如果搜索成功,会出现如图2-3-1所示

image

如果搜索失败,请移步 pod search 搜索类库失败的解决办法

[!] Unable to find a pod with name, author, summary, or description matching YXLaunchAD

三. 导入到测试Demo中

(1)在测试Demo的PodFile文件引用YXLaunchAD

$ pod 'YXLaunchAD', :git => 'https://github.com/xiaofu666/YQAdvertisement_SDK'

保存,执行 pod install 之后,如图3-1-1

image

pod会把私有库所依赖的其他三方库也一并下载下来。另外,在写文件名、Category方法名、利用typedef修饰的属性名的时候,尽量加上前缀,避免不必要的错误。

附:文章中所出现的技术链接整理

  1. 什么是Code Review

  2. pod search 搜索类库失败的解决办法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容