消息通知与实用设备功能
本文档面向 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(网络层)分包组织。
"消息通知与实用设备功能"横跨其中的多个层次:
- 实用设备功能:指与设备相关的辅助能力,如提示音播放(
JLAudioToolbox)、产品图标自动识别(AutoProductIcon)、设备子功能组织(DeviceSubViewModel)。 - 消息通知:在仓库中以两种载体存在——一是通过
JLAudioToolbox/AudioManager播放的提示音/通知音;二是通过AIKIT.framework提供的 AI 助手语音能力(AIKITAudioBuilder负责音频构建、AiHelper负责助手调用),可服务于通知的语音播报场景。 - 配套基础设施:
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
JLAudioToolbox 是"实用设备功能"中与声音反馈直接相关的工具包,AudioManager 是其核心管理器。设计意图在于:将音频播放(提示音、通知音、语音播报)从业务代码中抽离,统一管理播放生命周期与资源释放,避免各页面各自持有音频会话导致的冲突(例如来电、后台、静音模式等场景下的会话打断问题)。
典型职责(基于模块命名与目录结构的推断,具体方法签名待读取源码确认):
- 播放/停止提示音,支持单次与循环播放;
- 管理音频会话(AVAudioSession)的激活与去激活;
- 为设备事件(消息提醒、来电、闹钟等)提供统一的声音反馈入口。
该模块被 DeviceSubViewModel 等视图模型层模块引用,是"消息通知"能力在声音层面的实现底座。
2. 实用工具层:AutoProductIcon
AutoProductIcon 提供"根据产品信息自动匹配/生成图标"的能力,属于设备实用功能的一部分。其设计意图是:当设备列表中出现新设备或未预置图标的产品时,无需人工维护图标映射,而是根据产品标识(如 PID、产品名)动态匹配图标资源,降低新增设备的适配成本。
3. 视图模型层:DeviceSubViewModel
DeviceSubViewModel 是设备子功能(如消息通知开关、提醒设置等)的视图模型入口。在 MVC/MVVM 混合架构下,它承担:
- 聚合设备子功能的展示状态(开关、选项、文案);
- 将用户操作转发给底层(如调用
AudioManager播放试听提示音); - 向视图层暴露可绑定的状态数据。
设计意图:把"设备能力项"从 ViewController 中剥离,使设备功能的增删改不侵入页面代码,同时便于在多个页面复用同一套设备功能状态(例如设置页与首页同时展示通知开关)。
4. 视图层:BaseViewController 与页面控制器
文件:
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 封装表盘市场相关 HTTP 请求(列表、详情、下单等);ProductInfoModel 定义产品信息的 Codable 数据模型。设备实用功能(如表盘推送、设备信息同步)依赖该层获取服务端数据。DialMarketHttp.swift 的命名说明本仓库将网络请求集中到 httpClient 目录,属于轻量级网络封装,未依赖重型网络框架(具体实现待读取源码确认)。
7. 测试与辅助:UnitTester / DataTester
仓库内置 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: 用户确认/交互反馈 (写回设备)
步骤说明:
- 事件入口:设备通过蓝牙回调把消息/提醒事件交给
DeviceSubViewModel(视图模型层是设备功能的统一入口); - 类型解析:VM 区分事件类型(消息通知、闹钟、久坐提醒等),决定采用提示音还是 AI 语音播报;
- 音频播放:调用
AudioManager播放提示音;如需语音播报则进一步调用 AIKIT 的AiHelper与AIKITAudioBuilder合成音频; - 状态回写:播放完成或失败均回调 VM,由 VM 更新 UI 状态,保证界面与音频状态一致;
- 用户交互:用户在 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 / AIKITDataModel | AIKIT |
| 音频内容 | AIKITAudioBuilder / AiAudioDefine | AIKIT |
数据流向: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.swift | Codable 模型 | 服务端产品信息字段映射(表盘/设备数据) |
AutoProductIcon 资源 | 图片资源 | 产品图标自动匹配的输入 |
音频会话与通知开关等运行期配置位于 AudioManager 与 DeviceSubViewModel 内部(实现细节待确认)。
失败模式、边界与并发
以下风险点基于模块职责与 iOS 平台惯例归纳,具体处理逻辑需结合源码确认:
- 音频会话冲突:播放提示音时若与电话、其他 App 音频冲突,需要正确的
AVAudioSession分类与打断处理;AudioManager统一管理会话是规避该问题的关键设计。 - 设备断连:设备事件回调在蓝牙断开时可能中断,
DeviceSubViewModel需处理事件丢失与重连后的状态同步。 - AI 播报失败:AIKIT 调用失败(网络、配额、超时)时应有降级策略(如退回纯提示音),
AIKITError.h提供错误类型区分。 - 并发更新 UI:设备事件回调可能来自后台线程,更新 UI 前需切换到主线程;视图模型层应保证状态原子性。
- 图标匹配失败:
AutoProductIcon对未知产品应提供默认占位图标,避免列表出现空白。
性能与运维
- 音频资源:提示音多为短音频,建议预加载并复用播放器实例,避免频繁创建导致卡顿与内存抖动。
- 网络请求:
DialMarketHttp应复用 URLSession 实例并控制并发,表盘列表等大响应建议分页。 - AIKIT 二进制框架:以 framework 形式集成,注意 App 包体积;
DataTester可用于数据层回归验证。
扩展点
- 新增通知类型:在
DeviceSubViewModel中扩展事件解析分支,复用AudioManager播放通道即可; - 新增音频反馈:扩展
JLAudioToolbox资源与AudioManager接口,业务侧无需改动; - AI 播报接入:通过
AiHelper+AIKITAudioBuilder组合,将任意通知文本交给 AIKIT 合成播报; - 新产品图标:借助
AutoProductIcon自动匹配,无需逐设备维护图标映射。
Related Links
- AudioManager.swift(音频/提示音管理)
- DeviceSubViewModel.swift(设备子功能视图模型)
- AutoProductIcon.swift(自动产品图标)
- BaseViewController.swift(页面基类)
- AIKIT 框架公开头文件目录
- DialMarketHttp.swift(网络层)
- 表盘市场完整流程(选购/付费/历史):见 表盘市场(Dial Market) 相关页面
- WebView 页面(ICP 备案):见 WebView 页面 相关页面