本文转载自支付宝体验科技。作者是蚂蚁集团客户端工程师欢博。介绍了支付宝如何基于4.0直播窗口实现医疗场景下的履约智能提醒。
一、选题背景
8月4日,华为在HDC(华为2023开发者大会)上推出了新版操作系统4.0,主打个性化、多元化的口号。在功能介绍环节,支付宝基于4.0能力提供的一项新功能出现在了会议的介绍PPT上。
这个功能乍一看像是系统通知,实际上也是通知,但是和通知有很大不同。在华为的官方文档中,这称为实时活动或实时通知。 Live 是原来的名字,现在官方文档称之为live 。
为什么说是国产智慧岛呢?由于这个live 有多种形态,所以胶囊状态和iOS的智能岛在UI显示上几乎“一模一样”。此外,直播窗口的显示位置更加丰富,从熄屏、锁屏到桌面、通知栏、通知中心。我们先来看看官方的效果展示:
依次为通知栏卡片、桌面胶囊状态、桌面胶囊状态展开形式、锁屏卡片、胶囊状态。
在上面的官方UI显示渲染中,胶囊状态不仅显示在桌面上,还支持点击展开作为通知卡进行操作,并且还出现在熄屏界面上。熄屏页面胶囊复制不支持点击扩展为实时卡片。点击灭屏胶囊状态即可进入锁屏卡片页面查看详情。
实时窗口本质上是履行消息的推送显示。华为官方的定义是:帮助用户专注于任务、快速查看、及时处理的通知形状。直播窗口具有实效性、阶段性、变化性的特点。有效性是指整个通知服务会持续一段时间,并且具备自动显示和结束的能力,无需用户主动关闭。有效性是指通知消息在一段时间内有效。通知是动态的,支持内容的动态刷新。
2. 结果显示
了解完华为直播窗口的背景和能力后,我们回到发布会上展示的支付宝实时活动通知。目前支付宝在最新版本10.5.10中已经具备了华为直播窗功能。目前主要接入应用场景为医疗,未来还将开放更多应用场景。那么我们先来欣赏一下“国内智慧岛”在支付宝上的实际上机形态。
通知栏状态:
左侧为正常创建实时活动卡;
右侧的显示屏允许用户对卡片进行更多操作,包括设置和删除卡片。
桌面胶囊状态:
左侧显示手机桌面左上角的胶囊文案;
中间侧显示通知卡,点击胶囊状态可展开通知卡;
右侧显示,胶囊状态下展开卡片后,支持更多的用户操作,包括设置、删除卡片等。
锁屏状态:
展示用户按下电源键进入锁屏页面并显示通知卡(手机拍摄);
屏蔽胶囊状态:
手机界面进入屏幕界面显示胶囊副本(手机拍摄);
以上展示只是强调文案模板在支付宝医疗场景下的UI效果。除了强调文案模板外,华为还针对不同场景提供了多种展示模板,比如打车或外卖场景的进度展示。视觉模板,体育赛事的得分模板。
直播窗口可以作为强有力的提醒通知通道,重要信息可以多方向展示。如果认为对部分用户过度打扰,实时活动也支持减少胶囊文案的曝光度,仅出现在通知栏中。
3. 实施细节
直播窗口UI展示了这么多的状态,大家会更好奇这样一套直播窗口通知是如何实现的呢?
正如一开始提到的,实时窗口实际上是一个通知,本质上是通知功能的扩展。通过解析通知的扩展参数,创建对应的模板并填写数据。对于接入该功能的第三方应用,无需绘制UI,只需要自定义接口协议和模板参数即可创建并展示通知活动卡片。另外,我们看到的胶囊态实际上并不是一种独立的形式。它是卡片形式的扩展形式,附加到特定的卡片模板。这就是为什么可以通过点击桌面上的胶囊状态来展开卡片的原因。
以支付宝接入医疗场景的直播窗口为例,简单介绍一下实现细节。
3.1 处理环节
在支付宝中,实现直播窗口通知需要三个业务团队的配合,包括客户端团队、消息平台服务端团队和消息推送团队。这三个团队的分工如下:
客户端团队:接收消息平台发送的同步消息(服务端与客户端之间双向可靠的数据同步服务,包括上行同步和下行同步),创建实时通知,即通知“上岛”,并发送将卡信息发送给消息平台团队和推送团队;

消息平台服务器团队:查询用户在服务场景中创建的履约订单,根据通信协议通过sync下游通知客户端,并从客户端的sync上游接收卡信息;
推送团队:接收客户端Rpc上报的信息,作为下游接收上游消息平台发来的卡片通知更新信息。将更新参数发送至厂家云端,厂家完成通知卡的更新和删除操作;
详细流程用走廊图表示:
对于第三方应用来说,无需关心UI绘制。对于客户端团队来说,完成通知卡的创建后,不需要进行后续的更新操作。第三方应用云直连厂商云。厂家平台收到更新数据后,直接发送到相应的通知卡,完成状态和数据更新。下图展示了通知卡更新时的数据流程:
3.2 通讯协议
直播窗的通信协议主要包括两个方面:
三方应用内通信协议:数据从消息平台下载到客户端,客户端创建通知卡后,将更新消息发送到下游Push平台。
第三方应用与厂商平台的通信协议:Push平台收到上游消息平台的更新消息后,将数据流传输至厂商平台,完成更新;
这两种通信协议实际上还通知卡的生命周期过程。第三方应用内部的通信协议用于直播窗通知卡的创建,第三方应用与厂商平台之间的通信协议用于直播窗通知卡的更新。
3.2.1 应用内通信协议
应用内的通信协议并不是独立的,而是继承自iOS智慧岛支付宝终端内的通信协议。为什么叫继承?为什么说它不独立呢?
继承是因为华为Live 的协议是支付宝iOS智能岛通信协议的扩展版本,并且在原有协议的基础上扩展了创建华为实时事件卡的必要字段。整个协议的创建原则是:最大容忍原则,即现有字段能复用就复用,缺失就通过团队协商进行扩展。
非独立意味着整个通信协议的确定必须具有前瞻性,包括能够满足未来支持更多类型华为模板的实时活动,也能够满足国内其他厂商后续的需求后续推出类似的“智慧岛”功能。
这套协议目前支持iOS智能岛和华为live ,由客户端团队维护。
3.2.2 外部通讯协议
应用外部的通信协议主要用于Push团队与厂商连接进行通知卡更新操作。其复杂性在于应用程序内的通信协议需要进行转换。向厂商接口请求应用程序中翻译后的通信协议字段,完成活窗通知卡的更新。
如何在应用内部进行协议翻译,主要涉及到将消息平台、客户端、Push三组的对接字段关联成一个三元组参数。
应用程序外部的通信协议仍然由客户端团队维护。
3.3 代码访问
代码访问主要是从客户端的角度来描述的。
3.3.1 创建卡片
实时窗口向通知添加扩展参数。如果在支持直播窗口的设备上发送,系统会根据这些扩展参数以直播窗口的风格显示通知。
// 创建 bundle 保存通知信息,设置 type 为 4,表示强调文本模板类型 Bundle liveNotificationData = new Bundle(); liveNotificationData.putInt("XXXX", 0); liveNotificationData.putString("XXXX, "Other"); liveNotificationData.putInt("XXXX", 4); // 创建 bundle 保存强调文本模板类型的通知所需的扩展参数 Bundle feature = new Bundle(); feature.putString("XXXX", "取餐码"); feature.putString("XXXX", "750"); // 将 feature 的 bundle 设置到通知参数 liveNotificationData 中 liveNotificationData.putBundle("XXXX", feature); // 创建通知,调用 addExtras 添加通知信息 Notification notification = new Notification.Builder(context, channelId)

3.3.2 膨胀囊
如前所述,胶囊状态是卡片的扩展形式。开发时,设计好胶囊的参数,然后添加到直播窗卡的扩展参数中。
// 创建 bundle 保存胶囊所需的参数 Bundle capsule = new Bundle(); capsule.putInt("XXXX", 1); capsule.putInt("XXXX", 1); capsule.putParcelable("XXXX", Icon.createWithResource(context, R.drawa ble.xxx)); capsule.putInt("XXXX", Color.parseColor("# FFFF0000")); capsule.putString("XXXX", "胶囊标题"); capsule.putString("XXXX", "胶囊扩展内容"); // 将胶囊参数设置到通知参数中 liveNotificationData.putBundle("XXXX, capsule);
4.持续优化
目前,华为直播窗口功能在支付宝的实现还不是绝对完美。问题主要包括两个方面:
厂商推送更新的能力并非100%:目前数据显示,华为接收第三方应用推送更新的执行率为92%,这意味着8%的数据会在厂商更新用户设备的渠道中丢失链接。 ;
用户设备信息需要多个业务团队同时获取:华为直播窗卡更新依赖用户设备信息,支付宝目前至少有两个团队需要获取。但华为对获取频率有限制,可能导致无法获取某些商业信息;
4.1 设备端更新
关于第一个问题,当厂商推送更新能力存在缺陷时,更新机制需要有防护措施。目前,支付宝保留了终端内更新的能力。这种能力与厂商的更新不同,体现在更新时机和更新字段协议上。 。
厂商的更新时机主要是在收到第三方应用发起的更新接口请求时。终端内的更新定时是指在规定时间内主动请求消息平台数据。更新数据被覆盖更新,并按照协议更新获取到的字段。对应的模板参数。
4.2 重用
第二个问题是支付宝业务场景复杂造成的。毕竟,当一个团队需要它时,没有办法知道哪些团队也需要它。当多个业务同时请求设备信息时,存在失败的可能。由于时间节奏紧张,目前的计划由Push团队总结。未上报实时活动时,获取其他商家上传的实时活动。 (这里需要注意的是,华为的信息基本没有变化,所以与iOS智慧岛上报的信息有所不同)。
在后期的方案中,团队计划采用缓存的方案来实现端内的业务推广,并维护一组数据。
5、场景覆盖
整个直播窗口功能已经上线,但受限于华为鸿蒙4.0正式版的节奏,无法在线使用。目前仅连接医疗场景。未来我们的业务将会融入更多的场景。目前医疗场景的覆盖范围包括:
通知卡可以显示:医院预约、预约时间、当前进度等。
6. 未来可期
目前我们的整体功能和链接流程已经具备,可以支持快速接入业务完成。我们支持的功能包括但不限于:
音频播放、传输进度等业务场景的基本类型模板:
打车、外卖等业务场景的进度可视化模板:
高铁、航班等业务场景左右文字模板:
体育赛事等业务场景的赛事评分模板(特别是如果支付宝接入了NBA赛事,则可以使用):