编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.UIKit框架学习
  • 02.UIViewController
  • 03.iOS工程面板说明
  • 04.基础控件Swift版
  • 05.手势的处理逻辑
  • 06.通信设计和实践
  • 07.Swift数据的存储
  • 09.Swift版网络请求
  • 10.Swift版数据存储
  • 11.Swift版多媒体实践
  • 12.Swift与ObjC互调
  • 13.Swift多线程开发
  • 14.Swift版SnapKit布局
  • 16.开发SDK实践
  • 17.iOS项目经验积累
  • 18.Swift版grpc请求

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的方式主要有以下几种:

  1. 静态库:静态库是将SDK的代码编译成一个静态库文件,其他开发者可以将其链接到自己的应用程序中使用。静态库的优点是使用方便,缺点是无法动态更新和修改。
  2. 动态库:动态库是将SDK的代码编译成一个动态库文件,其他开发者可以将其链接到自己的应用程序中使用。动态库的优点是可以动态更新和修改,缺点是使用相对复杂。
  3. 框架:框架是将SDK的代码打包成一个框架文件,其他开发者可以将其导入到自己的应用程序中使用。框架的优点是使用方便,缺点是无法动态更新和修改。

1.2 静态和动态库

静态库 VS 动态库

  1. 静态库在编译时将代码拷贝进目标程序中,会导致目标程序的体积增加。被多次使用就会在内存中存在多份冗余拷贝。
  2. 动态库在App冷启动时需要加载动态链接库,进行rebase指针调整和bind符号绑定等工作,会导致App的启动时间增长。由系统动态加载到内存,供App调用,系统只加载一次,多个程序共用,节省内存。
  3. iOS中静态库的形式:.a 和 .framework
  4. iOS中动态库的形式:.dylib 和 .framework

.a VS .framework

  1. .a是纯二进制文件 .framework中除了二进制文件还有资源文件
  2. .a文件不能直接使用,需要引入.h文件配合 .framework文件包含了.h文件和其他文,可以直接使用
  3. .a文件是静态库,.framework 既可以是静态库也可以是动态库

1.3 framework

Framework 实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

1.4 Aggregate介绍

Aggregate(聚合目标)是 Xcode 中的一个构建工具,用于执行一系列预定义的构建任务。它允许你在构建过程中执行多个脚本或命令,并将它们组合成一个单独的构建阶段。

通过使用 Aggregate 目标,你可以更灵活地自定义和管理构建过程。

使用 Aggregate 目标的步骤如下:

  1. 在 Xcode 中创建一个新的 Aggregate 目标。
  2. 在 Build Phases(构建阶段)中,添加你想要执行的脚本或命令。你可以使用 Shell 脚本、Python 脚本、Ruby 脚本等。
  3. 按照需要调整脚本的执行顺序和参数。
  4. 在构建过程中,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

  1. 在Build Settings设置中,Targets → General → Minimum Deployments设置为 iOS 11.0/9.0
  2. 在Build Settings设置中,Build Active Architecture Only 仅构建活动架构,这个要设置为NO,即不是只编译当前架构【必须】
  3. 在Build Settings设置中,Excluded Architecture 排除架构,如果没有特定架构设置则不用管
  4. 在Build Settings设置中,Dead Code Stripping 死代码剥离,即编译选项优化,对于framework来说, 应该设置为NO, 避免代码、调试符号等被剥离。
  5. 在Build Settings设置中,Mach-O Type 类型,设置类型为静态库Static Library【必须】
  6. 在Build Settings设置中,Build Libraries for Distribution 为分发构建库,设置为Yes,使编译出来的framework向下兼容。
  7. 在Build Settings设置中,Standard Libraries,设置成 No,避免重复链接
  8. 在Build Settings设置中,Build Settings → Enable Bitcode 设置为 No
  9. 在Build Settings设置中,Excluded Architectures → Release,添加 Any iOS Simulator SDK 配置 arm64
  10. 在Build Settings设置中,Build Libraries for Distribution 设置为Yes (如果是swift语言的时候需要)
  11. 在菜单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的创建有三种方式:

  1. 第一种方式:自己新建一个文件夹,将文件夹的后缀改成.bundler,然后将此bundle拖入到工程中,然后往工程中的.bundle底下添加素材即可
  2. 第二种方式:在工程中添加Target,此Target为bundle
  3. 第三种方式:直接创建一个工程,此工程为bundle

iOS之Bundle的创建与使用:https://www.jianshu.com/p/dd73925b02e7

Swift小知识点之bundle的使用:https://www.cnblogs.com/lxlx1798/articles/14790414.html

03.引用第三方库

3.1 引用framework

第一种:直接引用系统提供的.framework

  1. 选中项目名称
  2. 选中TARGETS
  3. 选中Build Phases
  4. 在Link Binary With Libraries中添加。
  5. 点击“+”号,加入所需的系统提供的.framework文件

第二种:引用第三方提供的.framework

  1. 下载好所需要的第三方提供的.framework
  2. 将第三方.framework文件拷贝到工程所处的文件夹中
  3. 一定要注意:在 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
贡献者: yangchong211
上一篇
14.Swift版SnapKit布局
下一篇
17.iOS项目经验积累