杰理 SDK 文档中心
首页
首页
  • SDK 框架库

    • JL_BLEKit 蓝牙通信核心
    • JL_AdvParse 广播包解析
    • JL_HashPair 加密配对
    • JL_OTALib 固件升级
    • JLDialUnit 彩屏仓与表盘控制
    • JLBmpConvertKit 位图转换
    • JLPackageResKit 资源包处理
    • JLLogHelper 日志工具
  • 核心功能模块

    • 音乐与媒体控制
    • 音效调节与均衡器
    • 设备发现、连接与设置
    • Auracast 广播接收与发射
    • 文件浏览、闹钟、FM 与灯光控制
    • ANC、按键设置与查找设备
    • AI 翻译与自定义命令
  • 应用架构与工程支撑

    • 杰理之家 App 架构与导航
    • 数据存储与缓存
    • Swift 工具与扩展层
    • JLAudioUnitKit 示例工程
    • SDKTestHelper 测试工具
  • 开发文档与资源

    • 文档中心与 JL_OTALib API 说明
    • 自定义蓝牙接入方式
    • 调试技巧与问题排查
    • 版本历史与社区支持

JLPackageResKit 资源包处理

JLPackageResKit(资源包处理库)是杰理 iOS SDK 中负责"资源包"(语音提示音包、WTS 音频文件、GIF bin 等)打包、解包与转换的预编译框架,供上层 App 完成设备提示音替换、提示音信息获取等操作。

Purpose and Scope

本页介绍 JLPackageResKit.xcframework 在仓库中的形态、集成方式、所承担的资源包处理职责,以及与之配套的典型使用流程(设备提示音替换、WTS 转码、GIF bin 打包)。

本页不包含以下内容(这些属于同级 SDK 框架的范畴,请参见各自页面):

  • 蓝牙连接与数据透传能力:由 JL_BLEKit 提供,JLPackageResKit 处理完的资源数据最终通过它下发到设备。
  • 固件升级:由 JL_OTALib 提供。
  • 日志辅助:由 JLLogHelper 提供。
  • 广告解析:由 JL_AdvParse 提供。

Overview

在杰理蓝牙音频设备(音箱、耳机、手表等)的使用场景中,设备端内置的提示音(如开机音、连接提示音)由固化资源决定。厂商或终端用户可以通过 App 将自定义音频资源"下发"到设备,从而替换设备提示音。这一能力需要完成几类资源文件处理:

  1. 音频转码(.WTS):将 PC/App 侧准备的 PCM 等音频格式转换为设备可识别的 .WTS 格式;
  2. 打包/解包:将提示音文件打包为设备可接收的资源包,或解析设备侧返回的提示音信息;
  3. 资源下发:把处理后的资源包通过蓝牙协议(由 JL_BLEKit 承担传输)写入设备 Flash;
  4. GIF bin 打包:为带屏幕设备(如 701N 芯片)生成屏幕显示所需的 bin 资源。

JLPackageResKit 正是承载上述"资源包处理"职责的预编译框架(xcframework)。仓库以闭源二进制形式提供该库,源代码与头文件不随仓库分发,因此本页对 API 的说明以官方文档索引与集成证据为准,并在文末标注了需要向厂商核实的内容。

Architecture

flowchart TD
    subgraph sg_App["App 层(JieLi_Home_Demo)"]
        VC["业务界面/控制器"]
        VM["提示音替换管理逻辑"]
    end

    subgraph sg_ResKit["JLPackageResKit.xcframework(资源包处理)"]
        PCM2WTS["PCM -> WTS 转码"]
        PKG["提示音打包 / 解包"]
        GIFBIN["GIF bin 打包(701N 等带屏芯片)"]
        VoicePkg["语音资源包管理"]
    end

    subgraph sg_BLE["JL_BLEKit.xcframework"]
        BLE["蓝牙连接与 RCSP 数据通道"]
    end

    subgraph sg_Device["蓝牙音频设备"]
        DEV["设备 Flash / 提示音资源"]
    end

    VC --> VM
    VM --> PCM2WTS
    VM --> PKG
    VM --> GIFBIN
    VM --> VoicePkg
    PCM2WTS --> PKG
    PKG --> BLE
    VoicePkg --> BLE
    GIFBIN --> BLE
    BLE --> DEV

架构要点:

  • 输入:App 侧的资源文件(音频、GIF)与设备侧回传的提示音信息;
  • 处理:JLPackageResKit 完成格式转换、打包/解包与资源包管理;
  • 输出:可直接经 JL_BLEKit 传输给设备的二进制数据;
  • 边界:资源包处理与蓝牙传输解耦——处理库不关心 BLE 连接细节,传输库不关心资源格式。

框架形态与集成

仓库中的分布

JLPackageResKit 以 xcframework 形式存放在仓库 libs/ 目录下,与 JL_BLEKit、JL_OTALib、JLLogHelper、JL_AdvParse、JLBmpConvertKit、JL_HashPair 等同级。README 中的目录说明将其标注为"资源包处理库":

Source: README.md

├── JLPackageResKit.xcframework     # 资源包处理库

xcframework 结构

libs/JLPackageResKit.xcframework/Info.plist 描述了两个平台分片,每个分片的二进制路径均为 JLPackageResKit.framework/JLPackageResKit,库路径为 JLPackageResKit.framework:

Source: libs/JLPackageResKit.xcframework/Info.plist

<key>BinaryPath</key>
<string>JLPackageResKit.framework/JLPackageResKit</string>
<key>LibraryIdentifier</key>
...
<key>LibraryPath</key>
<string>JLPackageResKit.framework</string>
<key>SupportedArchitectures</key>

即该库同时包含设备端与模拟器端的二进制分片(由 LibraryIdentifier 与 SupportedArchitectures 区分),App 打包时 Xcode 会根据目标平台自动选择对应分片。由于是预编译二进制,仓库内不包含源码;具体分片架构列表需以 Info.plist 中 SupportedArchitectures 的实际内容为准。

Demo 工程中的链接方式

JieLi_Home_Demo(JLPiHome 工程)同时把 JLPackageResKit.xcframework 加入 Frameworks(Required)与 Embed Frameworks(CodeSignOnCopy)构建阶段,与 JL_BLEKit、JLBmpConvertKit 等库一并嵌入 App:

Source: code/JieLi_Home_Demo/JLPiHome.xcodeproj/project.pbxproj

3AA32EC35871C869A13CF107 /* JLPackageResKit.xcframework in Frameworks */ = {
    isa = PBXBuildFile;
    fileRef = 65EC51C7D3D4F97A0F651DE2 /* JLPackageResKit.xcframework */;
    settings = {ATTRIBUTES = (Required, ); };
};

同时,工程在 Embed Frameworks 阶段以 CodeSignOnCopy 属性将该框架拷贝进 App 包(参见 project.pbxproj)。这意味着集成时除了"链接"还必须"嵌入",否则运行时将因找不到动态库而崩溃——这是所有 SDK 动态框架通用的集成要求。

核心能力:设备提示音替换

官方开发文档"功能模块说明"中与资源包处理直接对应的章节是 2.16 设备提示音替换,其中明确了该能力由以下几部分组成:

能力说明
音频文件转码 .WTS将 App 侧音频转码为设备可识别的 .WTS 格式
打包/解包音频文件把提示音文件打包成资源包,或解包设备返回的提示音资源
获取设备的提示音信息读取设备当前提示音的类型、数量、状态等信息
替换设备的提示音将新提示音写入设备并生效

从文档检索索引中可以还原出该库暴露的关键类与回调类型(这些符号即 JLPackageResKit 的对外 API 表面):

  • JLVoicePackageManager —— 语音(提示音)资源包管理器,负责资源包的整体处理流程;
  • JLVoiceReplaceInfo —— 提示音替换信息模型(设备现有提示音的描述);
  • JLTipsVoiceBlock —— 提示音相关异步回调 Block 类型;
  • JLToneCfgModel —— 提示音(tone)配置模型;
  • JLPcmToWts / Pcm2Wts —— PCM 到 WTS 的转码入口,配套 WtsResultBlock 回调与 wtsPath 输出路径;
  • JLGifBin / JLGifBinChipJL_701N —— 面向 701N 等带屏芯片的 GIF bin 打包。

注意:上述类名、方法名取自仓库内文档检索索引(docs/html/searchindex.js 中的索引词条,如 jlvoicepackagemanag、jlpcmtowt、jlgifbin、jlgifbinchipjl_701n)。由于框架以二进制分发、头文件不在仓库内,确切的接口签名、枚举值与参数类型须以集成时 framework 自带的头文件为准。

工作流程解析

提示音替换端到端流程

一次完整的提示音替换,其数据流如下:

sequenceDiagram
    participant APP as App 业务层
    participant RK as JLPackageResKit
    participant BLE as JL_BLEKit
    participant DEV as 蓝牙设备

    APP->>RK: 转码音频为 .WTS(Pcm2Wts / WtsResultBlock)
    RK-->>APP: 返回 WTS 文件路径
    APP->>RK: 打包提示音资源包(JLVoicePackageManager)
    RK-->>APP: 返回可下发的资源数据
    APP->>BLE: 下发资源包到设备
    BLE->>DEV: RCSP 数据传输
    DEV-->>BLE: 传输结果
    BLE-->>APP: 替换结果回调
    APP->>RK: 获取设备提示音信息(JLVoiceReplaceInfo)
    RK->>BLE: 查询当前提示音配置
    BLE-->>RK: 设备返回提示音信息
    RK-->>APP: 解析后的提示音信息模型

设计意图:转码 → 打包 → 传输 → 回读 四个阶段被明确分层。JLPackageResKit 只负责前两个阶段(本地资源处理)和最后一个阶段的数据解析,中间传输完全委托给 JL_BLEKit。这样既保证了资源格式与设备兼容性的内聚,也避免了资源库与蓝牙库的循环依赖。

语音资源包处理管线

flowchart LR
    SRC["音频源文件<br/>(WAV/PCM)"] --> WTS["WTS 转码<br/>JLPcmToWts"]
    WTS --> PK["打包<br/>JLVoicePackageManager"]
    PK --> DB["资源包数据"]
    DB --> BLE["JL_BLEKit 下发"]
    GIF["GIF 素材"] --> GB["GIF bin 打包<br/>JLGifBin/701N"]
    GB --> BLE
    BLE --> DEV["设备 Flash"]

该管线体现了资源库的两个典型输入分支:音频分支(提示音替换)与 图像分支(带屏设备的 GIF bin),两者最终都汇入蓝牙传输通道。这种设计让上层 App 面对统一的下发接口,无需关心资源格式差异。

集成与使用示例

示例 1:工程链接配置(Xcode 工程文件)

以下是 Demo 工程将 JLPackageResKit.xcframework 加入 Frameworks 构建阶段的真实配置片段:

Source: code/JieLi_Home_Demo/JLPiHome.xcodeproj/project.pbxproj

E6C10ECF982098DA65415D17 /* JLPackageResKit.xcframework in Frameworks */ = {
    isa = PBXBuildFile;
    fileRef = 65EC51C7D3D4F97A0F651DE2 /* JLPackageResKit.xcframework */;
    settings = {ATTRIBUTES = (Required, ); };
};

示例 2:框架二进制声明(Info.plist)

xcframework 清单文件声明了框架二进制与分片信息:

Source: libs/JLPackageResKit.xcframework/Info.plist

<key>BinaryPath</key>
<string>JLPackageResKit.framework/JLPackageResKit</string>
<key>LibraryIdentifier</key>
...
<key>LibraryPath</key>
<string>JLPackageResKit.framework</string>
<key>SupportedArchitectures</key>

说明:以上两个示例展示的是"如何集成该库",而"如何调用该库"的 Swift/Objective-C 代码示例需要 framework 头文件,仓库内未随源码提供,此处不做虚构。可向杰理厂商索取 JLPackageResKit.framework 内头文件(JLVoicePackageManager.h、JLPcmToWts.h 等)后按头文件声明调用。

API Reference(基于文档索引,需以头文件为准)

以下接口符号从官方文档检索索引(docs/html/searchindex.js)中确认存在,但签名细节不在仓库源码中,标注为"待头文件核实"。

JLVoicePackageManager

  • 职责:语音(提示音)资源包管理器,负责资源包打包、解包与提示音替换流程。
  • 已知相关类型:JLVoiceReplaceInfo(提示音替换信息)、JLTipsVoiceBlock(异步回调 Block)。
  • 典型用途:获取设备提示音信息、打包替换资源。
  • 签名状态:待头文件核实。

JLPcmToWts(转码入口,索引词:pcm2wts / towt / wtspath / wtsresultblock)

  • 职责:将 PCM 音频转码为设备提示音使用的 .WTS 格式。
  • 已知参数/输出:输入 PCM 数据/路径,输出 wtsPath(.WTS 文件路径),结果经 WtsResultBlock 回调。
  • 签名状态:待头文件核实。

JLGifBin / JLGifBinChipJL_701N(索引词:jlgifbin / jlgifbinchipjl_701n)

  • 职责:面向带屏芯片(如 701N)的 GIF bin 资源打包,生成设备屏幕可用的 bin 文件。
  • 签名状态:待头文件核实。

JLToneCfgModel(索引词:jltonecfgmodel)

  • 职责:提示音(tone)配置模型,描述设备当前提示音配置(类型/数量/状态)。
  • 签名状态:待头文件核实。

核实建议:集成时在 Xcode 中 import JLPackageResKit 后,跳转到对应头文件即可获得精确的方法签名、枚举与 Block 定义;本文档不臆造签名。

Configuration Options

该库为预编译框架,仓库内没有可编辑的配置文件或 Info.plist 自定义键。可配置项全部体现在框架自身清单文件与宿主工程中:

配置项类型默认值说明
Frameworks 构建阶段构建配置RequiredDemo 工程将框架标记为 Required(必选链接)
Embed Frameworks构建配置CodeSignOnCopy框架需嵌入 App 包并签名,否则动态加载失败
SupportedArchitecturesxcframework 元数据由厂商发布时指定决定 device/simulator 各分片可用的 CPU 架构
转码输出路径(wtsPath)运行时参数由调用方指定.WTS 文件生成的目标路径

Failure Modes、边界情况与并发

以下条目基于该库的架构角色(二进制闭源框架 + 异步回调 + 文件处理)推导,属于集成时必须自行验证的风险点:

  • 缺少嵌入导致运行时崩溃:只链接不嵌入(缺少 Embed Frameworks 的 CodeSignOnCopy)时,App 启动会因找不到动态库而崩溃。Demo 工程同时配置了 Frameworks 与 Embed Frameworks 两个阶段,集成时应保持二者一致。
  • 架构分片不匹配:若宿主工程包含模拟器/真机之外的架构,或 xcframework 分片缺失,链接期/运行期会报架构错误;应使用 lipo -info 或直接查看 Info.plist 的 SupportedArchitectures 确认。
  • 转码失败与回调缺失:PCM 转 WTS 属于本地文件密集型操作,输入音频格式不符或路径不可写时可能失败。WtsResultBlock 为异步回调,须在主线程更新 UI,并做好失败分支(转码失败不应进入下发流程)。
  • 并发与线程:资源打包、转码应在后台队列执行,避免阻塞主线程;回调 Block 的线程约定(主线程还是内部队列)需在头文件中确认,不要在未确认前假设。
  • 资源包与设备版本兼容性:提示音资源包与设备固件版本、芯片型号相关(如 GIF bin 区分 701N 等芯片),错误型号的资源包可能导致设备侧写入失败或显示异常。
  • 传输中断:资源包下发依赖 JL_BLEKit 的 RCSP 通道,蓝牙断开会造成传输中断;JLVoicePackageManager 是否具备断点续传/重试,需以头文件与厂商说明为准。

Performance 与运维建议

  • 转码与打包属于 CPU/IO 密集操作,建议在 App 后台队列执行并监听 App 进入后台的通知,必要时取消未完成的任务。
  • WTS 与 GIF bin 文件体积较大时,注意沙盒磁盘占用;转码产物可存放于 Caches 目录并在替换完成后清理。
  • 框架为闭源二进制,出现异常时优先收集日志(可配合 JLLogHelper)并联系杰理厂商获取支持;仓库中不存在该库的单元测试源码,因此无法在本页提供测试覆盖说明。

Extension Points

  • 资源格式扩展:新增提示音格式时,只需在调用侧增加"转码 → 打包"映射,JLPackageResKit 对外接口保持不变——这是"处理库与传输库解耦"带来的扩展收益。
  • 多设备/多芯片适配:GIF bin 按芯片型号(JLGifBinChipJL_701N)区分,扩展新芯片时按同样模式新增对应 bin 打包入口即可。
  • 与 JL_BLEKit 的组合:资源包处理结果(NSData/文件路径)可作为通用输入交给蓝牙层,因此可复用现有的自定义命令、OTA 等既有通道,无需修改资源库。

Related Links

  • README.md(SDK 目录结构说明)
  • libs/JLPackageResKit.xcframework/Info.plist(框架清单)
  • JLPiHome.xcodeproj/project.pbxproj(Demo 集成配置)
  • 官方文档"功能模块说明"中的 2.16 设备提示音替换 章节(WTS 转码、打包/解包、获取与替换提示音)
  • 相关框架页面:JL_BLEKit(蓝牙数据通道)、JL_OTALib(固件升级)、JLLogHelper(日志辅助)、JL_AdvParse(广告解析)
Prev
JLBmpConvertKit 位图转换
Next
JLLogHelper 日志工具