SDK 版本与构建产物
本文档系统梳理 iOS-JL_OTA 杰理蓝牙 OTA 升级 SDK 的版本体系(SDK 版本与示例 APP 版本)、版本演进历史、版本对应关系,以及仓库内提供的构建产物(XCFramework / framework 格式的 SDK 库)的组成与集成方式。
Purpose and Scope
本页面向需要选型、升级、排查版本兼容问题的集成开发者,覆盖以下内容:
- SDK 版本(v2.x)与示例 APP 版本(v3.x)的版本历史与演进脉络
- SDK 版本与 APP 版本、固件能力之间的对应关系
libs/目录下构建产物的完整清单、格式(XCFramework / framework)与发布渠道(正式版 / BetaBuild)- 构建产物的集成方式(导入、Embed & Sign、权限配置)与版本选择建议
不在本页范围内(由兄弟页面覆盖):
- OTA 升级的具体业务流程(设备连接、订阅、
cmdTargetFeature、cmdOTAData分包发送等)→ 参见 OTA 升级机制相关页面 - 三种蓝牙连接方式(原生 CoreBluetooth / JL_BLEKit / JL_Assist)的实现细节 → 参见连接方式相关页面
- SDK 各业务库的完整 API 参考 → 参见各库 API 参考页面
Overview
iOS-JL_OTA 是珠海市杰理科技股份有限公司为杰理蓝牙设备(AC695X、AC697N、JL701N、AD697N/AD698N、AC630N/AC632N 等)提供的 OTA 升级开发平台,基于 RCSP 协议(远程控制系统协议) 实现。仓库同时承载三类交付物:
- 核心 SDK 库(
libs/目录):以 XCFramework 格式发布的正式构建产物,包括 OTA 升级业务库JL_OTALib、广播包解析库JL_AdvParse、设备认证库JL_HashPair、日志辅助库JLLogHelper,以及可选的蓝牙连接核心库JL_BLEKit;另含BetaBuild/iOSOnlyBuild/下的 framework 格式测试构建。 - 示例工程源码(
code/目录):迷你示例(三种连接方式)与完整 OTA 应用JL_OTA(依赖DFUnits.framework工具库)。 - 开发文档(
doc/目录):随版本发布的 HTML 文档,如Release_V2.5.0/。
SDK 的版本演进遵循"功能模块化拆分 → 独立库发布 → 稳定性修复"的路线:从 v2.0.0 单一能力起步,经 v2.1.0 拆分独立模块、v2.3.1 分离日志库并引入超时检测,到 v2.4.0/v2.5.0 增强容错与新增 GATT Over BR/EDR 支持。版本号语义上,v2.x.y 为 SDK 主版本线,v3.x.y 为示例 APP 版本线,两者通过"APP 适配 SDK"的关系联动发布(详见 版本历史)。
Architecture
下图展示了仓库中与"版本与构建产物"相关的完整生态:发布渠道、SDK 库构成、示例工程依赖关系,以及各库之间的依赖边界。
flowchart TD
subgraph sg_Repo["iOS-JL_OTA 仓库"]
subgraph sg_Libs["libs/ — SDK 构建产物"]
OTA["JL_OTALib.xcframework<br/>OTA 升级业务库"]
ADV["JL_AdvParse.xcframework<br/>广播包解析库"]
HASH["JL_HashPair.xcframework<br/>设备认证库"]
BLE["JL_BLEKit.xcframework<br/>蓝牙连接核心库(可选)"]
LOG["JLLogHelper.xcframework<br/>日志辅助库"]
BETA["BetaBuild/iOSOnlyBuild/<br/>framework 格式测试构建"]
end
subgraph sg_Code["code/ — 示例工程"]
MINI["MiniDemo<br/>三种连接方式迷你示例"]
FULL["JL_OTA<br/>完整 OTA 应用"]
DFU["DFUnits.framework<br/>通用工具库"]
end
subgraph sg_Doc["doc/ — 发布文档"]
DOC["Release_V2.5.0/<br/>版本文档"]
end
end
MINI --> OTA
MINI --> ADV
MINI --> HASH
MINI --> LOG
FULL --> OTA
FULL --> DFU
BETA -.->|"测试渠道(非正式发布)"| ADV
BETA -.->|"测试渠道(非正式发布)"| BLE
架构说明:
libs/是正式构建产物的唯一来源。集成时必须导入JL_OTALib、JL_AdvParse、JL_HashPair、JLLogHelper四个库并设置Embed & Sign;JL_BLEKit仅在需要使用杰理集成蓝牙库时导入(见 README.md)。BetaBuild/iOSOnlyBuild/是测试渠道产物。该目录下为 framework 格式(而非 XCFramework),包含JL_AdvParse.framework、JL_BLEKit.framework等,供内部/灰度验证使用,不建议正式发布集成。- 示例工程与 SDK 库解耦:
code/下三个迷你示例分别演示三种连接方式,完整示例JL_OTA额外依赖DFUnits.framework(通用工具库,提供 AES、CRC16、Gzip、Http 等能力),说明 SDK 本身不依赖 DFUnits,仅示例工程使用。 - 文档随版本发布:
doc/目录按版本号组织(当前为Release_V2.5.0),与 SDK 版本一一对应。
版本与构建产物的生命周期关系可用下图概括:
flowchart LR
DEV["开发迭代"] --> TAG["打 Tag 发布版本<br/>v2.x.y(SDK)/ v3.x.y(APP)"]
TAG --> BUILD["构建产物生成"]
BUILD --> XC["XCFramework 正式产物<br/>libs/ 目录"]
BUILD --> FB["framework 测试产物<br/>libs/BetaBuild/iOSOnlyBuild/"]
XC --> DOC["同步更新 doc/ 版本文档"]
XC --> DEMO["示例工程同步适配"]
DEMO --> REL["开发者集成选型"]
DOC --> REL
版本历史
版本历史是本文档的核心内容,数据直接来源于仓库 README 的版本历史章节。
SDK 版本(v2.x 线)
| 版本 | 发布日期 | 主要更新 |
|---|---|---|
| v2.5.0 | 2026/02/04 | 1. 增加 GATT Over BR/EDR 设备 OTA 升级支持 2. 修复 OTA 回连超时问题 |
| v2.4.0 | 2025/10/13 | 1. OTA 超时处理的逻辑优化 2. 增加重复序列号的容错处理 3. 增加特殊空间复用的升级支持 4. 增加单备份 SDK 内部自动回连接口 |
| v2.3.1 | 2024/12/12 | 1. 分离日志打印库为独立运行模块 2. 增加所有命令的超时检测 3. 增加 OTA 升级的错误回调 4. 增加 OTA 对象的对象管理容错 |
| v2.1.0 | 2023/03/28 | 1. 性能优化 1.1 分离 OTA 模块为独立运行模块 1.2 分离设备认证配对业务为独立库 1.3 分离广播包解析模块为独立库 |
| v2.0.0 | 2021/10/14 | 1. 支持 BLE 单备份升级 2. 支持 BLE 双备份升级 3. 支持从浏览器传输 OTA 升级文件到 APP 4. 支持第三方电脑软件导入 OTA 升级文件 5. 可选择 BLE 广播包过滤 6. 可选择 BLE 握手连接 |
APP 版本(v3.x 线)
| 版本 | 发布日期 | 主要更新 |
|---|---|---|
| v3.5.2 | 2026/02/04 | 修复已知问题;使用新的 SDK v2.5.0 |
| v3.5.1 | 2025/10/13 | 修复已知问题;使用新的 SDK v2.4.0 |
| v3.5.0 | 2024/12/13 | 适配新 SDK 2.3.1 |
| v3.3.0 | 2023/03/23 | 适配新 SDK 2.1.0 |
| v3.2.0 | 2023/01/11 | 重构 UI 页面,整理项目架构,新增自动化测试/广播音箱模块 |
| v2.0.0 | 2021/10/14 | 蓝牙库新增根据 ble 地址对升级设备的回连;重写 ota demo |
版本对应关系
SDK 与示例 APP 采用"APP 适配 SDK"的联动发布策略:每次 SDK 发版后,示例 APP 随即跟进适配并修复已知问题。对应关系如下:
| SDK 版本 | 对应 APP 版本 | 发布时间(对齐) |
|---|---|---|
| v2.5.0 | v3.5.2 | 2026/02/04 |
| v2.4.0 | v3.5.1 | 2025/10/13 |
| v2.3.1 | v3.5.0 | 2024/12/12 ~ 2024/12/13 |
| v2.1.0 | v3.3.0 | 2023/03/23 ~ 2023/03/28 |
| v2.0.0 | v2.0.0 | 2021/10/14 |
选型建议:新项目直接采用当前最新版本(SDK v2.5.0 + APP v3.5.2);存量项目升级时,务必同时升级 SDK 与示例工程对应版本,并参考 doc/Release_V2.5.0/ 文档核对 API 变更。
版本演进脉络分析
flowchart TD
V200["v2.0.0 (2021/10)<br/>BLE 单/双备份升级<br/>广播过滤、握手连接"]
V210["v2.1.0 (2023/03)<br/>模块化拆分:OTA / 认证 / 广播解析<br/>独立库发布,性能优化"]
V231["v2.3.1 (2024/12)<br/>分离日志库 JLLogHelper<br/>全命令超时检测、错误回调"]
V240["v2.4.0 (2025/10)<br/>超时逻辑优化<br/>重复序列号容错、空间复用升级"]
V250["v2.5.0 (2026/02)<br/>GATT Over BR/EDR 支持<br/>修复回连超时"]
V200 --> V210 --> V231 --> V240 --> V250
设计意图解读:
- 模块化拆分是主线(v2.1.0、v2.3.1):OTA 业务、设备认证、广播解析、日志逐步拆分为独立 XCFramework。这样做的目的是:① 减小业务主库体积,日志库按需加载;② 各模块独立演进、独立修复,降低耦合;③ 让集成方只需导入实际用到的库。
- 容错与超时是稳定性的重点(v2.3.1 → v2.4.0 → v2.5.0):从"增加所有命令的超时检测"到"OTA 超时处理逻辑优化",再到"修复 OTA 回连超时问题",说明蓝牙链路的不确定性(丢包、断连、回连)是 OTA 场景最主要的稳定性风险,版本迭代持续在此投入。
- 能力边界持续扩展(v2.0.0 → v2.5.0):从 BLE 单/双备份,到特殊空间复用升级、单备份内部自动回连,再到 GATT Over BR/EDR 经典蓝牙升级,覆盖了从 TWS 耳机到音箱、手表的全产品线升级诉求。
构建产物详解
libs/ 目录结构与发布渠道
仓库通过 libs/ 目录统一承载 SDK 构建产物,分为两条渠道(见 README.md 工程结构 与仓库实际目录):
libs/
├── JL_OTALib.xcframework # OTA 升级业务库(正式)
├── JL_AdvParse.xcframework # 广播包解析库(正式)
├── JL_HashPair.xcframework # 设备认证库(正式)
├── JL_BLEKit.xcframework # 蓝牙连接核心库(正式,可选)
├── JLLogHelper.xcframework # 日志辅助库(正式)
└── BetaBuild/
└── iOSOnlyBuild/ # 测试渠道产物(framework 格式)
├── JL_AdvParse.framework/
│ ├── Headers/JL_AdvParse.h, JLAdvParse.h,
│ │ JLChargingBoxAdv.h, JLDevicesAdv.h,
│ │ JLEarphoneAdv.h, JLOtaAdv.h,
│ │ JLSoundBoxAdv.h, JLSoundCardAdv.h,
│ │ JLTwsAdv.h, JLWatchAdv.h
│ ├── Info.plist
│ ├── Modules/module.modulemap
│ └── JL_AdvParse # 二进制主文件
└── JL_BLEKit.framework/ # 蓝牙连接库(测试渠道)
└── Headers/ECBDTManager.h, ECBDTObjc.h ...
来源:README.md 工程结构;BetaBuild 目录结构为仓库实际内容。
库清单(构建产物组成)
| 库名 | 格式 | 角色 | 是否必选 |
|---|---|---|---|
| JL_OTALib.xcframework | XCFramework | OTA 升级业务库,负责升级流程、分包、回连等核心业务 | ✅ 必选 |
| JL_AdvParse.xcframework | XCFramework | 杰理蓝牙设备广播包解析库 | ✅ 必选 |
| JL_HashPair.xcframework | XCFramework | 设备认证(Hash 配对)业务库 | ✅ 必选 |
| JLLogHelper.xcframework | XCFramework | 日志打印与收集库(v2.3.1 起独立) | ✅ 必选 |
| JL_BLEKit.xcframework | XCFramework | 蓝牙连接核心库(杰理集成蓝牙栈) | ⭕ 可选 |
| DFUnits.framework | framework | 通用工具库(AES/CRC16/Gzip/Http 等),仅示例工程使用 | ⭕ 示例工程依赖 |
XCFramework 与 framework 两种格式的设计考量
- 正式发布产物采用 XCFramework:XCFramework 是 Apple 推荐的跨平台/跨架构二进制打包格式,一个
.xcframework内可同时包含模拟器与真机 slice(ios-arm64、ios-arm64_x86_64-simulator等),集成时通过Embed & Sign自动选择合适 slice,无需手动剥离架构——这是 SDK 面向不同开发者环境(Intel Mac + 模拟器 / Apple Silicon / 真机)的关键设计。 - 测试渠道产物采用 framework 格式(
libs/BetaBuild/iOSOnlyBuild/):目录名iOSOnlyBuild表明其仅面向 iOS 真机构建,便于内部快速验证新特性或修复,不承诺跨架构兼容性,不建议正式发布集成。
构建产物的版本一致性要求
集成时需保证四个必选库来自同一 SDK 版本(当前 v2.5.0),避免因跨版本混用导致协议不匹配。判断方法:
- 核对
libs/目录中库的二进制构建时间/版本,与doc/Release_<版本号>/文档对应; - 在示例工程
code/中核对 SDK 适配版本(当前 APP v3.5.2 适配 SDK v2.5.0); - 参考 README 徽章中的最新 Tag(
github.com/Jieli-Tech/iOS-JL_OTA/tags)确认最新发布版本。
说明:仓库 Tag 与徽章信息位于 README.md 顶部,实际 Tag 列表以 GitHub Releases/Tags 页为准。
核心流程:从版本选择到构建产物集成
版本选择与集成决策流程
flowchart TD
Start([开始集成]) --> Q1{"新项目 or 存量升级?"}
Q1 -->|"新项目"| LATEST["选用最新版本<br/>SDK v2.5.0 + APP v3.5.2"]
Q1 -->|"存量升级"| CUR{"当前 SDK 版本?"}
CUR -->|"低于 v2.4.0"| UPGRADE["升级到 v2.5.0<br/>注意 v2.3.1 日志库拆分等破坏性变更"]
CUR -->|"v2.4.0+"| PATCH["小版本升级 v2.5.0<br/>新增 BR/EDR 能力,修复回连超时"]
LATEST --> INTEG["从 libs/ 导入 4 个必选 XCFramework"]
UPGRADE --> INTEG
PATCH --> INTEG
INTEG --> EMBED["设置 Embed & Sign"]
EMBED --> PERM["Info.plist 配置蓝牙权限"]
PERM --> OPT{"需要杰理蓝牙栈?"}
OPT -->|"是"| BLE["额外导入 JL_BLEKit.xcframework"]
OPT -->|"否"| SKIP["使用原生 CoreBluetooth 或 JL_Assist"]
BLE --> CODE["编写业务代码"]
SKIP --> CODE
CODE --> TEST["真机验证 OTA 升级"]
TEST --> END([完成])
集成步骤(来自 README 快速开始)
仓库 README 给出的标准集成流程如下:
- 将
libs/目录下的JL_OTALib.xcframework、JL_AdvParse.xcframework、JL_HashPair.xcframework、JLLogHelper.xcframework添加到项目并设置Embed & Sign; - 配置权限:
Privacy - Bluetooth Peripheral/Always Usage Description; - 核心调用流程:设备连接+订阅 →
noteEntityConnected→cmdTargetFeature→cmdOTAData(data)→ 委托回调otaUpgradeResult、otaDataSend→ 断开时noteEntityDisconnected。
构建产物导入后的权限配置示例
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要使用蓝牙功能连接杰理设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要作为蓝牙外设连接杰理设备</string>
使用示例
示例一:日志库(JLLogHelper)运行控制
v2.3.1 起 JLLogHelper 作为独立构建产物交付,默认开启日志打印与存储,可通过以下接口控制(Objective-C):
// Objective-C
[JLLogManager clearLog]; // 清空日志
[JLLogManager setLog:false IsMore:false Level:JLLOG_COMPLETE]; // 关闭日志打印
[JLLogManager saveLogAsFile:false]; // 关闭日志存储
[JLLogManager logWithTimestamp:false]; // 关闭日志打印时间
Swift 侧等价接口(含日志重定向与收集回调):
// Swift
JLLogManager.saveLog(asFile: true)
JLLogManager.setLog(true, isMore: false, level: .COMPLETE)
JLLogManager.log(withTimestamp: true)
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/abc.txt"
JLLogManager.redirectLogPath(path) // 重置保存路径
JLLogManager.clearLog()
JLLogManager.collectLog { str in
print(str) // 回调所有的日志打印内容
}
JLLogManager.logSomething("abcd")
设计意图:日志库独立后,生产环境可通过 setLog:false 与 saveLogAsFile:false 关闭日志以降低性能开销;调试期可通过 redirectLogPath 将日志重定向到指定文件、用 collectLog 实时收集日志——这套能力与 v2.3.1 引入的"全命令超时检测 + 错误回调"配合,是排查蓝牙链路问题(断连、回连超时)的核心手段。
示例二:广播解析库(JL_AdvParse)的头文件入口
测试渠道产物 libs/BetaBuild/iOSOnlyBuild/JL_AdvParse.framework 的公开头文件体现了广播解析库的能力边界(按设备类型划分解析器):
JL_AdvParse.h/JLAdvParse.h— 库主入口JLOtaAdv.h— OTA 广播包解析JLEarphoneAdv.h/JLTwsAdv.h— 耳机 / TWS 设备广播JLWatchAdv.h— 手表设备广播JLSoundBoxAdv.h/JLSoundCardAdv.h/JLChargingBoxAdv.h/JLDevicesAdv.h— 音箱、声卡、充电盒、通用设备广播
这组头文件是 v2.1.0"分离广播包解析模块为独立库"的直接产物:将原先内嵌于 OTA 主库的广播解析逻辑按设备品类拆分为独立类,使集成方可以只依赖 JL_AdvParse 完成设备发现/过滤,而无需引入完整 OTA 业务。
配置选项
构建产物导入配置
| 配置项 | 类型 | 默认 | 说明 |
|---|---|---|---|
| 必选库导入 | 框架 | 4 个必选 XCFramework | JL_OTALib、JL_AdvParse、JL_HashPair、JLLogHelper |
| 可选库导入 | 框架 | 不导入 | JL_BLEKit(使用杰理集成蓝牙栈时导入) |
| Embed & Sign | 工程设置 | 无 | 所有导入的 XCFramework 均需设置 |
NSBluetoothAlwaysUsageDescription | Info.plist | 无 | 蓝牙使用权限描述(必配) |
NSBluetoothPeripheralUsageDescription | Info.plist | 无 | 蓝牙外设权限描述(必配) |
日志运行配置(JLLogHelper)
| 接口 | 默认状态 | 说明 |
|---|---|---|
setLog:IsMore:Level: | 开启 | 控制日志打印与详细程度(JLLOG_COMPLETE 等) |
saveLogAsFile: | 开启 | 控制是否将日志存储为文件 |
logWithTimestamp: | 开启 | 控制日志是否打印时间戳 |
redirectLogPath: | 系统默认路径 | 重置日志保存路径 |
collectLog: | — | 回调收集所有日志内容 |
clearLog | — | 清空日志 |
故障模式、边界情况与并发
以下内容基于版本历史中明确记录的修复项与 SDK 设计特征整理:
已知故障模式与修复记录
| 故障模式 | 受影响版本 | 修复版本 | 说明 |
|---|---|---|---|
| OTA 回连超时 | ≤ v2.4.0 | v2.5.0 | 回连过程中超时导致升级中断,v2.5.0 修复 |
| OTA 命令超时无检测 | ≤ v2.1.0 | v2.3.1 | v2.3.1 起为所有命令增加超时检测,超时后触发错误回调 |
| OTA 升级错误无回调 | ≤ v2.1.0 | v2.3.1 | 增加 OTA 升级错误回调,便于上层感知失败 |
| 重复序列号导致解析异常 | ≤ v2.3.1 | v2.4.0 | 增加重复序列号的容错处理 |
| OTA 对象生命周期管理缺陷 | ≤ v2.1.0 | v2.3.1 | 增加 OTA 对象的对象管理容错 |
边界情况与并发注意事项
- 单备份升级的断连风险:单备份升级过程中若蓝牙断连,固件可能处于半升级状态。v2.4.0 起提供"单备份 SDK 内部自动回连接口",建议升级前通过
noteEntityDisconnected回调感知断连,并主动触发回连。 - 广播包过滤与握手连接:v2.0.0 起支持"可选择 BLE 广播包过滤"与"可选择 BLE 握手连接",在多设备并存环境中需合理配置过滤条件,避免错误设备抢占升级链路。
- 模块独立运行带来的线程边界:v2.1.0 起 OTA 模块为独立运行模块,日志、认证、广播解析均在各库内部线程处理;多库同时回调时,业务层应避免在委托回调中执行耗时操作,防止阻塞蓝牙链路。
- 版本混用风险:四个必选库必须同版本。跨版本混用(如 v2.5.0 的
JL_OTALib+ v2.3.1 的JL_AdvParse)可能导致广播解析与 OTA 业务协议不匹配。
性能与运维注意事项
- 模块化减小主库体积:v2.1.0 分离认证、广播解析,v2.3.1 分离日志库,集成方可按需裁剪,生产包仅保留 OTA 业务必需库,日志库可在发布前关闭打印与存储以降低运行时开销。
- 日志是运维抓手:JLLogHelper 支持文件落盘与
collectLog实时收集,配合版本号(SDK v2.5.0 / APP v3.5.2)上报,是定位线上蓝牙问题的主要手段。 - 真机验证必要性:BetaBuild 渠道的
iOSOnlyBuild产物仅面向真机;模拟器调试请使用 XCFramework 正式产物,且最终 OTA 流程务必在真机验证(蓝牙外设行为与模拟器存在差异)。 - 升级节奏建议:跟随 SDK 主版本(v2.x 末尾版本)升级而非每个小版本,重点吸收超时/容错类修复(v2.3.1 起持续增强)。
扩展点
- 连接方式三选一:原生 CoreBluetooth(完全掌控扫描/连接/分包)、JL_BLEKit(快速集成)、JL_Assist(桥接既有蓝牙层)。连接层与 OTA 业务层解耦,可在不改动 OTA 逻辑的前提下替换连接实现。
- 可选导入 JL_BLEKit:不使用杰理蓝牙栈时可省略该库,降低体积;使用自定义蓝牙层(JL_Assist)时也无需导入。
- 日志模块可编程控制:JLLogHelper 提供完整的运行期开关(打印、落盘、时间戳、路径重定向),可接入自定义日志上报体系。
- 广播解析按品类扩展:
JL_AdvParse头文件按设备类型(TWS、手表、音箱、声卡、充电盒)组织,新设备品类可在此基础上扩展解析器。
Related Links
- README.md(仓库主文档,含完整版本历史与集成说明)
- README_EN.md(英文版说明)
- LICENSE(Apache License 2.0)
- libs/BetaBuild/iOSOnlyBuild/JL_AdvParse.framework(测试渠道构建产物示例)
- 在线文档中心:https://doc.zh-jieli.com/Apps/iOS/ota/zh-cn/master/index.html
- 版本 Tag 列表:https://github.com/Jieli-Tech/iOS-JL_OTA/tags
本文档所有版本号、发布日期与功能描述均以仓库 README 版本历史章节为准;构建产物目录结构以仓库 libs/ 实际内容为准。