杰理 SDK 文档中心
首页
首页
  • 概述与快速开始

    • 仓库概览
    • 运行环境与 SDK 集成
    • 工程结构与目录导航
  • 核心 SDK 架构

    • SDK 库体系与模块划分
    • 蓝牙连接与 RCSP 协议
    • 广播包解析与设备认证
    • 日志助手与调试支持
  • 设备功能模块

    • OTA 固件升级
    • 表盘管理与自定义表盘
    • 图像转换工具
    • 资源打包
    • 音频编解码
    • 健康与运动数据同步
    • 消息通知与实用设备功能
  • 宜动健康示例应用

    • 应用架构与页面导航
    • 健康界面与数据可视化
    • 设备连接与数据同步
    • 登录注册与用户中心
    • AI 云服务与语音交互
    • 本地数据库与持久化
    • 多语言国际化
  • 测试与调试

    • SDKTestHelper 功能测试工具
    • 音频编解码示例工程
    • 调试技巧与问题排查
  • 文档与资源

    • 在线文档与版本历史
    • 第三方框架与依赖管理

调试技巧与问题排查

本文介绍杰理健康 SDK(iOS-JL_Health)的调试体系与问题排查方法,涵盖日志助手库 JLLogHelper 的使用、Xcode 调试工具链、蓝牙连接与数据交互的调试手段,以及常见问题的定位与解决流程。

目的与范围

本页面向集成杰理健康 SDK 的开发者,系统讲解:

  • SDK 内置的日志体系(JLLogHelper.xcframework)及其在调试中的角色
  • 使用 Xcode Console、系统日志查看蓝牙连接状态与数据交互的方法
  • 从"设备扫描 → 连接 → 认证 → 功能调用 → 数据回调"全链路的调试切入点
  • 常见问题(扫描不到设备、连接失败、数据不同步、OTA 异常等)的排查思路

以下主题属于其他页面,本页不做展开:

  • OTA 升级流程细节:见 OTA 升级相关页面
  • 音频编解码调试:JLAudioUnitKit 的接口与回调见音频编解码文档
  • 表盘定制与图片转码:见表盘管理相关页面
  • SDK 集成与权限配置:见集成指南页面

概述

杰理健康 SDK 是专为杰理蓝牙穿戴类产品(智能手表、健康手环、智能徽章等)提供的功能集成开发平台,支持 OTA 升级、表盘管理、健康/运动数据、消息同步、天气、文件传输等能力。其核心交互链路为:设备连接 → 协议交互 → 功能调用 → 数据回调,所有功能都建立在蓝牙 BLE 链路之上,因此日志与链路状态分析是调试的重中之重。

SDK 提供了三方面调试支撑:

  1. 日志助手库 JLLogHelper.xcframework:SDK 的"日志中枢",提供详细的日志输出与存储控制能力,日志中可查看蓝牙连接状态与数据交互内容;
  2. 标准 iOS 调试工具链:Xcode Console 查看器可查看实时日志,配合断点、LLDB 进行问题定位;
  3. 在线文档中心:杰理文档中心提供开发说明、OTA 开发说明、自定义蓝牙接入方式等参考,帮助理解协议行为。

关键术语:

术语说明
RCSP 协议杰理设备通信协议,SDK 通过该协议与芯片(AC701N、AC707N、AC695N 等)交互
JLLogHelper日志助手库,控制 SDK 日志的输出与存储
XCFrameworkSDK 的二进制分发格式,需在 Xcode 中设置 Embed & Sign

架构

下图展示了 SDK 调试体系的整体架构,从集成 App 到设备端的日志与调试链路:

flowchart TD
    subgraph sg_App["应用层 (集成 App)"]
        App["iOS 应用<br/>(宜动健康 / SDKTestHelper)"]
        Xcode["Xcode Console / LLDB 断点"]
    end

    subgraph sg_SDK["SDK 层 (libs/)"]
        JLLogHelper["JLLogHelper.xcframework<br/>日志助手库"]
        BLEKit["JL_BLEKit.xcframework<br/>主业务库 / 基础协议"]
        OTALib["JL_OTALib.xcframework<br/>OTA 升级"]
        AdvParse["JL_AdvParse.xcframework<br/>广播包解析"]
        HashPair["JL_HashPair.xcframework<br/>设备认证"]
    end

    subgraph sg_Tools["调试工具与资料"]
        Console["日志输出 / 日志文件"]
        Docs["杰理文档中心<br/>开发说明 / OTA 说明"]
    end

    subgraph sg_Device["设备层"]
        Device["杰理穿戴设备<br/>(AC701N / AC707N / AC695N)"]
    end

    App --> BLEKit
    App --> OTALib
    App --> AdvParse
    App --> HashPair
    App --> JLLogHelper
    BLEKit --> JLLogHelper
    OTALib --> JLLogHelper
    JLLogHelper --> Console
    Xcode --> Console
    BLEKit -->|"BLE / RCSP 协议"| Device
    Docs -.->|"协议与接入参考"| App

架构说明:

  • JLLogHelper 处于调试链路的核心位置:各业务库(JL_BLEKit、JL_OTALib 等)在运行时产生的日志统一汇入日志助手库,由它控制输出与存储,开发者通过 Xcode Console 或日志文件查看;
  • 蓝牙链路是调试的主战场:扫描依赖 JL_AdvParse 解析广播包,连接与协议交互依赖 JL_BLEKit,设备认证依赖 JL_HashPair——任何一环异常都会在日志中留下痕迹;
  • 文档中心是排查的"知识底座":理解 RCSP 协议行为与接入方式,才能正确解读日志内容。

日志体系与调试机制

JLLogHelper 日志助手库

JLLogHelper.xcframework 是 SDK 的日志助手库,被列为必须导入的库之一,与 JL_AdvParse、JL_BLEKit、JL_HashPair 并列。其作用在 README 的日志管理一节中有明确说明:

JLLogHelper.xcframework 提供了日志管理功能,可通过相关接口控制日志输出和存储。

这意味着 SDK 的所有业务库(蓝牙连接、协议交互、OTA 等)产生的日志都经过日志助手库统一管理,开发者可以通过其接口完成:

  • 控制日志输出:决定日志是否打印、打印到控制台还是写入文件;
  • 控制日志存储:管理日志文件的位置、大小与保留策略;
  • 查看连接与交互明细:日志中包含蓝牙连接状态变化与数据交互内容,是定位问题的第一手资料。

日志输出与查看

SDK 调试章节明确给出了两条基础调试手段:

  • 日志输出:SDK 提供详细的日志输出,可通过日志查看蓝牙连接状态和数据交互;
  • 设备调试:使用 Xcode 的 Console 查看器查看实时日志。

对应的调试流程为:

  1. 使用 Xcode 打开示例工程(如 code/JL_Health/ 宜动健康源码);
  2. 将真机连接至 Mac,运行 App;
  3. 打开 Xcode 的 Console 查看器(或使用系统控制台 App),过滤关键字(如设备名、BLE、RCSP 等);
  4. 观察蓝牙扫描、连接、认证、数据同步各阶段的日志输出;
  5. 结合断点与 LLDB 在关键回调处暂停,检查数据内容。

蓝牙连接状态调试

蓝牙连接是 SDK 一切功能的前提。调试时应关注以下阶段在日志中的表现:

阶段依赖库日志关注点异常征兆
广播扫描JL_AdvParse广播包解析结果、设备名/信号强度无设备列表、广播包解析失败
连接建立JL_BLEKit连接成功/失败回调、连接参数连接超时、频繁断开
设备认证JL_HashPair认证结果、配对状态认证失败、无法进入功能交互
协议交互JL_BLEKitRCSP 命令收发、ACK 应答命令无响应、数据不完整

数据交互调试

健康数据、消息、文件传输等业务均通过 RCSP 协议在蓝牙链路上交互。调试数据不同步问题时,应重点核对日志中的:

  • 命令下发与应答:SDK 发出的命令是否收到设备 ACK;
  • 数据分段与重组:大文件传输(如音乐文件、OTA 固件)的分包序号是否连续;
  • 回调触发:数据回调是否按预期到达业务层(参考各业务库的代理/回调协议)。

核心调试流程

下图描述了从设备扫描到问题定位的完整调试时序,展示了 SDK 各库在链路中的协作关系:

sequenceDiagram
    participant Dev as 开发者 / Xcode
    participant App as 集成 App
    participant Adv as JL_AdvParse
    participant BLE as JL_BLEKit
    participant Hash as JL_HashPair
    participant Log as JLLogHelper
    participant Device as 杰理设备

    Dev->>App: 启动 App(开启蓝牙权限)
    App->>BLE: 开始扫描
    BLE->>Adv: 请求解析广播包
    Adv-->>BLE: 设备信息(名称/信号)
    BLE-->>App: 设备列表回调
    Dev->>App: 选择设备发起连接
    App->>BLE: connect
    BLE->>Device: BLE 连接
    Device-->>BLE: 连接成功
    BLE->>Hash: 设备认证
    Hash-->>BLE: 认证结果
    BLE-->>App: 连接状态回调
    App->>BLE: 功能调用(读健康数据等)
    BLE->>Device: RCSP 命令
    Device-->>BLE: 数据应答
    BLE-->>App: 数据回调
    App->>Log: 输出/存储日志
    Dev->>Log: 查看实时日志定位问题

流程要点:

  • 扫描、连接、认证三个阶段依次串行,任一阶段失败都会阻塞后续功能,日志中会留下明确的状态标记;
  • 功能调用采用"命令下发 → 数据回调"的异步模式,调试时需确认回调确实到达业务层;
  • 全程日志统一汇入 JLLogHelper,开发者无需逐个库打点,在 Xcode Console 中即可完成全链路观察。

常见问题排查

扫描不到设备

现象:设备列表为空,或反复扫描无结果。

排查步骤:

  1. 确认 Info.plist 已配置蓝牙权限(见下文"使用示例"),权限缺失时系统不会返回扫描结果;
  2. 确认设备处于可被发现状态(可广播状态);
  3. 查看日志中 JL_AdvParse 的广播包解析输出,确认设备广播是否被识别;
  4. 确认设备芯片型号(AC701N、AC707N、AC695N 等)在 SDK 支持范围内。

连接失败 / 频繁断开

现象:点击连接后超时,或连接建立后很快断开。

排查步骤:

  1. 查看 JLLogHelper 输出的连接状态变化日志,确认失败发生在哪一阶段(连接建立 / 认证 / 交互);
  2. 若认证阶段失败,检查 JL_HashPair 相关日志与设备配对状态;
  3. 检查蓝牙信号强度,避免距离过远或干扰;
  4. 确认 App 未在后台被系统挂起导致链路断开。

数据不同步

现象:健康数据、消息或文件传输不完整、不更新。

排查步骤:

  1. 核对日志中 RCSP 命令下发与设备 ACK 应答是否成对出现;
  2. 对大文件传输(音乐、OTA 固件、表盘文件)检查分包序号是否连续;
  3. 确认业务回调协议是否正确实现(以对应业务库的代理协议为准);
  4. 结合文档中心的开发说明确认协议字段定义。

OTA 升级失败

现象:固件升级进度停滞、校验失败或升级后设备异常。

排查步骤:

  1. 确认 JL_OTALib.xcframework 已正确导入并完成 Embed & Sign;
  2. 查看 OTA 日志中的传输进度与校验结果;
  3. 确认升级期间蓝牙链路稳定(避免中断导致设备变砖);
  4. OTA 流程细节参考杰理 OTA 升级(iOS)开发说明。

权限与配置类问题

现象:SDK 初始化异常、功能无响应。

排查步骤:

  1. 核对是否导入了全部必须导入的库:JL_AdvParse、JL_BLEKit、JL_HashPair、JLLogHelper;
  2. 核对 Info.plist 蓝牙权限描述是否完整;
  3. 核对 Xcode 中 XCFramework 是否设置了 Embed & Sign。

以下流程图概括了连接类问题的一般排查路径:

flowchart TD
    Start([问题:无法连接/功能异常]) --> P1{"有蓝牙权限描述?"}
    P1 -->|"否"| F1["在 Info.plist 添加<br/>NSBluetoothAlwaysUsageDescription"]
    P1 -->|"是"| P2{"日志中有设备广播?"}
    P2 -->|"否"| F2["确认设备可被发现<br/>检查 JL_AdvParse 解析日志"]
    P2 -->|"是"| P3{"连接成功?"}
    P3 -->|"否"| F3["检查连接超时/信号强度<br/>查看连接阶段日志"]
    P3 -->|"是"| P4{"认证通过?"}
    P4 -->|"否"| F4["检查 JL_HashPair 认证日志<br/>确认设备配对状态"]
    P4 -->|"是"| P5{"功能回调正常?"}
    P5 -->|"否"| F5["核对 RCSP 命令/ACK<br/>确认业务回调实现"]
    P5 -->|"是"| OK["链路正常<br/>结合文档中心进一步分析"]
    F1 --> P2
    F2 --> P3
    F3 --> P4
    F4 --> P5
    F5 --> OK

使用示例

蓝牙权限配置(排查问题的前提)

蓝牙权限缺失是最常见的"连接异常"根因。仓库 README 给出了标准的 Info.plist 配置,调试前请确保以下键存在且描述准确:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要使用蓝牙功能连接杰理设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要作为蓝牙外设连接杰理设备</string>

来源:README.md

业务回调协议示例(数据交互调试参考)

SDK 各业务库采用代理/回调协议向业务层返回结果。以 JLAudioUnitKit 的音频播放器为例,代理协议定义了进度、完成与失败三类回调——调试数据交互问题时,应确认回调是否触发、参数是否符合预期:

@optional
- (void)audioPlayer:(JLAudioUnitPlayer *)player didUpdateProgress:(NSTimeInterval)currentTime duration:(NSTimeInterval)duration;
- (void)audioPlayerDidFinishPlaying:(JLAudioUnitPlayer *)player;
- (void)audioPlayer:(JLAudioUnitPlayer *)player didFailWithError:(NSError *)error;

来源:JLAudioUnitKit Doc.md

调试要点:didFailWithError: 回调携带的 NSError 是定位失败原因的直接线索;didUpdateProgress: 长时间不回调则说明数据流中断,应回头检查输入数据源。

音频解码接口示例(判断数据链路是否正常)

以 Opus 解码器为例,其流式解码接口按段输入数据、通过代理回传 PCM——如果输入数据不断而回调无输出,问题往往出在编码参数或数据分段上:

// 初始化
- (instancetype)initDecoder:(JLOpusFormat *)format delegate:(id<JLOpusDecoderDelegate>)delegate;

// 输入 Opus 数据(流式)
- (void)opusDecoderInputData:(NSData *)data;

// 释放资源
- (void)opusOnRelease;

来源:JLAudioUnitKit Doc.md

配置选项

配置项类型默认值说明
NSBluetoothAlwaysUsageDescriptionInfo.plist 键无(必填)蓝牙使用权限描述,缺失时无法扫描/连接设备
NSBluetoothPeripheralUsageDescriptionInfo.plist 键无(必填)蓝牙外设权限描述(iOS 10 及以下兼容)
JLLogHelper 日志输出接口控制SDK 默认输出通过日志助手库接口控制日志是否打印
JLLogHelper 日志存储接口控制SDK 默认存储通过日志助手库接口控制日志文件存储策略
XCFramework EmbedXcode 构建设置需手动设置所有导入的 XCFramework 需设置 Embed & Sign

失败模式、边界情况与并发

失败模式

失败模式触发场景日志特征建议处置
权限缺失Info.plist 未配置蓝牙描述无扫描结果、系统权限弹窗不出现补齐权限描述并重新安装 App
广播解析失败非杰理设备或广播格式异常JL_AdvParse 无输出/解析错误确认设备型号受支持
连接超时设备不在广播状态或信号弱连接阶段日志停滞重新让设备进入可发现状态
认证失败设备已与其他手机配对JL_HashPair 返回失败解除旧配对后重试
命令无 ACK设备端异常或协议不匹配RCSP 命令无应答日志对照文档中心核对命令格式
回调缺失业务代理未实现/未设置功能调用后无回调日志检查代理赋值与协议方法实现

边界情况与并发

  • 蓝牙状态变化:系统蓝牙开关、飞行模式、后台挂起都会中断链路,调试时需在日志中区分"App 主动断开"与"系统级断开";
  • 异步回调线程:SDK 业务回调可能不在主线程触发(如 JLAudioUnitKit 支持自定义 callBackQueue),UI 更新需自行切换到主线程,否则会出现偶发崩溃——这是"日志正常但界面异常"类问题的常见根因;
  • 大文件传输并发:音乐、OTA 固件等大文件传输与健康数据同步可能并发执行,调试时注意日志中的分包序号是否相互干扰;
  • 重连竞态:连接断开后的自动重连逻辑可能与用户手动操作竞争,避免在回调中重复发起连接。

性能与运维注意事项

  • 日志量控制:SDK 全链路日志量较大,发布版本应通过 JLLogHelper 接口关闭或降级日志输出,避免 IO 开销与隐私泄露;调试版本保留完整日志;
  • 真机调试优先:蓝牙功能依赖真实硬件,模拟器无法完整验证扫描/连接行为,调试应使用真机;
  • 日志留档:复现问题时建议导出日志文件并连同设备型号、SDK 版本、iOS 版本一并提交,便于杰理技术支持快速定位;
  • 版本对齐:Xcode 14.0+ 与 iOS 10.0+ 为最低要求,升级 Xcode 后注意 XCFramework 的签名与 Embed 设置是否保持。

扩展点

  • 自定义命令:SDK 支持客户拓展功能(自定义命令),调试时可在日志中观察自定义命令的收发是否符合预期;
  • 业务回调协议:各业务库通过代理/回调协议暴露结果,开发者可在回调中追加自己的日志打点,与 SDK 日志互补定位问题;
  • 日志助手库接口:JLLogHelper 提供日志输出与存储控制接口,可扩展接入第三方日志平台(如上传崩溃日志、远程日志收集)。

相关链接

  • README.md(调试技巧章节)
  • README_EN.md(Debugging Tips 章节)
  • README.md(工程结构与配置说明)
  • JLAudioUnitKit 开发接口说明
  • JLPackageResKit 文档
  • 杰理文档中心(开发说明 / OTA 说明)
Prev
音频编解码示例工程