MiniApp 标准化白皮书版本 2

W3C 小组草案说明

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2022/DNOTE-mini-app-white-paper-20220701/
最新发布版本:
https://www.w3.org/TR/mini-app-white-paper/
最新编辑草案:
https://w3c.github.io/miniapp/white-paper/
历史:
https://www.w3.org/standards/history/mini-app-white-paper
提交历史
编辑:
Qing An (阿里巴巴)
Dan Zhou (百度公司)
Martin Alvarez-Espinar (华为)
Zitao Wang (华为)
Wanming Lin (英特尔公司)
Kaining Yuan (英特尔公司)
Canfeng Chen (小米)
Yinli Chen (小米)
Anqi Li (W3C)
Fuqiao Xue (W3C)
前任编辑:
Dapeng Liu (阿里巴巴)
Hongru Zhu (阿里巴巴)
Qingqian Tao (百度公司)
Zhixing Lei (百度公司)
Lei Zhao (中国移动)
Zhiqiang Yu (华为)
Xiaowei Jiang (小米)
反馈:
GitHub w3c/miniapp (拉取请求, 新议题, 开放议题)
public-miniapps-wg@w3.org 并使用主题行 [mini-app-white-paper] … 消息主题 …存档

摘要

本文档介绍了一种新的移动应用格式,名为 MiniApp,它是一种非常流行的混合 解决方案,依赖 Web 技术,同时也集成了原生应用的能力。

本文档状态

本节描述本文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 https://www.w3.org/TR/ 上的 W3C 技术 报告索引中找到。

本文档由 MiniApps 工作 组作为 小组草案说明使用 说明轨道发布。

小组草案说明不代表 W3C 或其成员的认可。

这是一份草案文档,可能随时被其他文档更新、替代或废弃。 除作为进行中的工作外,不应以其他方式引用本文档。

W3C 专利 政策 对本文档不附带任何许可要求或承诺。

本文档受 2021 年 11 月 2 日 W3C 流程文档管辖。

1. 引言

1.1 问题

原生应用在我们的日常生活中广受欢迎,但对用户而言,仍有许多事情可以做得更好。

Web 是避免这些问题的理想平台,但目前它仍远不完善。

1.2 什么是 MiniApp?

MiniApp 是一种新的移动应用格式,是一种依赖 Web 技术(尤其是 CSS 和 JavaScript)并集成原生应用能力的混合解决方案。

超级应用是一个托管并支持其他 应用(即 MiniApps)的软件平台,使它们能够使用该平台的资源来执行。

MiniApps 因在一些超级应用中的使用而流行起来,因为它与生俱来具有一些 有助于填补 Web 与原生应用之间差距的特征。

1.3 MiniApps 与 PWA 之间的差距

MiniApps 并非旨在取代渐进式 Web 应用(PWA)、原生应用或 Web。

从广义上讲,这些技术之间的一个显著差异是执行 环境。PWA 几乎可以在浏览器中任何支持 Web 的环境中运行,而 MiniApps 则绑定到 特定平台或超级应用。另一个重要差异是分发 机制:MiniApps 是打包且自包含的,而 PWA 的资源分布在 Web 上。

在编码方面,两种技术使用类似的编程语言和标记语言以及基于 CSS 的样式表。 MiniApps 实现了基于 HTML 子集的专用领域特定语言,以及用于数据绑定和事件管理的特定 机制,遵循带有虚拟 DOM 管理的 MVVM 范式。MiniApp 厂商 定义了类似的 UI(用户界面)元素,而这些元素并不总是在 HTML 中有直接对应物。

在服务方面,PWA 和 MiniApp 开发者可以访问具有相同目的和等效 特性的 API,但它们并不遵循完全相同的规范。

MiniApp 厂商定义了面向应用发布和通过其渠道进行分发管理的专属 API。 其他专用 API 则绑定到具体场景和运行平台——例如, 使用设备原生闹钟和日历功能设置提醒、拨打电话 以及触发性能警告的服务。尽管两种技术拥有类似的 API 和服务, 但每种应用类型中的 API 规范之间仍存在显著差距。PWA 依赖标准 Web API, 而 MiniApps 实现非标准 API,以最大化平台能力,例如 设备特定功能和厂商专属服务。

根据实现方式,MiniApp 用户代理可以是操作系统、超级 应用,或任何其他基于不同且多样化渲染引擎和 WebView 的托管平台。MiniApp 用户代理的架构不同于 PWA 用户代理,如下 图所示。

MiniApps 和 PWA 的架构
1 MiniApps 和 PWA 的架构

附录中的对比表识别并突出显示了 渐进式 Web 应用(PWA)与各种 MiniApp 实现之间的差异。下面的表格总结了其中一些 差异。

特性 渐进式 Web 应用 MiniApp
源代码 标准标记语言(HTML)、样式表(CSS)和脚本(JavaScript)。 HTML、CSS 和 JavaScript 的非标准方言
部署格式 Web 资源(主要包括:HTML、CSS、JavaScript 代码和 WebAssembly 模块) 打包在 ZIP 容器中的 HTML、CSS、JavaScript 以及其他资源。
打包 否。资源链接在 Web 上。 是。每个厂商有不同的包格式。
需要在 Web 服务器上托管文件
免安装使用 是,在浏览器中运行。 超级应用中或在操作系统上运行。
带独立图标的安装 来自浏览器或应用市场(可选)
服务 访问 Web API 访问非标准 Web API,包括一些系统原生 API

1.4 案例研究

1.4.1 案例 1:共享单车 服务

MiniApps 的普及有助于让共享单车成为一种无缝服务,而不是一个笨重的 应用。

  • 用户在其移动设备上选择任一 MiniApp 平台,该平台通常是一个用户已经登录的超级应用
  • 用户在该超级应用中扫描贴在共享单车上的二维码标签;
  • 托管应用将自动导航到共享单车 MiniApp,并立即解锁 单车;
  • 到达后,用户在 MiniApp 上锁车;
  • 交易完成,支付详情消息会发送给用户。
共享单车服务
2 使用 MiniApp 的共享单车服务

对于用户而言,MiniApps 可以从几个方面带来便利:

Web 原生应用 MiniApp
下载/安装
已验证/可信
登录/注册 用户许可
支付 发送支付请求 注册信用卡或导航到另一个应用 在托管应用内完成

1.4.2 案例 2:AR 动物园

MiniApp 开发者可以简单地使用 HTML/CSS/JavaScript 作为编程语言,但 MiniApp 更灵活,因此它擅长在日常工作中快速开发复杂功能。

该 MiniApp 试图用 AI 技术构建一个 AR 动物园来识别动物。开发者可以 通过添加一些提供原生能力或高级功能访问能力的组件或 API,轻松做到这一点(例如,图像识别、AR 3D 动物模型渲染、用于语音 合成的语音 API,以及由地图 SDK 提供的 AR 导航)。

MiniApps 可以被搜索引擎、托管 应用中的 MiniApp 商店或二维码发现。

AR 动物园
3 AR 动物园 MiniApp

对于开发者而言,开发 MiniApps 的激励非常明显。

Web 原生应用 MiniApp
可发现性 搜索引擎 应用市场 多种方式:搜索引擎 + 托管应用中的 MiniApp 商店 + 二维码
已验证/可信 仍在探索 由原生应用市场验证 由宿主应用平台验证
部署/重新加载 加载/重新加载网页 安装/重新安装 由于使用 JavaScript 引擎,因此可加载/重新加载
编程语言 Web 编程语言 新的/多种语言:至少包括 iOS 和 Android Web 编程语言
API/组件(AR、图像识别、地理定位、语音 API) 非常基础 对 Web 开发者而言较复杂 非常简单的高级 API 和组件

1.4.3 案例 3:车载 MiniApp

MiniApp 的目标之一是连接不同平台上的信息和服务,因此 它非常适合 IoT 应用,例如智能汽车、语音控制音箱和智能电视。

如今,可以转换一些 MiniApps 以适配车载屏幕和系统。此外,一些 MiniApp 厂商已经构建了专为车载系统设计的 MiniApp 平台,以帮助 向各种车型分发或升级应用。这将数百万 Web 开发者带入了 汽车应用生态系统。

这些汽车 MiniApps 可以服务许多用户场景,包括加油、洗车、 电子不停车收费、保险、餐厅预订或娱乐。例如,当 系统检测到剩余燃油少于 20% 时,可以向车主推荐一个加油 MiniApp。用户可以获得最近加油站的信息并前往那里完成 加油,包括在 MiniApp 内完成支付,实现“加油不用下车”。

智能汽车
4 面向智能汽车的 MiniApp(加油应用)

1.4.4 案例 4:面向 IoT 的 MiniApp

IoT 设备正在成为运行 MiniApps 的另一种载体。面向 IoT 的 MiniApp 旨在实现 多个 IoT 设备平台和操作系统之间的互操作性。通过 引入面向 IoT 的 MiniApps,开发者无需处理多个 IoT 设备平台和 IoT 操作系统之间的 差异,只需要专注于 IoT 设备上的应用开发。

一个示例是 HVAC(供暖、通风和空调) 应用开关面板,它具有屏幕和几个物理按钮。在这种情况下,通过 引入面向 IoT 的 MiniApp,开关面板的屏幕 UI 可以使用 Web 技术来设计和开发,以显示 HVAC 信息。例如,可以显示由 物理按钮输入的目标温度值以及测得的实时温度值。

IoT MiniApp
5 运行在带屏幕和几个物理 按钮的 HVAC 应用开关面板上的 IoT MiniApp

另一个示例是带触摸屏的智能音箱。在这种情况下,通过引入面向 IoT 的 MiniApp, 智能音箱的触摸屏 UI 可以使用 Web 技术进行设计和开发,用于播放 音乐和视频、控制家中的 IoT 设备以及在线购物。

智能音箱上的 IoT MiniApp
6 运行在带触摸屏智能音箱上的 IoT MiniApp

1.4.5 案例 5:面向电视的 MiniApp

与运行在手机上的 MiniApps 不同,手机上的用户交互依赖于触摸屏,而 运行在电视上的 MiniApps 的用户交互切换为电视遥控器面板键盘加电视屏幕 焦点。

通过面向电视的 MiniApp,用户可以通过电子商务 MiniApp 在电视上购买商品。

运行在电视上的电子商务 MiniApp
7 运行在电视上的电子商务 MiniApp

此外,用户还可以通过游戏 MiniApps 在电视上玩游戏。

运行在电视上的游戏 MiniApp
8 运行在电视上的游戏 MiniApp

2. MiniApp 概述

2.1 核心特性

2.1.1 将 视图层与逻辑层分离

在 MiniApp 中,视图层通常与逻辑层分离。

逻辑层和视图层
9 MiniApps 的总体架构

视图层负责渲染 MiniApp 页面,包括 Web 组件和原生 组件的显示,这可以被视为混合渲染。例如,某些 Web 组件可能 不受 WebView 支持或存在性能限制,因此 MiniApp 也依赖原生 组件,例如地图、视频等。

逻辑层使用 JavaScript Workers 实现。worker 负责 MiniApp 的事件 处理、API 调用和生命周期管理。

扩展的原生能力通常来自托管原生应用或操作系统,包括支付、文件 处理、图像扫描、电话呼叫等。这些特性通过特定 API 调用。当 MiniApp 调用原生 API 时,它会通过 JavaScript Bridge 将 API 调用传递给扩展的 原生能力以供进一步处理。它再通过 JavaScript Bridge 从扩展的原生能力获取 结果。

调用 API 时 MiniApp 的数据流
10 调用 API 时 MiniApp 的数据流

worker 为每个 Render 建立连接,将需要渲染的数据传输给 Render 以供进一步处理。

如果某个事件由 MiniApp 页面中的组件触发,该页面的 Render 会将事件发送给 worker 以供进一步处理。同时,Render 会等待 worker 发送的数据,以重新渲染 MiniApp 页面。

渲染可以被视为无状态,所有状态都将存储在 worker 中。

分离视图层和逻辑层的好处包括:

  • 非常便于多个 MiniApp 页面之间的数据共享和交互。
  • 在 MiniApp 生命周期内拥有相同的上下文,可以为来自原生应用开发背景的 开发者提供类似的编码体验。
  • 渲染和 JavaScript worker 的分离及并行实现,可以避免 JavaScript 执行影响或拖慢页面渲染的情况,这有助于提升 渲染性能。

2.1.2 丰富的 API 和组件

MiniApp 平台提供许多组件,帮助开发者构建精美的 UI,包括基本 组件,如 viewformimage,以及高级组件 如地图。

MiniApp 厂商也为开发者提供许多 API,以访问 Web 和原生 能力,包括 UI 显示 API、图像处理 API 等基础接口,以及 用户账号 API、地图 API 和支付 API 等高级接口。

API 通常与组件协同工作。当用户点击 MiniApp 页面上的某个组件时, 它会调用相关 API 来完成用户交互,并在需要时刷新当前 MiniApp 页面。

2.1.3 MiniApp 构造器

为了获得与原生应用类似的用户体验,MiniApp 资源通常会被打包 在一起。下载并安装 MiniApp 包后,MiniApp 所需的所有静态资源(即页面 模板、CSS、JavaScript 文件和其他文档)会保留在用户的 设备上。这些资源在下一次更新之前始终可用,无需任何重复下载。

MiniApp 包是一个压缩的 ZIP 归档文件,包括:

  • 位于包根目录中的配置文档。配置文件应当 包括:
    • 整个 MiniApp 的总体描述;以及
    • 页面的描述,包括它们对应的路径和配置,用于 页面设置和打开。
  • 一个应用级逻辑文件,其中包含处理应用级生命周期回调的脚本。
  • 一个或多个文件,包含用于页面结构的模板代码、用于页面 样式的 CSS 样式表,以及用于页面逻辑的 JavaScript 代码。
  • 用于完整性验证的数字签名支持。

为了在搜索和执行时定位特定的 MiniApp,MiniApp 必须在平台上具有 包名或标识符。还需要一个图标用于用户识别。

2.1.4 MiniApp 小组件

除了 MiniApp 页面之外,MiniApps 还可以显示为信息片段或 MiniApp 小组件。在这种形式下,开发者可以将其服务和/或内容放入各种宿主场景, 称为宿主环境(例如助手、设备全局搜索等)。此特性 将 MiniApp 的服务和内容与具体场景连接起来,为用户提供 更多便利。

例如,当用户购买旅行火车票时,智能助手上的 MiniApp 小组件会立即显示火车的最新状态。 用户可以点击该小组件,并跳转到全屏 MiniApp 页面以查看更多详细 信息。

从主屏幕到 MiniApp 的小组件
11 从主屏幕到 MiniApp 的小组件

与 MiniApp 页面类似,小组件也由 URI scheme 描述。宿主环境通过 URI 路径指定要加载的 MiniApp 包及对应小组件,并通过 URI 查询参数将数据传递给小组件。小组件加载后,会在 宿主环境中显示和渲染。来自宿主和小组件的数据,以及来自不同小组件的数据 都会被隔离,以确保安全性和独立性。

在许多场景中,小组件可以打开 MiniApp 页面以执行更复杂的操作。在这种情况下, 小组件通常需要与其对应的 MiniApp 共享数据(例如,保持一致的登录 状态)。因此,小组件和 MiniApp 的数据可以由双方访问。换 言之,MiniApp 小组件和页面拥有相同的数据访问权限。

小组件交互
12 MiniApp 小组件交互

小组件的目标之一是让用户忘记传统应用概念,并真正以服务的形式满足 用户需求。因此,除了所有应用调用路径外,小组件还可以 在不同场景中通过不同方式触发,例如文本关键词、语音 分析、图片识别、扫码和事件意图。

注:小组件由中国市场中的快应用实现。

2.1.5 单实例、 多入口

发现、打开和访问 MiniApps 有多个入口。与多 WebView 中的 Web 内容不同,同一个 MiniApp 只会创建一个实例,因此 MiniApp 会在全局范围内以一致方式保持其状态和 数据。例如,当一个用户第一次通过二维码入口打开并登录 MiniApp 后, 当用户下次从 MiniApp 商店等其他入口返回时,用户仍将保持登录状态。

MiniApps 的入口包括但不限于:

  • MiniApp 市场
  • 搜索引擎
  • 智能助手
  • 二维码
  • SMS/文本
  • 物理对象(带 AI)
  • 浏览器
  • 日历项
  • 语音消息(带 AI)

2.1.6 性能和用户 体验

MiniApps 尝试通过一些在实践中被证明有效的机制来提升其性能和用户体验。

打包

借助 MiniApp 的构造器,用户只需要在第一次打开 MiniApp 时下载包,之后 MiniApp 中的静态资源(例如页面、 脚本和 CSS)无需再次下载,从而使后续页面的加载和 跳转更加高效。此特性提升了用户体验并 节省了网络流量。

同时,MiniApp 具有预下载机制,可以提前下载 MiniApp 包, 或者针对首个页面单独预下载,并在下载过程中并行执行流式 解压,以尽量减少 MiniApp 启动 阶段的耗时,并平衡首次打开时首页性能的损失。

多个渲染视图

MiniApp 使用原生页面栈来管理渲染视图之间的关系,页面切换由 原生代码驱动。因此,页面中的手势操作、页面之间的 切换可以获得与原生应用完全相同的流畅体验。

由于视图层和逻辑层相互隔离,视图层可以独立 渲染。在不被 JavaScript 逻辑代码阻塞的情况下, 页面渲染速度可以得到极大提升。

预构建和运行时环境复用

MiniApp 的运行时环境通常会在启动 mini-app 之前预构建,从而减少 启动 MiniApp 的时间。预构建内容包括渲染视图、静态资源、 开发者定义的预取请求以及 MiniApps 运行时容器。MiniApp 激活后,会接管预构建的渲染视图,然后我们会继续 将新的渲染视图预构建到缓存池中以供下一个使用。渲染 视图数量存在限制。当任何渲染视图被关闭或数量限制被超过时, 最早打开的渲染视图将被销毁。当 MiniApp 应用退出时,运行时 会被销毁,并且应用环境和资源可以被复用。

预定义组件和 API

MiniApp 平台提供非常丰富的组件和 API。 这些组件和 API 通常经过良好设计,以满足开发者的性能 需求。

JavaScript 框架预设和热重载

MiniApp 的运行时环境包含两大部分:由 原生代码提供的基础能力,以及一个框架,其中包括开发者 API 和一些由 JavaScript 实现的组件。JavaScript 框架内置于原生应用中,并会在执行 MiniApp 之前 预先加载到 MiniApp 运行时环境中。JavaScript 框架可以热重载(使用过程中重新加载),这为 提升性能带来了许多可能性。

2.1.7 登录

MiniApp 平台为用户登录 MiniApp 提供了多种方式。如果用户已经 通过身份认证登录到平台,则平台的登录信息可以与 MiniApp 共享, 快速实现 MiniApp 自身账号 系统与平台账号系统的互通,使 MiniApp 的访问流程更加顺畅。

例如,传统的 SMS 验证登录流程更耗时;用户需要 先手动输入手机号,然后在收到 SMS 后输入验证码才能登录。MiniApp 的优势在于,开发者可以使用平台提供的组件 / API, 安全且便捷地获取用户手机号,提示 用户授权使用手机号进行一键登录,这使 整个流程对用户而言更加简单,也降低了开发者获取用户信息的成本。

登录 MiniApp
13 登录 MiniApp

2.1.8 分包

MiniApp 分包是一种用于改进 MiniApp 包开发过程的构建机制。它 帮助开发者将不同业务模块划分到不同子包中。

对于开发者:MiniApp 默认具有主包;它包含启动页面文件和 公共资源。子包是一种构建类型,可灵活划分开发者的业务 模块。用户可以在按需加载不同子包后打开特殊页面。

对于用户:当用户启动 MiniApp 时,默认会下载主包,并 启动主包中的页面。如果用户需要打开子包中的页面, MiniApp Runtime 将开始下载并加载子包,并启动子包页面。

通过这样的分包构建机制,在多个 团队共同开发时更有利于解耦和协作。当用户使用 MiniApps 时,分包机制可以提高 MiniApp 首页的 加载速度,按需加载子包,并优化用户体验。

2.1.9 附加组件

在 MiniApp 中,add-on/extension 是一个封装模块,可向 现有 MiniApp 添加特定功能,它可以是组件、JavaScript 模块或页面。add-on/extension 只能在 MiniApp 中执行,而不能单独运行。开发者可以像开发 MiniApp 一样开发 add-on/extension,并将其上传到 MiniApp 平台,以供其他 MiniApps 复用。

MiniApp 支持 add-on/extensions 以:

  • 通过代码复用降低开发成本,并帮助开发者轻松添加新特性
  • 在开发者无感知的情况下自动更新功能
  • 通过不加载未使用功能来减小 MiniApps 的包大小

add-on/extension 机制降低了开发 MiniApps 的门槛,并将更多开发者 带入 MiniApp 生态系统。

2.2 MiniApp 市场

本节描述了一些当前主流的 MiniApp 或相关平台。

支付宝小程序

支付宝小程序运行在支付宝原生应用之上,是 Web 和 原生的混合解决方案。支付宝小程序依赖 CSS 和 JavaScript 等 Web 技术。同时,它 集成了支付宝原生应用的功能,例如支付、信用服务、人脸 认证等。

超过 100 万个小程序运行在支付宝原生应用上,拥有 2.3 亿 DAU(每日 活跃用户)。用户场景包括零售、交通、医疗服务等。

百度智能小程序

百度智能小程序指一种开放生态产品,它基于百度 App 和其他合作伙伴平台, 智能地将人与信息和服务连接起来。通过 百度的 AI 能力以及对智能小程序中所有内容的理解,百度能够精准 连接用户和智能小程序。借助百度的搜索和信息流双引擎, 用户可以在智能小程序中获得类应用体验。截至 2019 年 7 月,已有 超过 150,000 个智能小程序和 2.7 亿 MAU。

百度智能小程序已在我们的开源联盟内开源,拥有 30 多个 合作者,覆盖超级应用、移动操作系统、车载操作系统、语音控制音箱和 电视。

快应用(快应用联盟,包括小米和华为)

快应用是由快应用联盟中 12 家顶级手机制造商开发的 MiniApp 标准, 覆盖超过 2 亿 MAU。开发者可以实现一次开发并运行在 所有硬件厂商的平台上。快应用深度集成到操作 系统中,可以在手机系统的多个场景中一键获取。通过 引入原生渲染路径,实现了前端开发与 原生性能体验的有效结合。

快应用可以以两种形式运行:类似原生应用页面的快应用页面形式, 以及在场景中呈现信息的小组件形式。二者适配不同的用户需求, 在多个场景中将系统与 MiniApp 连接为一个整体。

360 PC MiniApp

PC 上的 MiniApps 仍处于早期探索阶段。360 PC MiniApp 是一种运行在其 PC 浏览器中的轻应用。与传统网页相比,它提供了更多 功能,并且更容易与 PC 操作系统交互。

PC MiniApps 仅向通过企业账号验证的用户开放。大多数特性 都受到严格监管,因此它们可以被视为高度可信的 Web 内容。

PWAs

PWAs 是概括现代 Web 应用的最新术语。作为原生应用的对应物,PWA 外观和体验都像原生应用,并且可以安装到设备主 屏幕/启动器/开始菜单;它可以发送推送通知以重新吸引用户;它可以在离线时使用, 并能在网络状况不佳时运行;它适用于能力范围广泛的设备, 并且仍在演进以配合开放 Web 标准定义的新能力;用户可以在 PWAs 应用内完成支付;并且 PWAs 应用 对搜索引擎友好,能够完美配合超链接。PWAs 在技术和 商业方面都取得了成功(被许多网站广泛采用,尤其是在面向消费者的网站中)。

3. 与 Web 协作

本节选择了一些典型用例,并提出了若干 MiniApps 希望从 Web 获得支持的 API。

3.1 应用生命周期

3.1.1 混合渲染

MiniApp 是 Web 渲染和原生渲染的混合解决方案。如果有一种好 方法可以结合来自 Web 和原生的渲染结果,那将会很棒。

来自 Web 和原生的渲染结果
14 来自 Web 和原生的渲染结果

提议:MiniApp 需要一个标准化 API,以帮助将原生渲染结果集成到 Web 渲染结果中。

3.1.2 过渡动画

MiniApp 希望在页面切换期间提供过渡动画,使用户可以获得 与使用原生应用时类似的体验,但现在几乎不可能做到这一点。

提议:MiniApp 需要一个 API,用于在 MiniApp 页面切换期间添加过渡动画。

3.1.3 标准化 MiniApp 的包构造器

MiniApp 可以通过标准化分发格式,为多个 MiniApp 托管平台形成一套包和解析约定。 目前,每个 MiniApp 托管平台都提供不同的 开发工具(不同的打包方式),并且 MiniApp 在不同的 MiniApp 托管环境中会被不同地解析。

提议:MiniApp 实际上是在分发 过程中打包(压缩)的文件集合。我们可以用统一的文件后缀描述 MiniApp(.ma),并指定如何创建 .ma 文件以及如何解析 .ma 文件。

3.1.4 标准化到 MiniApp 页面的导航

对于 MiniApp 中的热门页面,它可能会被另一个 MiniApp 引用,并且期望在用户访问时 能够被准确唤起。

提议:定义一个标准化协议(URI scheme)来访问 MiniApp。

3.1.5 MiniApp 小组件

类似 Android 小组件或 Apple dashboard,用户可以直接获取信息和/或完成任务, 而无需打开任何 Web 或应用页面。MiniApp 小组件可以显示在 Web 浏览器之外的环境中,例如桌面或 dashboard。

提议:

  • MiniApp 小组件可以显示在宿主环境中,无论是 WebView 还是原生应用 页面。宿主环境通过对应的 URI 路径加载小组件,该路径描述 一个包和小组件页面。
  • MiniApp 小组件可以访问本地数据或服务器数据。同时,MiniApp 小组件可以 与同一包中的 MiniApp 通信。
  • MiniApp 小组件应当是交互式的,这意味着它应当响应任何用户 行为/交互。MiniApp 小组件应当具备打开 Web 或应用页面的能力。

3.2 性能和调优

3.2.1 为 MiniApp 中的“可交互时间”定义事件

MiniApp 需要知道 MiniApp 页面可交互时间(TTI)何时完成。

提议:一个标准化事件,用于通知 MiniApp 页面可交互时间已经 完成。

3.3 图形和媒体

3.3.1 3D 模型元素

3D 模型凭借其丰富细节变得越来越流行。结合 AR,它们将 提供比 2D 更好的用户体验。业务案例可能包括在线购物、 广告、教育等。然而,当前 Web 缺少一种标准且便捷的方式来处理 3D 模型。在本文档中,我们提议定义一个 HTML 标签,用于直接处理 3D 模型, 类似于我们使用相应 HTML 标签处理音频、视频和图像的方式:

  • 360 视图

    用户可以通过手势从不同角度查看 3D 模型。并且 3D 模型也可以放大/ 缩小。它可以全屏查看,也可以嵌入网页中,与 其他 HTML 内容一起显示。

  • 使用 AR 查看

    用户可以借助相机将 3D 模型放置在真实世界中。用户可以指定不同的 位置来放置该模型。

提议:一个 <xmodel> 元素,用于在 Web 上指定 3D 模型并支持 带 AR 的交互式 3D 内容。

3.3.2 人脸跟踪

人脸跟踪可用于许多 3D 场景。

实时视频中的人脸特效
在实时视频中的人脸上添加特效。这些特效包括全屏滤镜、瘦脸 和妆容、2D 贴纸、3D 头饰等。大多数这类特效都高度依赖来自视频源的实时 人脸跟踪。
游戏
游戏开发者可以基于跟踪到的人脸设计游戏策略,例如当眼睛眨动时触发特定 游戏逻辑,或检查下落的水果是否进入张开的嘴巴。
虚拟试妆
让用户在产品页面试用口红、眼影、眼镜和帽子,帮助他们做出决定。

提议:一个 Face Tracking API 使用视频元素作为输入,并每帧更新人脸跟踪输出, 其包括:

  • 每张人脸的边界框
  • 每张人脸的 4x4 姿态矩阵
  • 归一化的 (x, y) 特征点
  • 包括顶点、法线、纹理坐标的人脸几何数据

3.3.3 手势 跟踪与识别

手势可以用于视频特效和 AR/VR 游戏场景,使应用更具表现力和 交互性。

提议:一个高级 API,用于跟踪手部运动并获取手部轮廓。

3.3.4 基于 ARCore 和 ARKit 的低级 AR API

MiniApps 中有一些 AR API 是我们希望迁移到 Web 的,因为它们有助于在游戏、3D 模型预览和互动广告中提供更好的 AR 体验。

提议:提供基于 ARCore 和 ARKit 的低级 AR API,其中包括:

用于世界跟踪的相机视图矩阵
提供移动电话空间位置和朝向的 4x4 视图矩阵,开发者可以 用它在自己的 3D 虚拟世界中实时更新相机矩阵。 从而可以将真实世界的位置与 虚拟世界中对象的位置关联起来。
平面检测和跟踪
检测真实世界中的平面并实时跟踪这些平面。提供 4x4 变换 矩阵,该矩阵表示每个平面的中心位置和朝向。它可用于 将 3D 虚拟对象放置在地面/桌面上。
锚点
锚点定义了真实世界中的固定位置和朝向。开发者可以从 4x4 变换矩阵创建 锚点,该矩阵可以通过命中测试获得。此矩阵将每帧更新, 以确保与该矩阵对应的虚拟对象能够固定在真实场景中的一个 位置和方向上。
命中测试
获取表示真实世界空间中与屏幕位置对应的位置和朝向的 4x4 变换矩阵, 以实现点击和放置虚拟 对象等功能。
更好地支持 AR
15 更好地支持 AR 的 API

4. 当前标准工作;WG 工作

4.1 生命周期

[MINIAPP-LIFECYCLE] 定义了 MiniApp 生命周期事件以及 管理 MiniApp 和每个页面生命周期的过程。实现本规范使 用户代理能够管理全局应用生命周期和页面 生命周期的生命周期事件。

2.1.1 将视图层与逻辑层分离 中所述,在 MiniApp 中, 视图层与逻辑层分离。视图层负责渲染 MiniApp 页面, 包括 Web 渲染和原生渲染,这可以被视为混合渲染。逻辑层 使用 JavaScript Worker 实现。逻辑层负责 MiniApp 的事件处理、 API 调用和生命周期管理。

MiniApp 生命周期机制提供了一种通过 MiniApp 全局应用生命周期事件和 MiniApp 页面生命周期事件来管理 MiniApp 视图层和逻辑层的方法。了解 MiniApp 全局应用生命周期状态和 MiniApp 页面生命周期状态来开发 MiniApp,可以带来 更好的用户体验。MiniApp 生命周期包括一组事件,MiniApp 可以借助这些事件 根据自身状态选择改变其行为。

4.2 清单

[MINIAPP-MANIFEST] 是定义用于描述 MiniApps 的一组 元数据的规范。MiniApp Manifest 扩展了 [APPMANIFEST] 和 [MANIFEST-APP-INFO] 规范, 提供附加机制来设置 MiniApp 的基本信息,例如标识、 人类可读的描述、版本数据和样式信息。MiniApp manifest 还 配置作为 MiniApp 一部分的页面和小组件的路由。

MiniApp manifest 是一个 JSON 文档,它使用 Web App Manifest 的一些基本元素来描述 MiniApp(nameshort_namedescriptionicons), 并添加九个补充成员来指定 MiniApp 的技术细节(app_idversionplatform_versiondevice_typepagesreq_permissionswidgets),以及配置应用的外观和感觉 (color_schemewindow)。

4.3 打包

[MINIAPP-PACKAGING] 定义了 MiniApp 包的语义和一致性 要求,以及用于保存 MiniApp 资源的容器结构,包括页面组件 (即模板、样式表和 JavaScript 逻辑)、manifest 以及其他媒体文件或配置资源。

本规范确定 MiniApps 的逻辑结构和物理结构,规定了 基于 ZIP 的容器在文件系统组织和处理方面的要求,该容器用于打包 MiniApp。 MiniApp 包实例有助于 MiniApp 在运行时 环境或 MiniApp 用户代理中的分发和执行。

4.4 寻址

[MINIAPP-ADDRESSING] 是一份说明,定义了用于 访问 MiniApps 的标准 MiniApp 协议。它旨在解决这样的问题:目前每个 MiniApp 厂商都有自己的 MiniApp 资源描述方式,并使用非常不同的方法来获取 MiniApp 包,这使得跨平台访问 MiniApps 变得非常困难,也难以从用户和开发者 双方的角度形成统一理解。

该文档参考移动深度链接技术,定义了两种访问 MiniApp 的方式,一种使用 HTTPS 协议,另一种使用自定义协议。此外,MiniApp Addressing 定义了 MiniApp URI 的语法,包括用于跨环境访问的 uri-prefix、用于 MiniApps 的 uri-infix "miniapp",以及用于唯一标识 MiniApp 的标识符和版本。

MiniApp Addressing 还描述了用户代理如何基于 MiniApp URI 获取对应的 mini-app 包,以及一些错误处理,并给出了一个通过网络下载 MiniApp 包的示例流程。

4.5 小组件

MiniApp Widget 是 MiniApp Page 的一种特殊形式。与页面一样,小组件运行在一个称为 MiniApp 用户代理的宿主环境中。与 MiniApp 页面不同,小组件可以占用某个区域, 而不是整个屏幕。[MINIAPP-WIDGET-REQ] 文档描述了 开发 MiniApp Widget 的初始设计考虑,包括用户代理、打包、 manifest、寻址、生命周期、UI 组件、API 以及 MiniApp 和 MiniApp Widget 之间的通信等。详细的 Widget 规范将在单独文档中描述,该文档将 描述用户代理的详细技术要求和能力。例如,小组件运行环境的潜在 依赖、Widget 带来的 API 和 UI 组件的潜在变化,以及 Widget 带来的新特性, 例如 MiniApp 和 MiniApp Widget 之间通信的要求。用户代理开发者和小组件开发者 都可以参考 Widget 规范进行技术开发。

4.6 实现、转换 工具

2021 年,工作组发布了两份文档,[MINIAPP-MANIFEST] 和 [MINIAPP-LIFECYCLE]。与此同时,各厂商已有一些 标准前实现。为了验证标准的可行性并兼容 标准前实现,工作组开发了一个工具,用于将 MiniApp 标准 Manifest 转换为不同的标准前 manifest 文件,例如百度的 App.json 和 HarmonyOS FA 的 config.json。并且在 2021 年 TPAC 分会场会议中,工作组演示了该 工具的 demo。

随着标准和预部署的进展,工作组计划完善这些工具,以支持 完整、标准化的开发方法,其中可能包括 Packaging、Addressing、Lifecycle、UI components 和 APIs。

5. 孵化中的新想法;CG 工作

5.1 UI 组件

MiniApp 组件是用于定义构成 MiniApp 的页面结构、内容和逻辑的构建块。 每个组件都封装功能、数据和样式,使开发者能够 构建可复用且可定制的项目。

MiniApp UI Components 规范收集了一组基本元素,开发者可以使用这些元素 在 MiniApp 平台之间构建同质但可定制的用户界面。

本规范不引用 HTML 和 CSS 的特定版本。它指向最新的 W3C 推荐标准,以保证采用和 实现 HTML 和 CSS 标准的变更。MiniApp 用户代理厂商和 开发者都需要跟踪这些规范的变化,以确保其流程和 系统保持最新。

本规范基于 Web Components 定义了一组在所有 MiniApp 规范中通用的预定义元素。

5.2 面向 IoT 的 MiniApps

面向 IoT 的 MiniApp 描述了 MiniApp 面向 IoT 的用例。根据这些用例,本规范定义了面向 IoT 的 MiniApp 架构。文中规定了如何 复用和扩展 MiniApp Packaging 与 MiniApp Lifecycle。此外,还 为面向 IoT 的 MiniApp APIs 规定了若干 API。

面向 IoT 的 MiniApp 与运行在手机和 PC 上的 MiniApps 具有类似架构。但由于 IoT 设备具有不同的硬件能力,面向 IoT 的 MiniApp 具有其独特特性,包括:

6. 安全和隐私 考虑

MiniApp 利用 HTTPS 来支持安全连接。同一宿主环境中的多个 MiniApps 彼此独立。

MiniApp 中的用户交互需要不同级别的用户权限:

权限 用户交互
默认(无需额外操作) 页面分享、剪贴板、振动、指南针、运动传感器、地图、屏幕亮度、屏幕 捕获、电池状态
首次使用时授权 地理定位、相机(扫描二维码)、网络状态、蓝牙、NFC
每次使用时授权 联系人、file-apis、添加到主屏幕、照片选择器、电话呼叫
使用 token 验证 推送
回调/消息传递 免密支付
请求密码 支付

从不同角度并根据不同安全级别,MiniApp 框架提供了 以下方法。

6.1 能力认证

对于具有高隐私风险的能力,MiniApp 要求开发者在 MiniApp 开发者平台上 申请使用此类特性的权限。申请包括理由、使用场景的详细 描述以及使用 demo。然后平台将根据 MiniApp 使用要求审查申请。 只有获批准的 MiniApps 才允许调用此类 接口。例如,获取用户手机号的能力就是具有高安全风险的能力之一。

6.2 用户授权

对于涉及用户隐私的接口,必须要求用户授权。MiniApp 将 这些敏感接口归类到若干授权 scopes 中,例如 locationalbumaddresscameracalendar 等。例如,当 MiniApp 试图调用相机能力但用户尚未授权时,会弹出一个窗口(见 下图)。因此,用户会明白此类隐私相关特性受到保护。同时,托管在不同 超级 应用中的 MiniApps,可能会根据每个超级应用的使用特征和 使用场景,具有一些不同的隐私授权 scopes

用户授权
16 用户授权

6.3 MiniApp 审核审查

MiniApp 包在发布前会由 MiniApp 平台审查。开发者必须遵循 MiniApp 平台运营条款,因为该平台是他们发布新版 MiniApp 的唯一途径。 平台审核涉及许多方面,例如数据收集、数据使用、数据安全和 地理位置。

6.4 域名检查

对于某些容器组件,例如可能渲染在线网页的 <web-view>, MiniApp 用户代理可能会限制该组件访问的 URL。只有在 MiniApp 管理中心配置的域名才能在 <web-view> 中访问。此外,如果该组件 包含 <iframe>,则 iframe 打开的 URL 也应 在 MiniApp 管理中心中配置。通过这种方式,MiniApp 平台可以对 MiniApp 打开的动态页面进行更强健的控制。

类似地,MiniApp 框架会验证异步请求地址的合法性。

例如,对于由 request、download、upload 等发起的 URL,其域名必须属于 MiniApp 管理中心配置的域名,并且其协议必须是 HTTPS 协议,以 确保数据传输安全。

7. 全球范围内的 MiniApp 标准化

尽管 MiniApp 起源于中国,但它在全球范围内越来越受欢迎。类似的产品形态 已在世界其他地区出现,包括日本、韩国、东南亚、美国、欧洲和非洲。 MiniApp 技术的标准化已经引起全球 Web 社区的广泛关注。 因此,MiniApp 标准协作成为一项共同的国际努力。

7.1 更广泛 Web 社区中关于 MiniApp 的讨论

第一次关于 MiniApp 标准化的全球 Web 社区讨论是在福冈举行的 TPAC 2019 期间。会议期间组织了一场分会场会议, MiniApp 厂商在会上介绍了 MiniApp 技术以及 MiniApp 标准的必要性。与会者 讨论了 MiniApp 标准化的可能方向,例如打包、manifest、 生命周期和小组件。特别努力避免 MiniApp 标准与 当前 Web 标准工作之间的重叠,并增强 MiniApp 平台与 Web 之间以及 不同 MiniApp 平台之间的互操作性。MiniApps Ecosystem Community Group 在此次讨论后立即成立,并开始孵化 MiniApp 规范。

在虚拟 TPAC 2020 期间,有一场题为 Learning from Mini Apps 的分会场会议。在这场分会场会议中,专家们讨论了 MiniApp 的抽象形态以及 MiniApps 可能具备的强大特性。此外,该会议还分享了人们如何通过 各种开发工具构建 MiniApp。随后进行了开放讨论,重点关注 Web 开发者 可以从 MiniApp 及其开发者体验中学到什么。

7.2 CJK 中的 MiniApp

亚洲市场中的 MiniApp 产品形态和技术具有许多相似之处。为了汇聚全球 社区,尤其是中国、日本和韩国参与者,围绕各地区的 MiniApp 生态系统进行交流,并讨论 MiniApps 标准化工作的未来,W3C MiniApps Working GroupMiniApps Ecosystem Community Group 于 2021 年 4 月组织了 首届 MiniApps CJK 会议。来自 30 多个组织的约 90 名参与者参加了 讨论,并就 MiniApp 生态系统、技术架构、框架以及车载 MiniApp 等新场景中的 MiniApps 交换了想法。关于讨论的粗略结论是,随着 MiniApps Working Group 中 MiniApp 标准的发展顺利推进,现在是时候开始 MiniApp 标准在安全、隐私、无障碍以及国际化方面的横向审查; 同时,在 MiniApp 中利用 IoT 技术可能是 MiniApp 新场景中一个非常有前景的方向, 全球 MiniApp 社区将有很好的机会 在相关标准化工作上开展合作。

7.3 欧洲的 MiniApps

虽然欧洲只有少数 MiniApps 案例,但这一概念正在受到关注;并且 社区已经开始探索这些技术,寻找传统应用市场之外的新商业模式和创新。

2021 年,一组利益相关方,包括三家 W3C 成员,发起了 Quick App Initiative,这是一个面向开源的兴趣小组,对任何组织和个人开放,并 由开放协作驱动。该小组由 OW2 托管,OW2 是一家位于 法国的独立非营利组织,该小组遵循透明流程,旨在从厂商中立角度推动 W3C 工作,并专注于 宣传推广、实现以及从欧洲市场 视角收集标准化需求。

8. W3C 中的前进方向

为了满足 MiniApps 的用例和需求,使 Web 标准更好地支持 MiniApp, 探索用户代理创新,并丰富 Web,我们希望在 W3C 中设立一个小组, 并纳入以下工作:

具体而言,应进一步研究以下技术工作:

注:当前 MiniApp APIs 与 Web APIs 之间的进一步差距将并行分析。

9. 术语表

中文 英文 定义
小程序 Mini Program 运行在原生应用中的一种 MiniApp 形式。
快应用 Quick App 由快应用联盟中的 12 家手机制造商开发的一种 MiniApp 标准。
渲染环境 rendering view 原生视图或 WebView。
智能助理(负一屏) smart assistant 一种为便利提供服务的智能助理,通常位于主屏幕左侧。
热更新 hot reload 修复或更新特性时无需重新安装。在 MiniApps 中,由于一部分 框架使用 JavaScript 实现,因此 MiniApp runtime 可以热重载。

A. 差距分析

请查看 MiniApps、W3C 规范和 PWAs 中 APIs 的对比表

B. 致谢

非常感谢 Guanyu Liu(360)、He Du(Xiaomi)、Hongguang Dong(Xiaomi)、Xiaoqian Wu(W3C)、Yi Shen(Baidu)、Yefeng Xia(China Mobile),他们也 为本文档作出了贡献。

C. 参考文献

C.1 资料性参考文献

[APPMANIFEST]
Web Application Manifest。Marcos Caceres; Kenneth Christiansen; Matt Giuca; Aaron Gustafson; Daniel Murphy; Anssi Kostiainen。W3C。2022 年 2 月 17 日。W3C 工作草案。URL:https://www.w3.org/TR/appmanifest/
[MANIFEST-APP-INFO]
Web App Manifest - Application Information。Aaron Gustafson。W3C。2021 年 9 月 30 日。W3C 工作组说明。 URL:https://www.w3.org/TR/manifest-app-info/
[MINIAPP-ADDRESSING]
MiniApp Addressing。Dan Zhou; Qian Liu; shuo wang; Tengyuan Zhang。W3C。2022 年 6 月 27 日。W3C 工作组说明。URL:https://www.w3.org/TR/miniapp-addressing/
[MINIAPP-LIFECYCLE]
MiniApp Lifecycle。Qing An; Haoyang Xu。W3C。2022 年 5 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/miniapp-lifecycle/
[MINIAPP-MANIFEST]
MiniApp Manifest。Martin Alvarez-Espinar; Yongjing ZHANG。W3C。2022 年 5 月 17 日。W3C 工作草案。URL:https://www.w3.org/TR/miniapp-manifest/
[MINIAPP-PACKAGING]
MiniApp Packaging。Martin Alvarez-Espinar; Qing An; Tengyuan Zhang; Yongjing ZHANG; Dan Zhou。W3C。2022 年 4 月 28 日。W3C 工作 草案。URL:https://www.w3.org/TR/miniapp-packaging/
[MINIAPP-WIDGET-REQ]
MiniApp Widget Requirements。 Chen Yinli; Canfeng Chen; Bingqing Zhou; Bin Guo。W3C。2022 年 4 月 24 日。W3C 工作组说明。URL: https://www.w3.org/TR/miniapp-widget-req/