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 通知
- 在 BLE 辅助实例启用通知,接通 GATT 收发与认证。
- 用户在 APP 开启通知共享,并完成系统伴生设备关联和通知访问授权。
- 收到
MOTO_EVENT_NOTIFICATION后显示应用、标题和正文;收到MOTO_EVENT_NOTIFICATION_REMOVE后按通知 ID 移除。 - 断连或通知过期时清除内容与按钮,不因 UI 排队重新开始有效期。
在核心事件回调里调用 moto_event_get_notification(event, ¬ice),得到 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 是分享意图,不是系统授权结果。
