背景:
由于近期换新公司,新公司计划将SDK集成到cocoapod上,便于提供给厂商一键集成。之前的公司也搞过,但都搞一半就没有详细内容和多人管理。
cocoapod库制作流程:
一、在GitHub上或者Gitlab上创建项目:
每个人不同的管理代码工具,但GitHub和Gitlab是相似的,需要先在上面创建对应的项目,然后把framework给上传上去(有些人选择源码制作cocoapod,一样的操作步骤,只是后续的spec文件编写内容有偏差),我这里采用的是制作成framework库然后上传到项目管理网站上,并在本地拉取,方便后续编写。
下面就是我制作pod库的本地文件截图:
每一个模块都制作成了一个pod库,下面围绕着facebook的管理器sdk来进行说明 :
二、开始制作spec文件并进行编辑:
截图中的FacebookSdkManager.podspec文件是通过终端生成的
cd到对应的文件夹,然后执行如下命令就可以生成(不需要带podspec尾缀)
pod spec create FacebookSdkManager
然后找到文件,右键可以通过文本编辑打开
#
Pod::Spec.new do |spec|
spec.name = "FacebookSdkManager" #库名字
spec.version = "1.0.0" #库版本号,这个要和GitHub、Gitlab上打的tag一致,后面再说
spec.summary = "FacebookSdkManager." #类似简介
spec.description = <<-DESC #类似描述
高图海外手游SDK-FacebookSdkManager
DESC
spec.homepage = "https://cocoapods.goatgames.com/plugin/facebook" #库的网址,在pod集成时可以显示给用户,在GitHub上克隆复制https过来就行,去掉.git
#spec.license = "MIT (example)"
# spec.license = { :type => "MIT", :file => "FILE_LICENSE" } #监听,这个是在创建项目的时候配置的(GitHub和Gitlab上新建),如果没有配置可以注释掉
spec.author = { "goat" => "15839918562@163.com" } #作者,大括号类似一组,也可以把大括号去掉,但是就不能在后面添加邮箱之类的,例如 = ”goat“
spec.source = { :git => "https://cocoapods.goatgames.com/plugin/facebook.git", :tag => spec.version.to_s } #可以理解为git地址,后面tag就是GitHub上打的tag,这里默认上面的version,因为我们把它们保持一致
spec.ios.deployment_target = '9.0' #iOS支持版本,可以设置通用支持版本,Mac 、watch等支持版本,在创建spec文件里面有
spec.static_framework = true #这里是静态库还是动态库
spec.requires_arc = true #是否支持arc
spec.pod_target_xcconfig = {'OTHER_LDFLAGS' => ['-lObjC']} #设置other link flags -ObjC
spec.pod_target_xcconfig = {'ENABLE_BITCODE' => 'NO'} #设置bitcode = no ,这些配置可以写在一个大括号呢,也可以单独写出来,其他的可以自行百度
#spec.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
spec.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 armv7s arm64' } # 支持的框架类型,真机、模拟器
spec.vendored_frameworks = 'FacebookSdkManager/FacebookSdkManager.framework' # 这个就是库文件,这样写,因为是在GitHub上管理,从项目目录开始读取的
spec.resource = 'FacebookSdkManager/Facebook_Version.json' #支持额外文件 ,bundle图片啥的都可以添加
#下面就是FacebookSdkManager库的依赖pod库
spec.dependency 'FBSDKShareKit','~>9.0.0'
spec.dependency 'FBSDKLoginKit','~>9.0.0'
spec.dependency 'FBSDKCoreKit','~>9.0.0'
#下面就是依赖的系统库 ,使用的时候把#号去掉就可生效
#spec.frameworks = 'SystemConfiguration', 'CoreGraphics','Foundation','UIKit'
#spec.libraries = 'c++', 'z', 'sqlite3', 'xml2', 'resolv'
#我们还可以添加subspec,可以理解为子库,在集成的时候可以这样引用出来 pod 'FacebookSdkManager/xxx.framework',就类似于把它们写在同一个spec文件,可以相互依赖,也可以相互独立,可以理解为就类似我截图的文件多个pod库给放到一起。也可以按照我那样去分开,方便独立管理,如下,如果说上面的FacebookSdkManager 依赖于AnyThinkSDK,就可以在上面把AnyThinkSDK当成一个pod库
#spec.subspec 'AnyThinkSDK' do |ss|
#ss.ios.deployment_target = '9.0'
#ss.vendored_frameworks = 'AnyThinkiOS/AnyThink{Banner,Splash,SDK,RewardedVideo,Interstitial,Native}.framework'
#ss.resource = 'AnyThinkiOS/AnyThinkSDK.bundle'
#end
end
编辑过后我们来验证一下,通过以下命令行(如果当前目录不是库文件目录的话,需把文件拖进终端):
#这个是验证本地静态
pod lib lint FacebookSdkManager.podspec
#这个可以理解为联网验证,我个人理解,我基本只用上面的,验证通过了,就进行下一步了
pod spec lint FacebookSdkManager.podspec
验证的时候,如下图会有警告,note ,错误等,如果没错误就算验证通过,可以进行下一步:
如果有错误,看ERROR后面内容,如果不懂,可以再次进行验证,验证命令后面加一个详细日志
pod lib lint --verbose
#这里在项目目录下的时候 lint后面可以省略podspec文件名
然后等待加载验证结果,验证就类似演示一遍一样,如果有某个库,或者配置错误,会在日志里面显示,建议从最下面慢慢往上找。反正就是spec里面有某个东西错误
四、开始提交
1、提交前,我们要把项目给提交到GitHub/Gitlab上,并给这次提交打一个tag标签。
这个标签对应的就是你要提交到pod上的版本,这里就不做说明了,如果不制作tag,在下面的提交spec到cocoapod会报错,提示说没有对应的版本tag
2、提交spec文件到 cocoapod上
如果是第一次提交,那么需要注册你的邮箱到cocoapod上,意思就是你这个邮箱账户管理这些pod库。以后的提交可以忽略注册邮箱步骤(前提是在你自己的电脑上操作,且当前邮箱不变)
pod trunk register 邮箱 '昵称' --description=' 这里写描述'
然后会在邮箱里收到有点,点击里面的网址同意,然后就可以使用提交spec了
pod trunk push FacebookSdkManager.podspec
如果提交的时候提示warn导致的提交不成功,可以在命令行后面添加允许warn的字段:
pod trunk push FacebookSdkManager.podspec --allow-warnings
#注释:在你pod lib lint 的时候也可以加上 --allow-warnings去除警告,后面再push的时候就不用加了
提交后等待结果,如果有重复的库、重复版本、操作者没权限、或者其他错误,会在终端显示,根据意思自行解决。
如果没错误,就会显示下面成功的提示,就是祝贺你的库,版本,提交日期,地址等等:
在此,你的pod库就制作好了,如果要更新版本,就要编辑spec文件进行上面步骤,打tag,验证,提交,通过后就有多个版本可以集成了。
五、查询库并集成到demo中测试
此时你去查询 pod search xxx ,会找不到,这个说是因为你设备上的pod没更新,先进行update。这个问题不确定是否是这样解释,我现在就是这样干,还没验证在其他设备上会不会search不到,如果其他人也查不到,感觉可能是少了哪个步骤,再说了
pod repo update
#然后可以查一下你的库
pod search xxx
#如果还是查不到,那么需要删除本地生成的旧search.json文件
rm ~/Library/Caches/CocoaPods/search_index.json
#然后再去查,还查不到的话,再update,多次试验就可以了
查询到之后,就可以创建一个demo集成一下试试了。
六、关于pod命令和多人管理
有一些疑问,如何管理自己的pod库,多人在不同的设备上提交呢?
就需要一些pod命令来完成了:
先对邮箱进行管理:
#下面是一些pod命令
#查看自己的账号信息,以及账号拥有的仓库。
pod trunk me
#查询xxx库的版本,以及归属,所有权等
pod trunk info xxx
#让某个库过期,使用者会被警告,一般不建议使用
pod trunk deprecate xxx
#删除某个库,或某个库的某个版本
pod trunk delete xxx
-------------------------------
#注册/登陆pod账户,在某个设备上第一次使用时,或者切换账号时
pod trunk register 邮箱 名字
#对某个库添加管理者
pod trunk add-owner 库名 邮箱
#对某个库删除管理者
pod trunk remove-owner 库名 邮箱
-------------------------------
#我们一般多人管理的时候就可以先注册一个邮箱管理者,然后制作完pod库,可以对这个库添加其他管理邮箱,在同事上传pod库的时候就可以去使用他们被添加的邮箱了(我还没这样做,还在制作pod库中)
总结:到这里就差不多了,对自己的库进行pod集成吧,如果遇到问题或error,可以去查询一下,或者仔细看终端报错内容。再有其他细节后续慢慢补充了。