自定义.framework如何上传cocoaPod

背景 一开始是打算创建私有库的,但公司git需要内网VPN访问,git上的私有库又要钱,所以就拿了个公有库做测试(私有库的搭建大同小异),测试的主题是自定义SDK文件并上传cocoaPods,也在网上搜索了很多参考资料,不过感觉都是在对同一份博客的不断copy,也不清楚他们自身有没有尝试过,不过我尝试是没成功的,多方碰壁之后自己整理了下思路,至少在第三方库提交上,希望给其他人一些帮助,流程是参照的这份博客:cocoaPods创建公开公共库,内容有针对自己的情况做了特殊处理,尤其SDK中涉及不少用c语言写的代码,废话不多说了,进入正题。
正题 1、首先电脑安装cocoaPods,并有git账号
2、打开终端,cd <文件目录地址>(任意文件夹地址,可以是桌面),进入指定文件夹,本文测试文件夹名XRGcSDKPods

cd /Users/xry/Desktop/XRGcSDKPods
3、在你进入的目录下从cocoaPod官方下载一个模版,我这边是从无到有建的demo,有现成工程的情况没测试,后续文章会更新。
pod lib create XRGcSDKPods
4、紧接着会提示输入一些信息:
What is your email? //这是输入你开源中国申请的git邮箱账号 What platform do you want to use?? [ iOS / macOS ] // 这里输入你使用的平台 > iOSWhat language do you want to use?? [ Swift / ObjC ] //这里输入你使用的语言 > ObjCWould you like to include a demo application with your library? [ Yes / No ] //这里输入你是否需要生成一个 demo 应用 //这里最好 Yes 这样你可以查看你创建的库是否可以使用 > NOWhich testing frameworks will you use? [ Specta / Kiwi / None ] // 这里输入你需要用到的测试框架,随意选 > NoneWould you like to do view based testing? [ Yes / No ] //是否做基于视图的测试 Yes/No 都可以 > NoWhat is your class prefix? //输入前缀 > XR

【自定义.framework如何上传cocoaPod】回车之后会在我们cd的目录下帮我们创建好一个xcode模版,以下是我生成的项目文件夹层级结构:
自定义.framework如何上传cocoaPod
文章图片
桌面文件夹模版层级结构 5、在 Example 文件下会有一个 供我们测试使用的 demo 打开 .xcworkspace文件(如果我们的 cocoapods 安装的有问题那么不会生成这个文件,但是会有一个Podfile文件,我们在终端中输入命令行:cd Example 的文件目录 ,再次输入命令行:pod install, 之后会帮我们生成一个 .xcworkspace文件,这里需要关闭原来打开的 demo 文件入后使用 工程名.xcworkspace 打开)

自定义.framework如何上传cocoaPod
文章图片
项目模版结构
6、 配置信息,在 demo 工程中有一个 Podspec Metadata 文件夹,查看里面的白文件: 工程名. podspec 配置里面的信息,这个根据具体情况自行配置,也是这篇文章与原文件不同的地方之一,先贴出一张配置信息截图,下文有字段说明:
自定义.framework如何上传cocoaPod
文章图片
配置信息截图
下面提到的字段不是一定要都用到的,大部分基本都用不到,这里做说明也是因人而异,用适合自己工程的
  • s.name = 'XRGcSDKPods' #这里是工程的名字
  • s.version = '0.1.0' #这里是公共库的版本号
  • s.summary = 'A short description of MyTestSecondLibrary.' #这里对你写的库进行简要的概述一下
  • s.description = <<-DESC
    TODO: Add long description of the pod here.
    DESC#这里对你写的库进行具体的使用方法说明及其他描述
  • s.homepage = 'https://github.com/yuanxunrui/XRGcSDKPods'# 你git库的地址首页,可以在开元中国创建你的库,不需要使用什么初始化方法,不要勾选 readme
    自定义.framework如何上传cocoaPod
    文章图片
    homepage
  • s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' # 屏幕快照的地址,例如演示的 gif 文件
  • s.license = { :type => 'MIT', :file => 'LICENSE' }#许可证,type-类型file-文件,这里不需要改变,使用默认,文件指向的文件名与工程中文件名要一致。
  • s.author = { 'yuanxunrui' => 'xxxx.com' }#作者信息:账户名,账户邮箱地址
  • s.source = { :git => 'https://github.com/yuanxunrui/XRGcSDKPods.git', :tag => s.version.to_s }# 这里输入邮箱如果你在开元中国申请的 git 账号,那么把你在开元中国创建的项目的 https 网址输入到这里,
  • s.social_media_url= 'https://twitter.com/' #
  • s.ios.deployment_target = '9.0' #iOS 支持的最低级别,这里最低9.0
  • s.source_files = 'XRGcSDKPods/Classes/**/*'#你库文件存放的目录位置,这里通过文件 项目名.xcodeworkspace 打开 xcode,如今打了 pods -> Development Pods -> 工程名 -> 工程名 -> Classes 在 Classes 这个文件夹下我们存放我们创建的类文件(.h,.m文件)
  • s.vendored_frameworks = 'XRGcSDKPods/Classes/*.framework'#静态库文件的依赖,意思是执行到Classes文件夹下检索.framework类型的文件,该demo上传的是一个SDK静态库文件,所以此处需要加上这个字段说明,否则编译不通过,如果你上传的pod中有静态库文件的话,你得用上此字段做标注
  • s.libraries = "c++" # 该pod依赖的系统资源文件,demo中涉及到c语言代码,所以此处需引入c++系统资源库
  • s.frameworks = 'UIKit', 'Foundation' #这里输入需要用到的依赖库,如果没有特别的需要可以不用输入直接注释掉
    -s.public_header_files = 'Pod/Classes/**/*.h'#头文件目录
  • s.dependency 'AFNetworking', '~> 2.3'# 如果你的公共库需要依赖其他库,那么打开这里的注释,例如AFNetworking,如果有多个,则依次往后排
  • s.resource_bundles = { # 这里存放的 bundle 文件,例如:
    'bundle名称' => ['bundle名称/Assets/*.png'] # 这里放的 png 图片的资源文件,如果还想使用 storyboard,xib,imageset 文件的话,可以如下面的方法写>'bundle名称' => ['bundle名称/Assets/*.{png,xib,storyboard,imageset}'], 【注意】 如果我们使用 xib , storyboard , 图片等资源的时候文件必须强制性放到 Assets 文件夹下,这个文件夹在初始化的时候,并没有显示在工程中,不过可以通过 show in Finder classes 文件查看,发现里面有一个同级别的文件夹 Assets , 我们把我们创建的资源文件拖入到这个文件夹下,然后重新在终端中输入命令行: cd .../Example,然后pod install 再次查看会发现 Assets 文件夹与 classes 同时存在 }
  • s.user_target_xcconfig = {'OTHER_LDFLAGS' => ['-lObjC','-all_load']}#build setting的配置
  • s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } #设置不支持bitcode
  • s.user_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } #设置不支持bitcode
路径描述中的*&**说明
  • *匹配所有文件
  • c*匹配所有以c开头的文件
  • *c匹配所有以c结尾的文件
  • *c*匹配所有包含c的文件
  • **递归匹配所有子文件夹
7、 在git上创建我们的远程库,输入项目名称,项目描述,选择开发语言,我们做的是公开库,这里选择公开, 我们不要初始化这个工程,因为我们的工程是从本地上传上去,所以三个初始化方式都不要勾选,然后点击创建,完成我们远程库的创建

自定义.framework如何上传cocoaPod
文章图片
git上创建公有库
8、 然后获取我们远程项目库的 https 地址,在第6步配置 s.name、s.source、s.homepage, 这里输入我们在开元中国创建的远程库的 https 网址
9、在终端中输入命令行,先关联本地仓库和远程仓库
cd “你工程文件夹名(Example 的上层)”
git add .
git commit -m "自定义提交信息"
git remote add origin "你工程远程仓库的地址,也就是你在git上创建的项目仓库地址"
10、校验我们第六步的配置信息
这里有两个指令,一个是本地校验(lib),一个是远程校验(spec),当出现passed validation.时表示校验通过,此处先进行本地校验,看看本地配置是否有问题,在提交远程的时候需要进行远程校验
本地校验
$ pod lib lint --allow-warnings

自定义.framework如何上传cocoaPod
文章图片
本地校验截图
11、添加信任
在pod上注册你的git账号,两种方案(一繁一简),终端命令:
  • pod trunk register git账号(邮箱) '名称' --description='描述内容随意写'
  • pod trunk register git账号(邮箱) 简化版
说明
  • 1、 git账号邮箱,是你在开源中国申请的 git 账号
  • 2、'名称',可以是你的账号昵称,也可以是你的真是名称,也可以不写
  • 3、 descrition=''这里可以随意填写也可以不写
如果出现
Please verify the session by clicking the link in the verification email that has been sent to ‘你的邮箱’
去你自己的邮箱拷贝发送的网络连接并打开,出现You can go back to your terminal now.说明验证成功,以后你这台设备,以及这个账号就不要再次验证了,如果你有多个账号,这个方法也是在告诉你的 git 推送你的库到哪个账号上去
命令:pod trunk me可在终端查看验证是否通过
12、提交项目到远程库
在提交之前最好先进行远程校验pod spec lint,直到出现passed validation.
这个过程可能会重现这样那样的问题,会在后面常见问题中描述
13、推送版本号
这里必须先推送项目,之后推送版本号,顺序不能错
  • git tag "0.1.0" 这个版本要要与你podspec文件中定义的版本号一致
  • git push --tags推送版本号
    这样就能在远程看到我们的版本号了
    自定义.framework如何上传cocoaPod
    文章图片
    版本号
14、所有配置完成后
把我们创建好的工程推送到 git
pod trunk push 工程名.podspec --allow-warnings
  • --allow-warnings 可以不加,加了最好,如果你的配置文件有警告,那么无法推送成功
这时候需要等一会,有时候快,有时候慢,碰运气了
自定义.framework如何上传cocoaPod
文章图片
成功日志 15、测试公有库
先配置工程profile pod 'XRGcSDKPods'
之后cd 进入你主工程目录并执行pod install,就能看到自己创建的pod了

自定义.framework如何上传cocoaPod
文章图片
效果图
常见问题分析 一、执行pod spec lint远程校验的时候 大部分的问题应该都集中在执行pod spec lint(远程校验)的时候
1、找不到远程仓库branch版本号
-> XRGcSDKPods (0.1.0)
ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://github.com/yuanxunrui/XRGcSDKPods.git /var/folders/zd/4drz4mnn03l2wsc9r5pq4qrr0000gn/T/d20190118-90632-1j64qjr --template= --single-branch --depth 1 --branch 0.1.0
Cloning into '/var/folders/zd/4drz4mnn03l2wsc9r5pq4qrr0000gn/T/d20190118-90632-1j64qjr'...
warning: Could not find remote branch 0.1.0 to clone.
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.

自定义.framework如何上传cocoaPod
文章图片
问题1截图
这种情况下就需要我们先将本地工程同步到远程git仓库,在同步之前先git pull以下,否则可能会因文件冲突报错,下文对此情况也有说明
2、ERROR | [iOS] file patterns: The source_files pattern did not match any file.
pod repo lint 时报错
这种情况一般是source_files路径问题,路径一般从有.podspec的那层开始
3、ERROR | unknown: Encountered an unknown error
造成这种错误的情况有很多,我这整理的也不全,大家也可以给我指点下,
  • 是否是远程仓库版本号获取不到或者与spec文件中版本号不一致
  • 当前设备系统版本号低于配置文件中最低target版本号要求
  • 配置文件中存在未声明关键字段,比如homepage、name等
4、WARN | url: The URL (https://git.xxx/xxx/xxx) is not reachable.
这种情况一般是仓库地址有问题
5、error: Invalid bitcode signature
error: Invalid bitcode signature clang: error: linker command failed with exit code 1 (use -v to see invocation)

乍一看是bitcode的问题,但到buildsetting 中将bitcode 关掉后还是不可以。
这就要考虑是不是工程中其他文件的事了,demo工程中是包含了.framework文件,去看了下文件原工程,bitcode确实是YES,设置为NO重新生成一个再提交就OK了
二、本地仓库上传git远程仓库的时候 都知道在提交代码之前先pull拉取以下,尤其是远程仓库非空的情况下,拿现在的这个例子说,虽然git端新建的是一个空的仓库,但也默认生成了一个.gitignore文件,这就更需要在push之前先pull

自定义.framework如何上传cocoaPod
文章图片
仓库默认生成的文件
1、Updates were rejected because the tip of your current branch is behind
执行 git push时报错,看错误是因为标记的branch版本号落后
自定义.framework如何上传cocoaPod
文章图片
push失败1 这个理论上执行一次git pull就能解决了,但此处执行git pull后再执行依旧如此,所以此处尝试了git提供的两个方案之一git pull ,此处我没加版本号,因为现在远程仓库还没有tag
执行git pull https://github.com/yuanxunrui/XRGcSDKPods.git
发现出现了新的错误fatal: refusing to merge unrelated histories,见-问题2
2、fatal: refusing to merge unrelated histories
方案一:
在确定远程仓库没有可用代码的情况下可以直接忽略
git pull origin master --allow-unrelated-histories
方案二:
如果有有效文件冲突并解决的,一定要在合并后先执行add . 、commit方法,然后再push
3、[!] There was an error pushing a new version to trunk: getaddrinfo: nodename nor servname provided, or not known
这里错误的原因是你没有执行提交版本号的方法,直接推送到 git
4、[!] Unable to accept duplicate entry for: 工程名 (0.1.0)
需要我们更改版本号,例如更改 xxx.podspec 白文件中的版本号 0.1.1,然后终端中重新提交版本信息也就是第13步的操作,最后执行第14步操作
三、其他 1、如何删除已提交的cocoaPod框架
pod trunk delete AFNetwroing '版本号'
2、用 pod search搜索时报错
创建完后用pod search搜索搜索不到
Unable to find a pod with name, author, summary, or description matching '你定义的库'
这种情况一般是本地索引出了问题,可以通过重新创建索引解决(删除本地索引,再次搜索时会自动重新创建)
rm ~/Library/Caches/CocoaPods/search_index.json
3、使用 pod install 找不到自己的库
如果使用 pod install 无法找到你发布的公共库,那么使用 pod update 尝试,pod update 的作用是更新本地库

    推荐阅读