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
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" => "[email protected]" }
# 开发平台,当时我们设置的是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~