自定义.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 ]
// 这里输入你使用的平台
 > iOS

What language do you want to use?? [ Swift / ObjC ]
//这里输入你使用的语言
 > ObjC

Would you like to include a demo application with your library? [ Yes / No ]
//这里输入你是否需要生成一个 demo 应用
//这里最好 Yes 这样你可以查看你创建的库是否可以使用
 > NO

Which testing frameworks will you use? [ Specta / Kiwi / None ]
// 这里输入你需要用到的测试框架,随意选
 > None

Would you like to do view based testing? [ Yes / No ]
//是否做基于视图的测试 Yes/No 都可以
 > No

What is your class prefix?
//输入前缀
 > XR

回车之后会在我们cd的目录下帮我们创建好一个xcode模版,以下是我生成的项目文件夹层级结构:

桌面文件夹模版层级结构

5、在 Example 文件下会有一个 供我们测试使用的 demo 打开 .xcworkspace文件(如果我们的 cocoapods 安装的有问题那么不会生成这个文件,但是会有一个Podfile文件,我们在终端中输入命令行:cd Example 的文件目录 ,再次输入命令行:pod install, 之后会帮我们生成一个 .xcworkspace文件,这里需要关闭原来打开的 demo 文件入后使用 工程名.xcworkspace 打开)

项目模版结构

6、 配置信息,在 demo 工程中有一个 Podspec Metadata 文件夹,查看里面的白文件: 工程名. podspec 配置里面的信息,这个根据具体情况自行配置,也是这篇文章与原文件不同的地方之一,先贴出一张配置信息截图,下文有字段说明:
配置信息截图

下面提到的字段不是一定要都用到的,大部分基本都用不到,这里做说明也是因人而异,用适合自己工程的

  • 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
    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/<TWITTER_USERNAME>' #
  • 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上创建我们的远程库,输入项目名称,项目描述,选择开发语言,我们做的是公开库,这里选择公开, 我们不要初始化这个工程,因为我们的工程是从本地上传上去,所以三个初始化方式都不要勾选,然后点击创建,完成我们远程库的创建


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

本地校验截图

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推送版本号
    这样就能在远程看到我们的版本号了
    版本号

14、所有配置完成后

把我们创建好的工程推送到 git

pod trunk push 工程名.podspec --allow-warnings

  • --allow-warnings 可以不加,加了最好,如果你的配置文件有警告,那么无法推送成功

这时候需要等一会,有时候快,有时候慢,碰运气了

成功日志

15、测试公有库
先配置工程profile pod 'XRGcSDKPods'
之后cd 进入你主工程目录并执行pod install,就能看到自己创建的pod了

效果图


常见问题分析

一、执行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.

问题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

仓库默认生成的文件

1、Updates were rejected because the tip of your current branch is behind

执行 git push时报错,看错误是因为标记的branch版本号落后

push失败1

这个理论上执行一次git pull就能解决了,但此处执行git pull后再执行依旧如此,所以此处尝试了git提供的两个方案之一git pull <remote> <branch>,此处我没加版本号,因为现在远程仓库还没有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 的作用是更新本地库

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

推荐阅读更多精彩内容