SDK 集成步骤
本文档介绍如何将杰理 iOS OTA SDK(XCFramework 格式)集成到你的 iOS 应用中,涵盖环境要求、框架导入、权限配置、连接方式选择、核心调用流程、日志管理及常见问题排查。
Purpose and Scope
本页面向需要把杰理蓝牙 OTA 升级能力接入自有 iOS App 的开发者,说明从零开始的完整集成路径:获取 SDK → 导入框架 → 配置权限 → 选择蓝牙连接方式 → 实现核心 OTA 调用流程 → 日志调试。
本页聚焦"集成"这一动作本身。以下内容属于兄弟页面,不在本页展开:
- 三种连接方式的具体 API 用法与最佳实践,请参考各自的示例文档(
code/MiniDemo/下三个独立示例工程)。 - 广播包解析、设备 Hash 认证、OTA 升级的内部协议细节,请参考 SDK 文档中心与
doc/Release_V2.5.0/。 - 调试技巧与日志导出,请参考官方调试说明文档。
Overview
杰理 OTA SDK 提供完整的蓝牙 OTA 升级能力封装,支持 BLE 单备份/双备份升级、强制升级、回连机制、Hash 配对认证、广播包解析,以及 GATT Over BR/EDR 经典蓝牙升级。仓库以 XCFramework 格式分发二进制库,同时附带三个迷你示例工程(MiniSingleDemo、JLBleKitOTADemo、JLAssistOTADemo)与一个完整 OTA 应用示例(code/JL_OTA/)。
核心设计意图:把"OTA 升级业务"与"蓝牙连接细节"解耦。开发者可以完全使用 SDK 自带的蓝牙层(JL_BLEKit)快速集成,也可以基于原生 CoreBluetooth 或外部蓝牙层(JL_Assist)自行管理连接,只把 OTA 业务交给 JL_OTALib。因此集成的第一步不是写代码,而是先决定连接方式。
flowchart TD
A["下载/克隆仓库"] --> B["导入 XCFramework<br/>并设置 Embed & Sign"]
B --> C["配置 Info.plist 蓝牙权限"]
C --> D{"选择连接方式"}
D -->|"原生 CoreBluetooth"| E["MiniSingleDemo 模式"]
D -->|"JL_BLEKit"| F["JLBleKitOTADemo 模式"]
D -->|"JL_Assist 自定义"| G["JLAssistOTADemo 模式"]
E --> H["初始化 SDK 并实现核心流程"]
F --> H
G --> H
H --> I["编译运行,开始 OTA 升级开发"]
Architecture
SDK 采用分层设计,iOS App 通过四至五个 XCFramework 组合获得完整 OTA 能力:
flowchart TD
subgraph sg_App["iOS 应用层"]
App["你的 iOS App"]
Demo["示例工程 code/MiniDemo"]
end
subgraph sg_SDK["杰理 OTA SDK(libs/ 目录)"]
OTA["JL_OTALib<br/>OTA 升级业务库"]
Adv["JL_AdvParse<br/>广播包解析库"]
Hash["JL_HashPair<br/>设备认证库"]
Log["JLLogHelper<br/>日志辅助库"]
BLE["JL_BLEKit<br/>蓝牙连接核心库(可选)"]
end
subgraph sg_Device["设备层"]
FW["杰理蓝牙设备<br/>(支持 RCSP 协议的固件)"]
end
App --> OTA
OTA --> Adv
OTA --> Hash
OTA --> Log
OTA --> BLE
BLE -->|"BLE GATT / GATT Over BR/EDR"| FW
各库职责(依据 README.md):
| 库 | 必须/可选 | 职责 |
|---|---|---|
JL_OTALib.xcframework | 必须 | OTA 升级业务库,负责升级流程、分包发送、超时与回连 |
JL_AdvParse.xcframework | 必须 | 解析杰理蓝牙设备广播包 |
JL_HashPair.xcframework | 必须 | 设备 Hash 配对认证,保障升级安全 |
JLLogHelper.xcframework | 必须 | 日志打印与收集,用于问题排查 |
JL_BLEKit.xcframework | 可选 | 蓝牙连接核心库,仅在需要使用杰理集成的蓝牙层时导入 |
这种拆分源于版本演进:v2.1.0 起将 OTA 模块、设备认证、广播解析从单一库中分离为独立模块,使开发者可以按需裁剪依赖,同时保持升级业务与连接层解耦。
集成前置条件(运行环境)
在开始集成前,请确认工程满足以下要求(来源:README.md):
| 类别 | 要求 | 说明 |
|---|---|---|
| iOS 系统 | iOS 12.0+ | 支持 BLE 功能 |
| Xcode 版本 | 14.0+ | 建议使用最新版本 |
| 硬件要求 | 支持 RCSP 协议的固件 | AC695X、AC697X 等 SDK 平台 |
| 语言支持 | Objective-C / Swift | SDK 提供完整的双语言 API |
支持的设备平台示例:数传设备(AC695X、AC608N、AC897、AD697N、AD698N、AC630N、AC632N)、手表设备(AC695X、JL701N、AC707N)、音箱设备(JL701N、AC897、AD697N、AD698N、700N)。
获取 SDK 与工程结构
通过 Git 克隆仓库获取 SDK 二进制与示例源码(来源:README.md):
git clone https://github.com/Jieli-Tech/iOS-JL_OTA.git
cd iOS-JL_OTA
仓库目录结构(来源:README.md):
iOS-JL_OTA/
├── code/ # 示例程序源码
│ ├── MiniDemo/ # 迷你示例工程
│ │ ├── MiniSingleDemo/ # 原生 CoreBluetooth 连接示例
│ │ ├── JLBleKitOTADemo/ # JL_BLEKit 连接示例
│ │ └── JLAssistOTADemo/ # JL_Assist 自定义连接示例
│ └── JL_OTA/ # 完整 OTA 应用示例
├── libs/ # 核心 SDK 库 (XCFramework 格式)
│ ├── JL_OTALib.xcframework # OTA 升级业务库
│ ├── JL_AdvParse.xcframework # 广播包解析库
│ ├── JL_HashPair.xcframework # 设备认证库
│ ├── JL_BLEKit.xcframework # 蓝牙连接核心库(可选)
│ └── JLLogHelper.xcframework # 日志辅助库
└── doc/ # 文档资源
└── Release_V2.5.0/ # 最新版本文档
集成时只需从 libs/ 拷贝所需 XCFramework 到自己的工程;code/MiniDemo/ 中的三个工程是不同连接方式的最小可运行参考,code/JL_OTA/ 是带完整 UI 与蓝牙管理的综合示例。
第一步:导入框架
将 libs/ 目录下的 XCFramework 添加到 Xcode 工程中,并设置 Embed & Sign(来源:README.md):
- 集成
JL_OTALib.xcframework、JL_AdvParse.xcframework、JL_HashPair.xcframework、JLLogHelper.xcframework,并在 General → Frameworks, Libraries, and Embedded Content 中设为Embed & Sign。 - 若选择 SDK 蓝牙连接方式,额外导入
JL_BLEKit.xcframework。
为什么必须 Embed & Sign:XCFramework 是动态链接的二进制包,必须嵌入 App 包内并在签名时一并处理,否则真机运行时会出现动态库加载失败(
dyld: Library not loaded)问题。
第二步:配置蓝牙权限
在 Info.plist 中添加蓝牙使用权限描述,否则系统会拒绝 App 访问蓝牙(来源:README.md):
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要使用蓝牙功能连接杰理设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要作为蓝牙外设连接杰理设备</string>
NSBluetoothAlwaysUsageDescription:iOS 13+ 访问蓝牙必须声明的权限。NSBluetoothPeripheralUsageDescription:iOS 12 及更早版本的兼容声明。
第三步:选择蓝牙连接方式
SDK 提供三种蓝牙连接方式,选择决定了后续初始化代码的形态(来源:README.md):
| 连接方式 | 适用场景 | Demo 路径 |
|---|---|---|
| 原生 CoreBluetooth | 完全掌控 BLE 扫描、连接、服务与分包发送 | code/MiniDemo/MiniSingleDemo/ |
| JL_BLEKit | 快速集成、减少蓝牙细节处理 | code/MiniDemo/JLBleKitOTADemo/ |
| JL_Assist 自定义 | 已有外部蓝牙管控或需桥接到既有蓝牙层 | code/MiniDemo/JLAssistOTADemo/ |
选择指南:
- 完全掌控 BLE 扫描、连接、服务与分包发送 → 选择原生自定义连接;
- 快速集成、减少蓝牙细节处理 → 选择 SDK 蓝牙连接(JL_BLEKit);
- 已有外部蓝牙管控或需桥接到既有蓝牙层 → 选择 JL_Assist 自定义连接。
第四步:核心调用流程
无论选择哪种连接方式,OTA 升级的业务调用骨架是一致的(来源:README.md):
设备连接+订阅 →
noteEntityConnected→cmdTargetFeature→cmdOTAData(data)→ 委托回调otaUpgradeResult、otaDataSend→ 断开时noteEntityDisconnected
sequenceDiagram
participant App as iOS App
participant SDK as JL_OTALib
participant BLE as 蓝牙连接层
participant Dev as 杰理设备
App->>BLE: 设备连接 + 订阅通知
BLE-->>SDK: noteEntityConnected(连接成功通知)
SDK->>Dev: cmdTargetFeature(查询设备升级能力)
Dev-->>SDK: 能力信息回调
App->>SDK: cmdOTAData(data) 发送升级数据
SDK->>Dev: 分包发送 OTA 数据
SDK-->>App: 委托回调 otaUpgradeResult / otaDataSend
BLE-->>SDK: noteEntityDisconnected(断开通知)
各环节的设计意图:
- 设备连接 + 订阅:先建立 BLE 连接并订阅设备的通知特征,确保能收到设备上报的数据。
noteEntityConnected:SDK 收到连接事件后开始管理该设备的 OTA 会话状态;这是 SDK 判定"设备在线"的锚点。cmdTargetFeature:升级前向设备查询能力(如是否支持双备份、当前固件版本等),用于决定升级策略与 UI 展示。cmdOTAData(data):将升级文件数据交给 SDK,由 SDK 负责分包、校验与发送;调用方无需关心分帧细节。- 委托回调:
otaUpgradeResult回报升级结果(成功/失败及错误码),otaDataSend回报发送进度,用于驱动进度条与结果页。 noteEntityDisconnected:设备断开时 SDK 清理会话,App 可在此触发重连或回连逻辑。
日志管理(JLLogHelper)
JLLogHelper 默认开启日志打印和存储,可在初始化后按需调整(来源:README.md):
// Objective-C:控制日志打印与存储
[JLLogManager clearLog]; // 清空日志
[JLLogManager setLog:false IsMore:false Level:JLLOG_COMPLETE]; // 关闭日志打印
[JLLogManager saveLogAsFile:false]; // 关闭日志存储
[JLLogManager logWithTimestamp:false]; // 关闭日志打印时间
// 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")
调试时建议保持日志开启;collectLog 可将 SDK 内部日志实时转发到你的日志系统,便于与业务日志关联分析。日志详细排查方法参见官方 SDK 调试说明。
配置选项
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
NSBluetoothAlwaysUsageDescription | Info.plist 字符串 | 无 | iOS 13+ 蓝牙权限描述(必须配置) |
NSBluetoothPeripheralUsageDescription | Info.plist 字符串 | 无 | iOS 12 及以下蓝牙权限描述(必须配置) |
JLLogManager setLog:isMore:level: | Bool/Bool/枚举 | 开启 | 是否打印日志、是否打印详细日志、日志级别 |
JLLogManager saveLogAsFile: | Bool | 开启 | 是否将日志保存为文件 |
JLLogManager logWithTimestamp: | Bool | 开启 | 打印日志时是否带时间戳 |
JLLogManager redirectLogPath: | String | 系统文档目录 | 日志文件保存路径 |
JL_BLEKit.xcframework 导入与否 | 框架依赖 | 不导入 | 决定使用 SDK 蓝牙层还是自定义连接层 |
API 参考(集成阶段常用接口)
以下接口名称与调用顺序来自 README.md 快速集成步骤 与示例工程。完整的协议级 API 请以 doc/Release_V2.5.0/ 与在线文档中心为准。
cmdTargetFeature
查询设备 OTA 升级能力(固件版本、备份方式等),在连接建立后、发送升级数据前调用。
调用时机:noteEntityConnected 之后、cmdOTAData 之前。
cmdOTAData(data)
将 OTA 升级文件数据交给 SDK 发送。
参数:
data:升级文件的数据(NSData/Data),通常来自固件文件读取或浏览器/第三方软件导入的升级包。
说明:SDK 内部负责分包、发送节奏控制与数据校验,调用方只需在收到 otaDataSend 进度回调后继续驱动流程。
委托回调
| 回调 | 时机 | 说明 |
|---|---|---|
otaUpgradeResult | 升级流程结束 | 上报成功或失败(含错误码),用于结果页展示 |
otaDataSend | 每包数据发送后 | 上报发送进度,用于进度条 |
noteEntityConnected | 设备连接成功 | SDK 会话建立的锚点 |
noteEntityDisconnected | 设备断开 | SDK 清理会话,App 可触发重连/回连 |
JLLogManager(日志辅助库)
| 方法 | 说明 |
|---|---|
clearLog | 清空日志 |
setLog(_:isMore:level:) | 开关日志打印、详细模式与级别 |
saveLogAsFile(_:) | 开关日志文件存储 |
logWithTimestamp(_:) | 开关日志时间戳 |
redirectLogPath(_:) | 重置日志保存路径 |
collectLog { str in } | 实时回调所有日志内容 |
logSomething(_:) | 主动写入一条日志 |
失败模式、边界情况与并发注意
依据 README.md 版本历史,SDK 在以下场景有明确的容错与错误处理设计,集成时应加以利用:
- OTA 超时:v2.3.1 起所有命令增加超时检测,v2.4.0 优化超时处理逻辑。升级中途卡死时会通过
otaUpgradeResult错误回调上报,App 应据此展示失败状态并提示重试。 - OTA 回连超时:v2.5.0 修复回连超时问题;v2.4.0 增加单备份 SDK 内部自动回连接口。升级完成后设备可能短暂断开重连,App 不应立即判定失败。
- 重复序列号容错:v2.4.0 增加对重复序列号的容错处理,避免设备与 SDK 因丢包重发导致的状态错乱。
- 特殊空间复用升级:v2.4.0 增加特殊空间复用的升级支持。
- 对象管理容错:v2.3.1 增加 OTA 对象的对象管理容错,防止异常释放导致崩溃。
- 升级错误回调:v2.3.1 起
otaUpgradeResult提供错误码,建议在集成期打印完整错误码并对照 SDK 文档排查。 - 并发注意:一次升级会话对应一台设备,App 应在收到
noteEntityDisconnected前避免重复发起cmdOTAData;多个设备并行升级场景需按设备实例分别管理委托回调。
调试与验证清单
集成完成后,建议按以下顺序自检(来源:README.md 调试技巧):
- Xcode Console 中能看到 SDK 的蓝牙连接状态日志与数据交互日志;
Info.plist权限已生效(首次触发蓝牙时系统弹出权限对话框);- 设备扫描/连接成功,
noteEntityConnected被触发; cmdTargetFeature能返回设备能力;cmdOTAData后otaDataSend进度递增,最终收到otaUpgradeResult成功回调;- 断连场景下
noteEntityDisconnected被触发,回连/重试逻辑正常。
若日志无法定位问题,可导出 App 沙盒中的日志文件,参考官方 杰理 OTA 导出打印日志说明。
Related Links
- README.md(集成总览)
- 在线文档中心
- SDK 接入文档
- SDK 调试说明
- 示例工程:
code/MiniDemo/MiniSingleDemo/(原生 CoreBluetooth)、code/MiniDemo/JLBleKitOTADemo/(JL_BLEKit)、code/MiniDemo/JLAssistOTADemo/(JL_Assist 自定义) - 完整示例:
code/JL_OTA/