本页内容 选对实例和事件Android 通知iPhone 通知
HARDWARE SDK / FreeRTOS

手机通知

接入 Android 通知与 iPhone ANCS,处理显示和动作。

Android 通知通过独立 BLE 辅助连接接收;iPhone 通知由终端直接订阅 ANCS。两者都需要手机系统授权和板级显示适配。

选对实例和事件

功能 接入位置 收到的数据
Android 通知 核心 BLE 辅助实例,bluetooth_auxiliary=true、notifications=true moto_event 通知回调
iPhone 通知 板级 ANCS 客户端与独立 moto_ancs 解析器 moto_ancs_notification 回调

在 Wi-Fi 托管实例设置 notifications=true 不会建立蓝牙连接。 当前 APP 的 Android 通知需要独立 BLE 实例;按Wi-Fi 与蓝牙共享设备授权与 owner 记录。完整接线见参考工程 main/terminal.c、main/ancs_adapter.c、main/notice_view.c。moto_event 与托管事件不是同一结构,不能读取 e.data.notification 或互换句柄。

Android 通知

  1. 在 BLE 辅助实例启用通知,接通 GATT 收发与认证。
  2. 用户在 APP 开启通知共享,并完成系统伴生设备关联和通知访问授权。
  3. 收到 MOTO_EVENT_NOTIFICATION 后显示应用、标题和正文;收到 MOTO_EVENT_NOTIFICATION_REMOVE 后按通知 ID 移除。
  4. 断连或通知过期时清除内容与按钮,不因 UI 排队重新开始有效期。

在核心事件回调里调用 moto_event_get_notification(event, &notice),得到 moto_notification 完整副本,不需要自己解析 CBOR:

#include <moto/sdk.h>

moto_result example_core_notice(const moto_event *event, moto_notification *out) {
    return moto_event_get_notification(event, out);
}

成功返回 MOTO_OK;notice 包含 id、ttl_ms、actions、app、title、text,字符串随结构体复制,可交给 UI 队列。REMOVE 事件只填写 id,其他字段清零。该辅助函数可以在回调中调用,但必须在 event->body 失效前完成。另存原实例的连接/会话标识与接收时刻,过期或换会话后丢弃按钮操作。此接口需要包含该符号的新 SDK 包;旧包应成套升级头文件与静态库。

只显示通知允许的动作:actions & (1u << action)。点击后在原 BLE 实例的所属线程、回调外调用 moto_notification_action(sdk, notification_id, action),0 为正向、1 为负向;用 MOTO_EVENT_ACTION_RESULT 判断提交结果,不能据此认定电话已接通。

如果你已有承载通知的托管传输,才使用 e.data.notification 和 moto_terminal_notification_action(t, &saved_event, action)。保存完整原事件;返回 MOTO_FULL 时只重试未入队的提交。该 API 不会把 Wi-Fi 实例变成蓝牙辅助实例。

iPhone 通知

ANCS 是苹果的蓝牙通知服务,通知由 iPhone 系统直接发送给终端。板级驱动负责加密配对、服务发现、用户授权和订阅;先订阅 Data Source,再订阅 Notification Source。

使用 moto/ancs.h 的 moto_ancs_* 接口解析数据。链路已加密且获得授权后调用 moto_ancs_start,保存返回的 epoch;后续输入和动作必须带该代次。断连调用 moto_ancs_stop,丢弃旧代次回调。所有调用在同一个适配任务中串行执行。

moto_ancs_config.notification 返回 moto_ancs_notification,在回调期间复制给 UI;removed 按 UID 清除。按钮按 ANCS 的允许动作显示,通过 moto_ancs_action 提交。ATT 提交成功不等于实际通话状态改变。

辅助核心配置 ancs=true 并提供 bool ancs_ready(void *user),只报告当前加密链路上的真实订阅状态。MOTO_EVENT_ANCS_SHARING 是分享意图,不是系统授权结果。