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

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

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

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

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

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

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

消息通知与实用设备功能

本文档面向 iOS JL_Health(杰理健康)App 中"消息通知与实用设备功能"这一能力域,介绍其模块边界、层次结构、典型数据流与相关源码入口,帮助开发者快速定位通知播报、提示音播放、设备子功能管理等能力的实现位置。

Purpose and Scope

本页覆盖与"消息通知与实用设备功能"相关的能力:

  • 实用工具层:JLAudioToolbox/AudioManager(音频/提示音管理)、AutoProductIcon(自动产品图标);
  • 设备子功能视图模型:DeviceSubViewModel(设备功能项的组织与状态管理入口);
  • 基础视图控制器:BaseViewController(各页面共用的基类,承载通用生命周期与导航逻辑);
  • AI 助手能力(AIKIT.framework):作为通知播报、语音合成等能力的底层框架,包含 AiHelper、AIKITAudioBuilder、AIKITDataBuilder、ChatParam 等头文件;
  • 配套网络层:httpClient/DialMarketHttp 与 Model/ProductInfoModel(设备/表盘相关数据请求)。

以下主题属于兄弟页面,不在本页展开:

  • 表盘市场完整业务流程(选购、付费、历史记录)——见 表盘市场(Dial Market) 相关页面;
  • ICP 备案 WebView 页面详情——见 WebView 页面 相关页面;
  • AI 对话能力本身的协议与数据模型——见 AIKIT 集成 相关页面。

说明:本页撰写过程中受源码调研预算限制,部分实现细节(具体方法签名、回调链)未能在本轮读取到完整源码,相关位置已如实标注为"实现细节待确认",并给出对应文件链接供进一步查阅。

Overview

JL_Health 是杰理科技面向智能穿戴设备(手环/手表)的健康管理 App。在 MVC 架构下,代码集中在 code/JL_Health/JieliJianKang/ 目录,按 ViewControllers(视图层)、ViewModels(视图模型层)、Utilities(实用工具层)、httpClient(网络层)分包组织。

"消息通知与实用设备功能"横跨其中的多个层次:

  1. 实用设备功能:指与设备相关的辅助能力,如提示音播放(JLAudioToolbox)、产品图标自动识别(AutoProductIcon)、设备子功能组织(DeviceSubViewModel)。
  2. 消息通知:在仓库中以两种载体存在——一是通过 JLAudioToolbox/AudioManager 播放的提示音/通知音;二是通过 AIKIT.framework 提供的 AI 助手语音能力(AIKITAudioBuilder 负责音频构建、AiHelper 负责助手调用),可服务于通知的语音播报场景。
  3. 配套基础设施:BaseViewController 提供统一页面基类;DialMarketHttp 提供表盘/设备数据的 HTTP 请求能力。

关键概念

概念说明来源载体
提示音/通知音设备事件触发的音频反馈,由 AudioManager 统一管理Utilities/JLAudioToolbox/AudioManager.swift
设备子功能设备能力项的视图模型封装ViewModels/DeviceSubViewModel.swift
AI 助手播报通过 AIKIT 的音频/数据构建器生成并播报内容AIKIT.framework/Headers/*.h
自动产品图标根据产品信息自动匹配图标Utilities/AutoProductIcon/AutoProductIcon.swift

Architecture

下图基于仓库目录结构与文件命名归纳出本能力域的分层架构(箭头表示 MVC 分层下典型的依赖方向:视图 → 视图模型 → 工具/网络/AI)。

flowchart TD
    subgraph sg_UI["视图层 ViewControllers"]
        BaseVC["BaseViewController"]
        DialVC["DialViewController"]
        DialMarketVC["DialMarketViewController"]
        ICPVC["ICPViewController (WebView)"]
    end

    subgraph sg_VM["视图模型层 ViewModels"]
        DeviceSubVM["DeviceSubViewModel"]
        DialVM["DialViewModel 系列"]
    end

    subgraph sg_Util["实用工具层 Utilities"]
        AudioMgr["JLAudioToolbox / AudioManager"]
        AutoIcon["AutoProductIcon"]
    end

    subgraph sg_Net["网络层 httpClient"]
        DialHttp["DialMarketHttp"]
        ProdModel["ProductInfoModel"]
    end

    subgraph sg_AI["AI 助手能力 AIKIT.framework"]
        AiHelper["AiHelper"]
        AudioBuilder["AIKITAudioBuilder"]
        DataBuilder["AIKITDataBuilder"]
        ChatParam["ChatParam"]
    end

    BaseVC --> DeviceSubVM
    DeviceSubVM --> AudioMgr
    DeviceSubVM --> AutoIcon
    DialVC --> DialVM
    DialMarketVC --> DialHttp
    DialHttp --> ProdModel
    AudioMgr --> AiHelper
    AiHelper --> AudioBuilder
    AiHelper --> DataBuilder
    DataBuilder --> ChatParam

分层职责说明:

  • 视图层(ViewControllers):BaseViewController 是所有页面共用的基类,负责通用生命周期与页面基础行为;DialViewController/DialMarketViewController 等页面承载表盘相关交互;ICPViewController 承载 WebView 页面。该层是消息通知 UI 反馈的最终呈现者。
  • 视图模型层(ViewModels):DeviceSubViewModel 是设备子功能的状态与行为入口,向上服务于视图层,向下调用工具层;DialViewModel 系列(DialBaseViewModel、DialFreeViewModel、DialHistoryViewModel、DialPayViewModel、DialSubViewModel、DialVcViewModel)负责表盘业务的视图状态组织。
  • 实用工具层(Utilities):AudioManager 封装音频播放能力(提示音、通知音的底层实现载体);AutoProductIcon 提供产品图标自动匹配。该层是"实用设备功能"的直接实现者。
  • 网络层(httpClient):DialMarketHttp 封装 HTTP 请求,ProductInfoModel 定义产品信息数据模型,为设备/表盘功能提供数据支撑。
  • AI 助手能力(AIKIT.framework):以 framework 形式集成的 AI 助手 SDK,AiHelper/AiHelperMaker 为入口,AIKITAudioBuilder 负责音频内容构建,AIKITDataBuilder 与 ChatParam 负责对话数据组装,AIKITError 定义错误类型。该框架是通知语音播报、AI 对话等高级功能的底层依赖。

注:上图中 AudioMgr --> AiHelper 的依赖方向是基于模块职责的合理推断,具体调用链请查阅 AudioManager.swift 与 AIKIT 头文件确认。

核心模块分析

1. 实用工具层:JLAudioToolbox / AudioManager

文件:AudioManager.swift

JLAudioToolbox 是"实用设备功能"中与声音反馈直接相关的工具包,AudioManager 是其核心管理器。设计意图在于:将音频播放(提示音、通知音、语音播报)从业务代码中抽离,统一管理播放生命周期与资源释放,避免各页面各自持有音频会话导致的冲突(例如来电、后台、静音模式等场景下的会话打断问题)。

典型职责(基于模块命名与目录结构的推断,具体方法签名待读取源码确认):

  • 播放/停止提示音,支持单次与循环播放;
  • 管理音频会话(AVAudioSession)的激活与去激活;
  • 为设备事件(消息提醒、来电、闹钟等)提供统一的声音反馈入口。

该模块被 DeviceSubViewModel 等视图模型层模块引用,是"消息通知"能力在声音层面的实现底座。

2. 实用工具层:AutoProductIcon

文件:AutoProductIcon.swift

AutoProductIcon 提供"根据产品信息自动匹配/生成图标"的能力,属于设备实用功能的一部分。其设计意图是:当设备列表中出现新设备或未预置图标的产品时,无需人工维护图标映射,而是根据产品标识(如 PID、产品名)动态匹配图标资源,降低新增设备的适配成本。

3. 视图模型层:DeviceSubViewModel

文件:DeviceSubViewModel.swift

DeviceSubViewModel 是设备子功能(如消息通知开关、提醒设置等)的视图模型入口。在 MVC/MVVM 混合架构下,它承担:

  • 聚合设备子功能的展示状态(开关、选项、文案);
  • 将用户操作转发给底层(如调用 AudioManager 播放试听提示音);
  • 向视图层暴露可绑定的状态数据。

设计意图:把"设备能力项"从 ViewController 中剥离,使设备功能的增删改不侵入页面代码,同时便于在多个页面复用同一套设备功能状态(例如设置页与首页同时展示通知开关)。

4. 视图层:BaseViewController 与页面控制器

文件:

  • BaseViewController.swift
  • ICPViewController.swift

BaseViewController 为全 App 页面的基类,统一处理导航、返回、loading、错误提示等通用行为;通知相关的 UI 反馈(弹窗、Toast、声音)通常经由它提供的通用接口呈现。

ICPViewController 位于 WebViewControllers 目录,是承载 WebView 的页面控制器,用于展示 ICP 备案等合规内容页面。它的存在说明本能力域涉及"合规信息展示"这类实用功能。

5. AI 助手能力:AIKIT.framework

文件:code/JL_Health/AIKIT.framework/Headers/ 下的一组公开头文件:

头文件推测职责
AIKIT.h框架总入口,统一导出
AiHandle.h / AiHelper.h / AiHelperMaker.h助手句柄、助手对象与工厂方法
AIKITAudioBuilder.h音频内容构建(语音播报/通知播报的音频组装)
AIKITDataBuilder.h / AIKITDataModel.h / AIKITInputData.h请求数据的构建与模型定义
AIKITParameters.h / AIKITCustomData.h / AIKITCtxContent.h / AIKITUsrContext.h参数、自定义数据与上下文
ChatParam.h对话参数(聊天场景入参)
AIKITConstant.h / AIKITError.h常量与错误类型定义
AiAudioDefine.h音频相关枚举/宏定义

设计意图:AIKIT 以二进制 framework 形式集成,对外只暴露稳定头文件,业务方通过 AiHelper 获取助手实例,通过 AIKITAudioBuilder/AIKITDataBuilder 组装音频与数据后发起调用。对"消息通知"而言,AI 助手可承担语音播报(将通知内容合成为语音)的能力,是提示音之外的增强型通知手段。

6. 网络层:DialMarketHttp 与 ProductInfoModel

文件:

  • DialMarketHttp.swift
  • ProductInfoModel.swift

DialMarketHttp 封装表盘市场相关 HTTP 请求(列表、详情、下单等);ProductInfoModel 定义产品信息的 Codable 数据模型。设备实用功能(如表盘推送、设备信息同步)依赖该层获取服务端数据。DialMarketHttp.swift 的命名说明本仓库将网络请求集中到 httpClient 目录,属于轻量级网络封装,未依赖重型网络框架(具体实现待读取源码确认)。

7. 测试与辅助:UnitTester / DataTester

文件:DataTester.swift

仓库内置 UnitTester 目录(DataTester.swift),用于数据层自测,可在调试阶段验证网络解析与模型映射的正确性,属于工程自检基础设施。

核心流程

设备事件 → 通知反馈 的典型链路

下图展示"消息通知与实用设备功能"的端到端典型流程:设备事件如何最终转化为用户可感知的通知反馈(提示音 / AI 语音播报 / UI 更新)。

sequenceDiagram
    participant D as 穿戴设备 (手环/手表)
    participant VM as DeviceSubViewModel
    participant AM as JLAudioToolbox / AudioManager
    participant AI as AIKIT (AiHelper)
    participant UI as BaseViewController / 页面

    D-->>VM: 设备事件/消息到达 (BLE 回调)
    VM->>VM: 解析事件类型 (消息/提醒/闹钟)
    VM->>AM: 请求播放提示音或语音播报
    AM->>AI: 构建并合成音频 (AIKITAudioBuilder)
    AI-->>AM: 音频就绪/播放结果
    AM-->>VM: 播放完成回调
    VM-->>UI: 更新通知 UI 状态 (角标/弹窗/Toast)
    UI-->>D: 用户确认/交互反馈 (写回设备)

步骤说明:

  1. 事件入口:设备通过蓝牙回调把消息/提醒事件交给 DeviceSubViewModel(视图模型层是设备功能的统一入口);
  2. 类型解析:VM 区分事件类型(消息通知、闹钟、久坐提醒等),决定采用提示音还是 AI 语音播报;
  3. 音频播放:调用 AudioManager 播放提示音;如需语音播报则进一步调用 AIKIT 的 AiHelper 与 AIKITAudioBuilder 合成音频;
  4. 状态回写:播放完成或失败均回调 VM,由 VM 更新 UI 状态,保证界面与音频状态一致;
  5. 用户交互:用户在 UI 上的确认操作经 VM 写回设备,形成闭环。

注:以上为基于模块职责归纳的典型流程,具体回调签名与触发条件需结合 DeviceSubViewModel.swift、AudioManager.swift 与 AIKIT 头文件进一步确认。

AIKIT 内部对象关系

基于 AIKIT.framework 公开头文件的结构关系图:

classDiagram
    class AIKIT {
        <<framework 总入口>>
    }
    class AiHelper {
        <<AiHelper.h / AiHelperMaker.h>>
        +创建助手实例
    }
    class AiHandle {
        <<AiHandle.h>>
    }
    class AIKITAudioBuilder {
        <<AIKITAudioBuilder.h / AiAudioDefine.h>>
        +构建音频内容
    }
    class AIKITDataBuilder {
        <<AIKITDataBuilder.h / AIKITDataModel.h>>
        +组装请求数据
    }
    class ChatParam {
        <<ChatParam.h / AIKITParameters.h>>
    }
    class AIKITError {
        <<AIKITError.h>>
    }

    AIKIT --> AiHelper
    AiHelper --> AiHandle
    AiHelper --> AIKITAudioBuilder
    AiHelper --> AIKITDataBuilder
    AIKITDataBuilder --> ChatParam
    AiHelper ..> AIKITError : 错误上报

设计意图:AIKIT 将"助手对象"(AiHelper)、"音频构建"(AIKITAudioBuilder)、"数据构建"(AIKITDataBuilder)解耦为独立构建器,业务方按需组装,既保持入口单一(AiHelper),又允许灵活扩展输入类型(AIKITInputData、AIKITCustomData)。

数据与依赖关系

本能力域涉及的存储与数据载体:

数据载体归属模块
产品信息(图标匹配输入)ProductInfoModel(Codable 模型)httpClient
表盘市场请求/响应DialMarketHttp 封装的 HTTP 数据httpClient
AI 对话请求数据AIKITDataBuilder / AIKITDataModelAIKIT
音频内容AIKITAudioBuilder / AiAudioDefineAIKIT

数据流向:DialMarketHttp(网络)→ ProductInfoModel(解析)→ 视图模型(业务组织)→ 视图层(展示);音频侧:事件 → AudioManager → AIKIT(合成)→ 扬声器输出。

使用示例与代码引用

仓库结构快照(实证)

以下结构来自本仓库实际目录(code/JL_Health/JieliJianKang/),是本能力域相关源码的入口指引:

JieliJianKang/
├── ViewControllers/                  # 视图层
│   ├── BaseViewController.swift      # 页面基类(通用生命周期/通知 UI 反馈)
│   ├── DialMarket/                   # 表盘市场相关页面(兄弟主题)
│   └── WebViewControllers/
│       └── ICPViewController.swift   # WebView 页面(ICP 备案)
├── ViewModels/
│   ├── DeviceSubViewModel.swift      # 设备子功能视图模型(本主题核心)
│   └── DialViewModel/                # 表盘业务视图模型(兄弟主题)
├── Utilities/
│   ├── AutoProductIcon/
│   │   └── AutoProductIcon.swift     # 自动产品图标(实用功能)
│   └── JLAudioToolbox/
│       └── AudioManager.swift        # 音频/提示音管理(通知声音底座)
├── httpClient/
│   ├── DialMarketHttp.swift          # HTTP 请求封装
│   └── Model/ProductInfoModel.swift  # 产品信息模型
└── UnitTester/
    └── DataTester.swift              # 数据层自测

代码示例说明(诚实声明)

按"禁止臆造代码"的文档规范:本轮受源码调研预算限制,未能在本页给出经过逐行核实的 Swift 代码片段。以下入口文件均已链接至仓库真实路径,可点击直接查看实现:

  • 音频/通知播放实现:AudioManager.swift
  • 设备子功能视图模型:DeviceSubViewModel.swift
  • 自动产品图标:AutoProductIcon.swift
  • AI 助手框架公开接口:AIKIT.h、AiHelper.h、AIKITAudioBuilder.h

配置与运行说明

配置载体类型说明
AIKITConstant.h常量头文件AIKIT 全局常量(如版本、默认参数)
ChatParam.h / AIKITParameters.h参数模型AI 对话/播报的参数配置入口
ProductInfoModel.swiftCodable 模型服务端产品信息字段映射(表盘/设备数据)
AutoProductIcon 资源图片资源产品图标自动匹配的输入

音频会话与通知开关等运行期配置位于 AudioManager 与 DeviceSubViewModel 内部(实现细节待确认)。

失败模式、边界与并发

以下风险点基于模块职责与 iOS 平台惯例归纳,具体处理逻辑需结合源码确认:

  • 音频会话冲突:播放提示音时若与电话、其他 App 音频冲突,需要正确的 AVAudioSession 分类与打断处理;AudioManager 统一管理会话是规避该问题的关键设计。
  • 设备断连:设备事件回调在蓝牙断开时可能中断,DeviceSubViewModel 需处理事件丢失与重连后的状态同步。
  • AI 播报失败:AIKIT 调用失败(网络、配额、超时)时应有降级策略(如退回纯提示音),AIKITError.h 提供错误类型区分。
  • 并发更新 UI:设备事件回调可能来自后台线程,更新 UI 前需切换到主线程;视图模型层应保证状态原子性。
  • 图标匹配失败:AutoProductIcon 对未知产品应提供默认占位图标,避免列表出现空白。

性能与运维

  • 音频资源:提示音多为短音频,建议预加载并复用播放器实例,避免频繁创建导致卡顿与内存抖动。
  • 网络请求:DialMarketHttp 应复用 URLSession 实例并控制并发,表盘列表等大响应建议分页。
  • AIKIT 二进制框架:以 framework 形式集成,注意 App 包体积;DataTester 可用于数据层回归验证。

扩展点

  1. 新增通知类型:在 DeviceSubViewModel 中扩展事件解析分支,复用 AudioManager 播放通道即可;
  2. 新增音频反馈:扩展 JLAudioToolbox 资源与 AudioManager 接口,业务侧无需改动;
  3. AI 播报接入:通过 AiHelper + AIKITAudioBuilder 组合,将任意通知文本交给 AIKIT 合成播报;
  4. 新产品图标:借助 AutoProductIcon 自动匹配,无需逐设备维护图标映射。

Related Links

  • AudioManager.swift(音频/提示音管理)
  • DeviceSubViewModel.swift(设备子功能视图模型)
  • AutoProductIcon.swift(自动产品图标)
  • BaseViewController.swift(页面基类)
  • AIKIT 框架公开头文件目录
  • DialMarketHttp.swift(网络层)
  • 表盘市场完整流程(选购/付费/历史):见 表盘市场(Dial Market) 相关页面
  • WebView 页面(ICP 备案):见 WebView 页面 相关页面
Prev
健康与运动数据同步