大家好,我是陈杨,8 年前端老兵转型鸿蒙开发,也是一名鸿蒙极客

从前端到鸿蒙,我靠的是 “三天上手 ArkTS” 的技术嗅觉,以及 “居安思危” 的转型魄力。这三年,我不玩虚的,封装了开源组件库「莓创图表」,拿过创新赛大奖,更带着团队上架了 11 款自研 APP,涵盖工具、效率、创意等多个领域。

想体验我的作品?欢迎搜索体验:指令魔方JLPT、REFLEX PRO、国潮纸刻、Wss 直连、ZenithDocs Pro、圣诞相册、CSS 特效

今天,咱们继续聊点硬核的 ——[实况窗服务基础开发]。


一、实况窗服务核心认知

1. 什么是实况窗?

实况窗是 HarmonyOS 5.0 及以上版本支持的通知形态,专注于展示持续进行、动态更新的服务状态,让用户无需打开应用即可快速获取关键信息。其核心特点可概括为三点:

  • 时段性:服务有明确起止时间(最长不超过 8 小时),如打车、外卖配送等;
  • 时效性:信息仅在特定时间段内有价值,如航班登机提醒、赛事比分;
  • 变化性:展示内容实时动态更新,确保用户获取最新状态。

2. 核心优势与适用场景

(1)产品优势
  • 全设备覆盖:支持 HarmonyOS 5.0 + 的手机、平板设备,与硬件完全解耦;
  • 多触点展示:一次接入即可在锁屏、通知中心、状态栏同步展示;
  • 无打扰交互:状态栏胶囊支持点击展开,不打断用户当前操作;
  • 高效闭环:服务全流程可视化,提升业务履约效率。
(2)典型适用场景

实况窗支持 12 类核心场景,覆盖出行、生活、娱乐等多个领域,以下是高频场景示例:

场景类型 核心功能 适用场景
出行打车(TAXI) 展示司机接驾时间、剩余行程 网约车、出租车、顺风车
即时配送(DELIVERY) 配送进度、预计送达时间 外卖、生鲜、同城配送
航班(FLIGHT) 登机提醒、延误 / 取消通知 航班出行、航班关注
赛事比分(SCORE) 实时比分更新 体育赛事、游戏赛事
导航(NAVIGATION) 路线变化、行进状态 步行、骑行、车辆导航

注意:实况窗严禁用于营销广告,仅支持用户主动触发的服务场景。

二、接入前准备工作

在开始开发前,需完成权限申请、环境配置等基础操作,具体步骤如下:

1. 基础环境要求

  • 操作系统:HarmonyOS 5.0 及以上;
  • 设备类型:手机、平板(仅支持中国境内使用);
  • 开发工具:DevEco Studio 4.0+。

2. 关键权限开通流程

(1)开通推送服务权益

实况窗的创建与更新依赖 Push Kit,需先开通推送服务:

  1. 登录AppGallery Connect
  2. 进入项目列表,选择目标项目;
  3. 在 “开发与服务” 中找到 “推送服务”,点击 “申请开通”。
(2)设置数据处理位置

由于实况窗仅支持中国境内,需将数据处理位置设为中国:

  1. 进入项目设置 > 数据处理位置;
  2. 勾选 “中国” 并设为默认;
  3. 点击 “保存”(需确保与服务器及用户所在地一致,否则推送失败)。
(3)申请实况窗服务权益
  1. 在 AppGallery Connect 中进入 “项目设置> 开放能力管理”;
  2. 找到 “实况窗服务”,点击 “申请”;
  3. 填写申请信息(场景类型、场景描述、附件材料);
  4. 提交后 5 个工作日内查看审批结果(通过互动中心通知)。
(4)白名单联调测试

申请正式权限前,需通过白名单设备调试:

  1. 进入 “增长> 推送服务 > 配置”;
  2. 找到 “实况窗 - 白名单设备管理”,通过 Push Token 添加测试设备(上限 100 台);
  3. 24 小时内生效,可在设备上调试实况窗展示效果。

三、实战开发:实况窗核心功能实现

以下以 “外卖配送” 场景为例,展示实况窗的创建、更新与结束全流程实现。

1. 设计规范遵循

实况窗支持 “胶囊态” 和 “卡片态” 两种展示形式,需遵循以下设计要求:

  • 胶囊态:状态栏展示,仅显示核心信息(如 “外卖配送中 2.5km”);
  • 卡片态:锁屏 / 通知中心展示,包含进度条、时间、操作按钮(如 “联系骑手”);
  • 颜色:主色调与应用品牌一致,避免使用刺眼颜色。

2. 代码实现(ArkTS)

(1)依赖配置

build.gradle中添加 Push Kit 依赖:

dependencies {
    implementation 'com.huawei.hms:push:6.11.0.300'
    implementation 'com.huawei.harmonyos:liveviewkit:1.0.0.300'
}
(2)本地创建实况窗

通过端侧 API 创建外卖配送场景的实况窗,适用于应用进程存活时:

import { LiveViewManager, LiveViewInfo, SceneType } from '@ohos/liveviewkit';

// 1. 构建实况窗基础信息
const liveViewInfo: LiveViewInfo = {
  sceneType: SceneType.DELIVERY, // 场景类型:即时配送
  eventId: 'order_123456', // 唯一标识(如订单号)
  title: '外卖配送中',
  content: '预计25分钟后送达',
  startTime: new Date().getTime(), // 开始时间
  endTime: new Date().getTime() + 25 * 60 * 1000, // 结束时间(最长8小时)
  progress: 30, // 进度(0-100)
  // 胶囊态配置
  capsuleConfig: {
    text: '配送中 2.5km',
    icon: $r('app.media.delivery_icon') // 应用图标
  },
  // 卡片态配置
  cardConfig: {
    layoutType: 1, // 系统预设布局1(配送场景专用)
    extraInfo: [
      { key: '骑手', value: '王师傅' },
      { key: '电话', value: '138****1234' }
    ],
    actionButtons: [
      { text: '联系骑手', action: 'contact_rider' },
      { text: '查看订单', action: 'open_order' }
    ]
  }
};

// 2. 创建实况窗
try {
  LiveViewManager.createLiveView(liveViewInfo, (err, data) => {
    if (err) {
      console.error(`创建实况窗失败:${err.message}`);
      return;
    }
    console.log(`创建实况窗成功,liveViewId: ${data.liveViewId}`);
  });
} catch (e) {
  console.error(`创建实况窗异常:${JSON.stringify(e)}`);
}
(3)通过 Push Kit 更新实况窗

当应用进程未存活时,通过 Push Kit 推送更新消息(仅支持 FLIGHT、TAXI、TRAIN 场景):

// Java后端代码(Spring Boot示例)
import com.huawei.hms.push.HmsMessaging;
import com.huawei.hms.push.RemoteMessage;

@RestController
public class LiveViewPushController {

  @PostMapping("/updateLiveView")
  public String updateDeliveryStatus(@RequestParam String orderId, @RequestParam int progress) {
    // 1. 构建实况窗更新消息
    RemoteMessage remoteMessage = new RemoteMessage.Builder("YOUR_PUSH_TOKEN")
      .setData("sceneType", "DELIVERY")
      .setData("eventId", orderId)
      .setData("progress", String.valueOf(progress))
      .setData("content", "预计15分钟后送达")
      .setData("capsuleText", "配送中 1.2km")
      .build();

    // 2. 发送推送(需配置华为推送SDK)
    try {
      HmsMessaging.getInstance().send(remoteMessage);
      return "更新消息推送成功";
    } catch (Exception e) {
      e.printStackTrace();
      return "更新消息推送失败:" + e.getMessage();
    }
  }
}
(4)结束实况窗

当服务完成(如外卖送达)或超时,需主动结束实况窗:

// 结束实况窗
LiveViewManager.finishLiveView('order_123456', (err) => {
  if (err) {
    console.error(`结束实况窗失败:${err.message}`);
  } else {
    console.log('结束实况窗成功');
  }
});

3. 关键流控与生命周期说明

  • 更新频次限制:外卖配送场景每 5 分钟最多更新 10 次,每小时 60 次(超频次将丢弃);
  • 生命周期管理:超过 2 小时未更新,仅保留通知中心展示;超过 4 小时未更新,系统自动结束;
  • 用户操作:用户删除实况窗后,不再接收该事件的更新。

四、测试与上线验证

1. 自验清单(申请正式权限前)

  • 截图满足设计规范(胶囊态、卡片态、锁屏效果);
  • 已添加实况窗结束事件;
  • 实况窗信息与应用内任务进度一致;
  • 同一任务无多个实况窗推送;
  • 特殊场景(如配送取消)已处理;
  • 白名单设备调试通过。

2. 正式权限申请

  1. 应用月活≥1000 且已上架,可申请正式权限(单次最多 3 个场景,最多 11 个);
  2. 提交场景描述、接入方案截图、自验结果;
  3. 7 个工作日内收到评审结果,整个流程约 15 个工作日。

五、避坑指南

  1. 数据处理位置错误:必须设为中国,否则推送失败;
  2. 场景准入违规:营销广告类场景会被驳回,需确保用户主动触发;
  3. 更新频次超限:避免高频无效更新,建议根据实际进度变化推送;
  4. Profile 文件配置:开通权限后需重新生成 Profile 文件并打包到应用;
  5. 多端推送冲突:若应用内包含小程序,需提供小程序方沟通证明,避免同一任务多端推送。

六、总结

实况窗服务通过多触点、无打扰的实时信息展示,极大提升了用户对服务进度的感知效率,尤其适用于出行、配送、赛事等高频场景。开发者只需遵循场景准入原则,完成权限申请、规范开发与充分测试,即可快速接入该服务。

后续可结合 HarmonyOS 的 “自由流转” 特性,实现实况窗在手机、平板等设备间的无缝切换,进一步提升跨设备用户体验。如需更多细节,可参考华为开发者联盟官方文档

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐