XCFramework从0到发布到Cocoapod

XCFramework 从0到发布

  • 苹果官方解释
An XCFramework makes it possible to bundle a binary framework or library for multiple
platforms —including iOS devices, iOS simulators, and Mac Catalyst — into a single distributable
.xcframework bundle that your developers can use within their own applications. An
.xcframework bundle can be added to an Xcode target’s Link Libraries phase and Xcode uses the
right platform’s version of the included framework or library at build time. Creation of
frameworks is supported from the command line using xcodebuild -create-xcframework.
Frameworks or libraries bundled in an XCFramework should be built with the Build Libraries for
Distribution build setting set to YES

流程

1.创建Framework工程,编写测试代码
2.Framework工程配置
3.Framework打包
4.本地化测试
5.Git仓库配置
6.本地Pod仓库配置
7.发布到CocoaPod

创建工程

1.选择Framework


2.起名😁


3.配置iOS Deployment Target ,此处我设置为 13.0

WechatIMG113.jpeg

4.编写测试代码,测试代码我们会使用Cocoapods引入 Alamofire 三方库的依赖,更加贴合实际的开发。

OK,至此我们名为 YYNetStatusTest 的SDK就建立好了。

项目配置

1.配置 Buid Libraries for Distribution = YES

  • YYNetStatusTest
  • 用到的所有第三方SDK也需要配置,此处我们用到的是Alamofire

2.配置 Buid Configuration = release ,下方的shared确保已经勾选

Framework 打包

1.终端进入到工程根目录下,创建文件夹archives
2.执行以下代码打真机包(ABC为你的工程名称),因为本工程是用到了Cocoapod,因此需要加上 -workspace ABC.xcworkspace 否则会找不到用到的三方库Alamofire

xcodebuild archive \
  -workspace ABC.xcworkspace \
  -scheme ABC \
  -sdk iphoneos \
  -archivePath "./archives/ios_devices.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO

3.执行以下代码打包模拟器包

xcodebuild archive \
  -workspace ABC.xcworkspace \
  -scheme ABC \
  -sdk iphonesimulator \
  -archivePath "./archives/ios_simulators.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO

4.执行以下代码合并刚刚打好的两个包

xcodebuild -create-xcframework \
-framework ./archives/ios_devices.xcarchive/Products/Library/Frameworks/ABC.framework \
-framework ./archives/ios_simulators.xcarchive/Products/Library/Frameworks/ABC.framework \
-output archives/ABC.xcframework

5.最终得到的ABC.xcframework即为我们需要的包(此处亦可以将上面的代码放到一个脚本文件中,方便后续更新使用)

本地化测试

1.新建测试工程,名字随意
2.将打包好的ABC.framework拖入新建好的工程中
3.command + B 编译,此时会报错。是因为我们的xcframework 用到了三方库 Alamofire ,此时需要我们使用 Cocoapod 进行三方库的安装

4.安装成功后,测试模拟器和真机,编译通过,然后运行测试工程。不出意外的出意外了,如下图所示。Symbol not found ...

5.(4)中的解决方法就是,将我们测试工程中安装的Alamofire也要将 Build Libraries for Distribution 选项设置为 YES

6.再次运行,发现控制台已经可以正常打印我们封装的xcframework中打印的内容。至此,本地化测试已经完成

接下来我们将演示如何将我们封装好的库Push到远程的Cocoapod库,供其他人使用

Git 仓库配置

1.进入到Github,新建一个git仓库,配置仓库名称为我们的framework名称,仓库的权限根据自己需要设置为公开或者私有。


2.其他配置,此处需要选择license,我选择的 MIT。进行此处配置的原因不再赘述,详细信息可自行搜索。

3.点击创建仓库,完成。

本地Pod仓库配置

1.将上一步创建好的Git仓库克隆到本地,因为我们的git仓库和xcframework名称一致,所以可以选择新建一个文件夹保存我们的仓库
2.将之前打包好的xcframework(打包在archives文件夹下面的包),拖入到新克隆下来的工程根目录下

3.终端进入xcframework同级目录下,创建pod工程配置文件。

pod spec create XXX

4.创建成功之后,xcframework同级目录会生成一个xxx.podsepc的文件
5.打开创建好的xxx.podsepc文件,会发现里面东西一大堆,都是用来配置仓库信息的(好在有注释,可以看懂)本文中只对用到的信息进行配置及解释,其他的详细信息请自行搜索,可以直接拷贝本文中的配置到你创建的 xxx.podsepc中进行修改。

Pod::Spec.new do |s|

# 仓库名称
  s.name         = "YYNetStatusTest"
# 仓库版本
  s.version      = "1.0.0"
# 描述
  s.summary      = "test"
# 描述
  s.description  = <<-DESC
           test desc
                   DESC
# 仓库主页
  s.homepage     = "https://github.com/ChuanqingYang/YYNetStatusTest"
# 证书信息,创建仓库时选择的
  s.license      = { :type => "MIT", :file => "LICENSE" }
# 作者信息
  s.author           = { "ChuanqingYang" => "15318119557@163.com" } 
# 开发平台,当时我们设置的是13.0
  s.ios.deployment_target = '13.0'
# 我们用到的swift版本
  s.swift_version = '5.0'
# git仓库地址
  s.source        = { :git => 'https://github.com/ChuanqingYang/YYNetStatusTest.git', :tag => s.version }
# 封装的framework名称
  s.ios.vendored_frameworks = 'YYNetStatusTest.xcframework'
# 封装的framework依赖的第三方库
  s.dependency 'Alamofire'
# 如果还有其他的依赖,依次添加即可
# s.dependency 'ObjectMapper'

# 工程配置
  s.user_target_xcconfig = { 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES' }
  s.pod_target_xcconfig = { 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES' }

end

6.xxx.podsepc 文件配置完成之后,接下来我们要进行pod仓库配置的验证,验证成功后会出现提示

 pod lib lint --allow-warnings --verbose

7.接下来我们便可以将我们的代码push到仓库啦

git add .
git commit -a -m "test"
git push

8.push 成功之后需要对我们的仓库进行git tag的push,此处的tag需要和我们在xxx.podspec文件中设置的version保持一致

git tag "1.0.0"
git push --tags

9.接下来就可以执行以下命令将我们的pod仓库push到远程啦,若是第一次进行此项目的创建,会让你进行trunk的注册,注册成功之后再次执行push命令

  • trunk注册
pod trunk register 邮箱 用户名

创建成功之后可以使用 pod trunk me查看信息

  • push,注意要在我们的xcframework文件目录下执行此命令
pod trunk push *.podspec --allow-warnings

耐心等待一下....
此时会对我们配置的xxx.podspec文件进行验证,若出现问题可以直接根据提示的错误信息进行更正。
出现下面的提示后即表示我们已经push成功了!
如果你的网络不是特别稳定的话可能会出现 time out 超时的情况,多试几次即可。

10.接下来进行线上的验证,新建一个工程验证,在Podfile中引入我们上传的pod库,执行安装命令后可能会出现找不到我们仓库的错误提示(推测应该是还没有完全同步完成),不过我们可以通过指定git仓库地址的方式进行安装

pod 'YYNetStatusTest', :git => 'https://github.com/ChuanqingYang/YYNetStatusTest.git'

执行 pod install

发现 Alamofire 也已经自动添加到我们的项目中

11.运行项目,若出现了和本地测试中一样的问题,直接去做修改即可

Finally

笔记时间:2022年08月22日,本文书写时,笔者从头至尾重新做了一遍,相信只要按照笔者的流程和代码进行书写,一定是可以成功的~

文章中若有不妥的地方,还忘留言指出~

Happy Coding~

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

推荐阅读更多精彩内容