16.开发SDK实践
目录介绍
- 01.开发SDK介绍
- 1.1 SDK封装方式
- 1.2 静态和动态库
- 1.3 framework
- 1.4 Aggregate介绍
- 02.创建&配置三方库
- 2.1 创建framework
- 2.2 开发代码实践
- 2.3 配置framework
- 2.4 创建Aggregate
- 2.5 构建SDK输出
- 2.6 SDK中资源文件
- 03.引用第三方库
- 3.1 引用framework
- 3.2 测试framework
- 3.3 边开发边调试SDK
- 3.4 依赖库重复bug
- 04.XCFramework
- 4.1 XCFramework介绍
01.开发SDK介绍
1.1 SDK封装方式
iOS封装SDK是指将iOS应用程序的功能封装成一个库,供其他开发者使用。
SDK可以提供一些接口和方法,使得其他开发者可以在不了解具体实现细节的情况下,直接使用这些功能。
iOS封装SDK的方式主要有以下几种:
- 静态库:静态库是将SDK的代码编译成一个静态库文件,其他开发者可以将其链接到自己的应用程序中使用。静态库的优点是使用方便,缺点是无法动态更新和修改。
- 动态库:动态库是将SDK的代码编译成一个动态库文件,其他开发者可以将其链接到自己的应用程序中使用。动态库的优点是可以动态更新和修改,缺点是使用相对复杂。
- 框架:框架是将SDK的代码打包成一个框架文件,其他开发者可以将其导入到自己的应用程序中使用。框架的优点是使用方便,缺点是无法动态更新和修改。
1.2 静态和动态库
静态库 VS 动态库
- 静态库在编译时将代码拷贝进目标程序中,会导致目标程序的体积增加。被多次使用就会在内存中存在多份冗余拷贝。
- 动态库在App冷启动时需要加载动态链接库,进行rebase指针调整和bind符号绑定等工作,会导致App的启动时间增长。由系统动态加载到内存,供App调用,系统只加载一次,多个程序共用,节省内存。
- iOS中静态库的形式:.a 和 .framework
- iOS中动态库的形式:.dylib 和 .framework
.a VS .framework
- .a是纯二进制文件 .framework中除了二进制文件还有资源文件
- .a文件不能直接使用,需要引入.h文件配合 .framework文件包含了.h文件和其他文,可以直接使用
- .a文件是静态库,.framework 既可以是静态库也可以是动态库
1.3 framework
Framework 实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。
1.4 Aggregate介绍
Aggregate(聚合目标)是 Xcode 中的一个构建工具,用于执行一系列预定义的构建任务。它允许你在构建过程中执行多个脚本或命令,并将它们组合成一个单独的构建阶段。
通过使用 Aggregate 目标,你可以更灵活地自定义和管理构建过程。
使用 Aggregate 目标的步骤如下:
- 在 Xcode 中创建一个新的 Aggregate 目标。
- 在 Build Phases(构建阶段)中,添加你想要执行的脚本或命令。你可以使用 Shell 脚本、Python 脚本、Ruby 脚本等。
- 按照需要调整脚本的执行顺序和参数。
- 在构建过程中,Xcode 将按照你定义的顺序执行这些脚本。
02.创建&配置三方库
2.1 创建framework
创建一个project项目,取名为 WxPalmSdk,选择 Framework & Library 中的 Framework,然后开始配置第三方库的包名,语言选择swift。
2.2 开发代码实践
swift不像OC可以暴露接口,在swift中要想给别的工程调用接口,记得在类,方法或属性前加public或者open。先测试一个小的案例,代码如下所示:
open class PalmHelper {
//获取屏幕分辨率
static func getResolution() -> CGSize {
let screenSize = UIScreen.main.bounds.size
let scale = UIScreen.main.scale
let resolution = CGSize(width: screenSize.width * scale, height: screenSize.height * scale)
return resolution
}
}
生成的工程中有 WxPalmSdk.h 这一个头文件,一般我们将需要暴露的头文件都放在这个头文件中,以供外部调用。
思考:如果sdk中有依赖pod第三方库,又该如何处理呢?
使用CocoaPods管理第三方库,打开SDK根目录 -> pod init,打开Podfile文件,添加SDK用到的第三方库,然后pod install,打开SDK.xcworkspace,开始编码。
注意:此时只是单纯引用第三方库,打包时并不会把第三方库添加到SDK中
Framework中如何添加资源文件?
2.3 配置framework
- 在Build Settings设置中,Targets → General → Minimum Deployments设置为 iOS 11.0/9.0
- 在Build Settings设置中,Build Active Architecture Only 仅构建活动架构,这个要设置为NO,即不是只编译当前架构【必须】
- 在Build Settings设置中,Excluded Architecture 排除架构,如果没有特定架构设置则不用管
- 在Build Settings设置中,Dead Code Stripping 死代码剥离,即编译选项优化,对于framework来说, 应该设置为NO, 避免代码、调试符号等被剥离。
- 在Build Settings设置中,Mach-O Type 类型,设置类型为静态库Static Library【必须】
- 在Build Settings设置中,Build Libraries for Distribution 为分发构建库,设置为Yes,使编译出来的framework向下兼容。
- 在Build Settings设置中,Standard Libraries,设置成 No,避免重复链接
- 在Build Settings设置中,Build Settings → Enable Bitcode 设置为 No
- 在Build Settings设置中,Excluded Architectures → Release,添加 Any iOS Simulator SDK 配置 arm64
- 在Build Settings设置中,Build Libraries for Distribution 设置为Yes (如果是swift语言的时候需要)
- 在菜单Product → Scheme → Edit Scheme → Run → 修改 Build Configuration 编译 为 Release
2.4 创建Aggregate
第一步:创建打包工程 Aggregate。然后在 Build Phases -> Target Dependencies 中添加需要依赖的SDK
第二步:创建 Run script。在 Build Phases -> + -> New Run Script Phase 中添加脚本
第三步:在 Edit Scheme 中,修改在release环境下进行构建
在 Build Phases 选项中,在 Target Dependencies 中添加依赖的target,具体可以参考:添加依赖的target
遇到报错:Command PhaseScriptExecution failed with a nonzero exit code 。解决办法:https://www.jianshu.com/p/5e57b07bedda
2.5 构建SDK输出
第一种方式:运行脚本run
选中要构建的脚本,然后开始点击导航栏中run按钮。
运行报错:
Showing Recent Issues
Sandbox: bash(11244) deny(1) file-read-data /Users/yc/github/WxiOSPalmDa/PalmDaSdk/frameworkAggregate.sh
这个错误信息表明,在尝试读取文件时被沙盒机制拒绝了。沙盒机制限制了应用程序对文件系统的访问,以提高安全性。
User Script Sandboxing是xcode的一种安全机制,通过限制脚本对系统资源的访问,将脚本执行限制在受控的环境中,防止潜在的恶意代码执行和未经授权的资源访问。
2.6 SDK中资源文件
iOS之Bundle的创建有三种方式:
- 第一种方式:自己新建一个文件夹,将文件夹的后缀改成.bundler,然后将此bundle拖入到工程中,然后往工程中的.bundle底下添加素材即可
- 第二种方式:在工程中添加Target,此Target为bundle
- 第三种方式:直接创建一个工程,此工程为bundle
iOS之Bundle的创建与使用:https://www.jianshu.com/p/dd73925b02e7
Swift小知识点之bundle的使用:https://www.cnblogs.com/lxlx1798/articles/14790414.html
03.引用第三方库
3.1 引用framework
第一种:直接引用系统提供的.framework
- 选中项目名称
- 选中TARGETS
- 选中Build Phases
- 在Link Binary With Libraries中添加。
- 点击“+”号,加入所需的系统提供的.framework文件
第二种:引用第三方提供的.framework
- 下载好所需要的第三方提供的.framework
- 将第三方.framework文件拷贝到工程所处的文件夹中
- 一定要注意:在 General —> Frameworks,Libraries,and Embedded Content,选中该第三方framework后,设置为 Embed & Sign
具体可以看:https://www.cnblogs.com/Free-Thinker/p/9524876.html
3.2 测试framework
调用工程中,我们只需在要用到 WxPalmSdk.framework的页面导入头文件即可
3.3 边开发边调试SDK
3.4 依赖库重复bug
04.XCFramework
4.1 XCFramework介绍
XCFramework 是一种用于在 iOS 开发中打包和分发框架的格式。它是苹果在 Xcode 11 中引入的新功能,旨在简化框架的构建和共享。
参考博客
- iOS SDK(framework)开发:https://juejin.cn/post/7380513228046123044
- iOS 创建framework依赖cocoapods:https://juejin.cn/post/7232187022398898234
- ios 制作framework静态库:https://juejin.cn/post/6959103632314728478
- iOS SDK封装Framework带资源文件封装:https://juejin.cn/post/6911226050102394894
- [Swift]SDK开发:https://blog.csdn.net/wsyx768/article/details/128801353
- XCFramework 深度使用(1)-Swift 静态库:https://juejin.cn/post/6891850436505485325
- 在 iOS Swift 开发中 简单地使用 XCFramework:https://juejin.cn/post/7243272599768399932?searchId=2024121916074431BC4A1715ED66C43FDA
- iOS Framework创建:https://www.bilibili.com/video/BV1E3411p75a/?spm_id_from=333.337.search-card.all.click&vd_source=5d8a5adc7d991c2fcea52e4d0bd44097