自定义.framework如何上传cocoaPod
背景
一开始是打算创建私有库的,但公司git需要内网VPN访问,git上的私有库又要钱,所以就拿了个公有库做测试(私有库的搭建大同小异),测试的主题是自定义SDK文件并上传cocoaPods,也在网上搜索了很多参考资料,不过感觉都是在对同一份博客的不断copy,也不清楚他们自身有没有尝试过,不过我尝试是没成功的,多方碰壁之后自己整理了下思路,至少在第三方库提交上,希望给其他人一些帮助,流程是参照的这份博客:cocoaPods创建公开公共库,内容有针对自己的情况做了特殊处理,尤其SDK中涉及不少用c语言
写的代码,废话不多说了,进入正题。
正题
1、首先电脑安装cocoaPods,并有git账号
2、打开终端,cd <文件目录地址>
(任意文件夹地址,可以是桌面),进入指定文件夹,本文测试文件夹名XRGcSDKPods
cd /Users/xry/Desktop/XRGcSDKPods3、在你进入的目录下从cocoaPod官方下载一个模版,我这边是从无到有建的demo,有现成工程的情况没测试,后续文章会更新。
pod lib create XRGcSDKPods4、紧接着会提示输入一些信息:
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模版,以下是我生成的项目文件夹层级结构:
文章图片
桌面文件夹模版层级结构 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
文章图片
homepages.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.0s.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' }
#设置不支持bitcodes.user_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' }
#设置不支持bitcode
路径描述中的7、 在git上创建我们的远程库,输入项目名称,项目描述,选择开发语言,我们做的是公开库,这里选择公开, 我们不要初始化这个工程,因为我们的工程是从本地上传上去,所以三个初始化方式都不要勾选,然后点击创建,完成我们远程库的创建*
&**
说明
*
匹配所有文件c*
匹配所有以c开头
的文件*c
匹配所有以c结尾
的文件*c*
匹配所有包含c
的文件**
递归匹配所有子文件夹
文章图片
git上创建公有库
8、 然后获取我们远程项目库的 https 地址,在第6步配置 s.name、s.source、s.homepage, 这里输入我们在开元中国创建的远程库的 https 网址
9、在终端中输入命令行,先关联本地仓库和远程仓库
10、校验我们第六步的配置信息cd “你工程文件夹名(Example 的上层)”
git add .
git commit -m "自定义提交信息"
git remote add origin "你工程远程仓库的地址,也就是你在git上创建的项目仓库地址"
这里有两个指令,一个是本地校验(lib),一个是远程校验(spec),当出现
passed validation.
时表示校验通过,此处先进行本地校验,看看本地配置是否有问题,在提交远程的时候需要进行远程校验本地校验
11、添加信任$ pod lib lint --allow-warnings
文章图片
本地校验截图
在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
推送版本号
这样就能在远程看到我们的版本号了
文章图片
版本号
把我们创建好的工程推送到 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)这种情况下就需要我们先将本地工程同步到远程git仓库,在同步之前先
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 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等
这种情况一般是仓库地址有问题
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
,此处我没加版本号,因为现在远程仓库还没有tag执行
git pull https://github.com/yuanxunrui/XRGcSDKPods.git
发现出现了新的错误
fatal: refusing to merge unrelated histories
,见-问题22、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 matching3、使用 pod install 找不到自己的库'你定义的库'
这种情况一般是本地索引出了问题,可以通过重新创建索引解决(删除本地索引,再次搜索时会自动重新创建)
rm ~/Library/Caches/CocoaPods/search_index.json
如果使用 pod install 无法找到你发布的公共库,那么使用 pod update 尝试,pod update 的作用是更新本地库
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- java中如何实现重建二叉树
- Linux下面如何查看tomcat已经使用多少线程