Copyright © 2019-2022 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本文档介绍了一种新的移动应用格式,名为 MiniApp,它是一种非常流行的混合 解决方案,依赖 Web 技术,同时也集成了原生应用的能力。
本节描述本文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 https://www.w3.org/TR/ 上的 W3C 技术 报告索引中找到。
本文档由 MiniApps 工作 组作为 小组草案说明使用 说明轨道发布。
小组草案说明不代表 W3C 或其成员的认可。
这是一份草案文档,可能随时被其他文档更新、替代或废弃。 除作为进行中的工作外,不应以其他方式引用本文档。
W3C 专利 政策 对本文档不附带任何许可要求或承诺。
本文档受 2021 年 11 月 2 日 W3C 流程文档管辖。
原生应用在我们的日常生活中广受欢迎,但对用户而言,仍有许多事情可以做得更好。
在用户从原生应用获得服务之前,他们通常必须经历 下载 -> 安装 -> 注册该应用的过程。
由于存储能力的限制,用户只能在手机上保留数量有限的原生应用。
在不同原生应用之间共享数据并不容易。
为了开发原生应用,开发者可能需要学习几种新的编程语言。
为了提供与原生应用相同的服务,开发者可能需要为不同平台维护重复的产品。
Web 是避免这些问题的理想平台,但目前它仍远不完善。
与原生应用相比,它并不容易利用系统提供的能力。
此外,通常也很难设计出性能真正能匹配或超越类似原生应用的 Web 应用。
在移动设备上,用户经常在浏览器之外获取服务或内容;因此,他们自然希望自己所有应用在用户账号、登录状态以及整个系统中的用户 交互方面保持一致。
此外,有时如果用户确实信任某个应用,也可能想与其共享一些数据。不过,对于一些经常被请求的信息, 例如当前设备的个人手机号码或联系人列表,在 Web 上尚无一种很好的方式让用户授予许可。
MiniApp 是一种新的移动应用格式,是一种依赖 Web 技术(尤其是 CSS 和 JavaScript)并集成原生应用能力的混合解决方案。
超级应用是一个托管并支持其他 应用(即 MiniApps)的软件平台,使它们能够使用该平台的资源来执行。
MiniApps 因在一些超级应用中的使用而流行起来,因为它与生俱来具有一些 有助于填补 Web 与原生应用之间差距的特征。
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 用户代理,如下 图所示。
附录中的对比表识别并突出显示了 渐进式 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 |
MiniApp 开发者可以简单地使用 HTML/CSS/JavaScript 作为编程语言,但 MiniApp 更灵活,因此它擅长在日常工作中快速开发复杂功能。
该 MiniApp 试图用 AI 技术构建一个 AR 动物园来识别动物。开发者可以 通过添加一些提供原生能力或高级功能访问能力的组件或 API,轻松做到这一点(例如,图像识别、AR 3D 动物模型渲染、用于语音 合成的语音 API,以及由地图 SDK 提供的 AR 导航)。
MiniApps 可以被搜索引擎、托管 应用中的 MiniApp 商店或二维码发现。
对于开发者而言,开发 MiniApps 的激励非常明显。
| Web | 原生应用 | MiniApp | |
|---|---|---|---|
| 可发现性 | 搜索引擎 | 应用市场 | 多种方式:搜索引擎 + 托管应用中的 MiniApp 商店 + 二维码 |
| 已验证/可信 | 仍在探索 | 由原生应用市场验证 | 由宿主应用平台验证 |
| 部署/重新加载 | 加载/重新加载网页 | 安装/重新安装 | 由于使用 JavaScript 引擎,因此可加载/重新加载 |
| 编程语言 | Web 编程语言 | 新的/多种语言:至少包括 iOS 和 Android | Web 编程语言 |
| API/组件(AR、图像识别、地理定位、语音 API) | 非常基础 | 对 Web 开发者而言较复杂 | 非常简单的高级 API 和组件 |
MiniApp 的目标之一是连接不同平台上的信息和服务,因此 它非常适合 IoT 应用,例如智能汽车、语音控制音箱和智能电视。
如今,可以转换一些 MiniApps 以适配车载屏幕和系统。此外,一些 MiniApp 厂商已经构建了专为车载系统设计的 MiniApp 平台,以帮助 向各种车型分发或升级应用。这将数百万 Web 开发者带入了 汽车应用生态系统。
这些汽车 MiniApps 可以服务许多用户场景,包括加油、洗车、 电子不停车收费、保险、餐厅预订或娱乐。例如,当 系统检测到剩余燃油少于 20% 时,可以向车主推荐一个加油 MiniApp。用户可以获得最近加油站的信息并前往那里完成 加油,包括在 MiniApp 内完成支付,实现“加油不用下车”。
IoT 设备正在成为运行 MiniApps 的另一种载体。面向 IoT 的 MiniApp 旨在实现 多个 IoT 设备平台和操作系统之间的互操作性。通过 引入面向 IoT 的 MiniApps,开发者无需处理多个 IoT 设备平台和 IoT 操作系统之间的 差异,只需要专注于 IoT 设备上的应用开发。
一个示例是 HVAC(供暖、通风和空调) 应用开关面板,它具有屏幕和几个物理按钮。在这种情况下,通过 引入面向 IoT 的 MiniApp,开关面板的屏幕 UI 可以使用 Web 技术来设计和开发,以显示 HVAC 信息。例如,可以显示由 物理按钮输入的目标温度值以及测得的实时温度值。
另一个示例是带触摸屏的智能音箱。在这种情况下,通过引入面向 IoT 的 MiniApp, 智能音箱的触摸屏 UI 可以使用 Web 技术进行设计和开发,用于播放 音乐和视频、控制家中的 IoT 设备以及在线购物。
与运行在手机上的 MiniApps 不同,手机上的用户交互依赖于触摸屏,而 运行在电视上的 MiniApps 的用户交互切换为电视遥控器面板键盘加电视屏幕 焦点。
通过面向电视的 MiniApp,用户可以通过电子商务 MiniApp 在电视上购买商品。
此外,用户还可以通过游戏 MiniApps 在电视上玩游戏。
在 MiniApp 中,视图层通常与逻辑层分离。
视图层负责渲染 MiniApp 页面,包括 Web 组件和原生 组件的显示,这可以被视为混合渲染。例如,某些 Web 组件可能 不受 WebView 支持或存在性能限制,因此 MiniApp 也依赖原生 组件,例如地图、视频等。
逻辑层使用 JavaScript Workers 实现。worker 负责 MiniApp 的事件 处理、API 调用和生命周期管理。
扩展的原生能力通常来自托管原生应用或操作系统,包括支付、文件 处理、图像扫描、电话呼叫等。这些特性通过特定 API 调用。当 MiniApp 调用原生 API 时,它会通过 JavaScript Bridge 将 API 调用传递给扩展的 原生能力以供进一步处理。它再通过 JavaScript Bridge 从扩展的原生能力获取 结果。
worker 为每个 Render 建立连接,将需要渲染的数据传输给 Render 以供进一步处理。
如果某个事件由 MiniApp 页面中的组件触发,该页面的 Render 会将事件发送给 worker 以供进一步处理。同时,Render 会等待 worker 发送的数据,以重新渲染 MiniApp 页面。
渲染可以被视为无状态,所有状态都将存储在 worker 中。
分离视图层和逻辑层的好处包括:
MiniApp 平台提供许多组件,帮助开发者构建精美的 UI,包括基本
组件,如 view、form、image,以及高级组件
如地图。
MiniApp 厂商也为开发者提供许多 API,以访问 Web 和原生 能力,包括 UI 显示 API、图像处理 API 等基础接口,以及 用户账号 API、地图 API 和支付 API 等高级接口。
API 通常与组件协同工作。当用户点击 MiniApp 页面上的某个组件时, 它会调用相关 API 来完成用户交互,并在需要时刷新当前 MiniApp 页面。
为了获得与原生应用类似的用户体验,MiniApp 资源通常会被打包 在一起。下载并安装 MiniApp 包后,MiniApp 所需的所有静态资源(即页面 模板、CSS、JavaScript 文件和其他文档)会保留在用户的 设备上。这些资源在下一次更新之前始终可用,无需任何重复下载。
MiniApp 包是一个压缩的 ZIP 归档文件,包括:
为了在搜索和执行时定位特定的 MiniApp,MiniApp 必须在平台上具有 包名或标识符。还需要一个图标用于用户识别。
除了 MiniApp 页面之外,MiniApps 还可以显示为信息片段或 MiniApp 小组件。在这种形式下,开发者可以将其服务和/或内容放入各种宿主场景, 称为宿主环境(例如助手、设备全局搜索等)。此特性 将 MiniApp 的服务和内容与具体场景连接起来,为用户提供 更多便利。
例如,当用户购买旅行火车票时,智能助手上的 MiniApp 小组件会立即显示火车的最新状态。 用户可以点击该小组件,并跳转到全屏 MiniApp 页面以查看更多详细 信息。
与 MiniApp 页面类似,小组件也由 URI scheme 描述。宿主环境通过 URI 路径指定要加载的 MiniApp 包及对应小组件,并通过 URI 查询参数将数据传递给小组件。小组件加载后,会在 宿主环境中显示和渲染。来自宿主和小组件的数据,以及来自不同小组件的数据 都会被隔离,以确保安全性和独立性。
在许多场景中,小组件可以打开 MiniApp 页面以执行更复杂的操作。在这种情况下, 小组件通常需要与其对应的 MiniApp 共享数据(例如,保持一致的登录 状态)。因此,小组件和 MiniApp 的数据可以由双方访问。换 言之,MiniApp 小组件和页面拥有相同的数据访问权限。
小组件的目标之一是让用户忘记传统应用概念,并真正以服务的形式满足 用户需求。因此,除了所有应用调用路径外,小组件还可以 在不同场景中通过不同方式触发,例如文本关键词、语音 分析、图片识别、扫码和事件意图。
注:小组件由中国市场中的快应用实现。
发现、打开和访问 MiniApps 有多个入口。与多 WebView 中的 Web 内容不同,同一个 MiniApp 只会创建一个实例,因此 MiniApp 会在全局范围内以一致方式保持其状态和 数据。例如,当一个用户第一次通过二维码入口打开并登录 MiniApp 后, 当用户下次从 MiniApp 商店等其他入口返回时,用户仍将保持登录状态。
MiniApps 的入口包括但不限于:
MiniApps 尝试通过一些在实践中被证明有效的机制来提升其性能和用户体验。
借助 MiniApp 的构造器,用户只需要在第一次打开 MiniApp 时下载包,之后 MiniApp 中的静态资源(例如页面、 脚本和 CSS)无需再次下载,从而使后续页面的加载和 跳转更加高效。此特性提升了用户体验并 节省了网络流量。
同时,MiniApp 具有预下载机制,可以提前下载 MiniApp 包, 或者针对首个页面单独预下载,并在下载过程中并行执行流式 解压,以尽量减少 MiniApp 启动 阶段的耗时,并平衡首次打开时首页性能的损失。
MiniApp 使用原生页面栈来管理渲染视图之间的关系,页面切换由 原生代码驱动。因此,页面中的手势操作、页面之间的 切换可以获得与原生应用完全相同的流畅体验。
由于视图层和逻辑层相互隔离,视图层可以独立 渲染。在不被 JavaScript 逻辑代码阻塞的情况下, 页面渲染速度可以得到极大提升。
MiniApp 的运行时环境通常会在启动 mini-app 之前预构建,从而减少 启动 MiniApp 的时间。预构建内容包括渲染视图、静态资源、 开发者定义的预取请求以及 MiniApps 运行时容器。MiniApp 激活后,会接管预构建的渲染视图,然后我们会继续 将新的渲染视图预构建到缓存池中以供下一个使用。渲染 视图数量存在限制。当任何渲染视图被关闭或数量限制被超过时, 最早打开的渲染视图将被销毁。当 MiniApp 应用退出时,运行时 会被销毁,并且应用环境和资源可以被复用。
MiniApp 平台提供非常丰富的组件和 API。 这些组件和 API 通常经过良好设计,以满足开发者的性能 需求。
MiniApp 的运行时环境包含两大部分:由 原生代码提供的基础能力,以及一个框架,其中包括开发者 API 和一些由 JavaScript 实现的组件。JavaScript 框架内置于原生应用中,并会在执行 MiniApp 之前 预先加载到 MiniApp 运行时环境中。JavaScript 框架可以热重载(使用过程中重新加载),这为 提升性能带来了许多可能性。
MiniApp 平台为用户登录 MiniApp 提供了多种方式。如果用户已经 通过身份认证登录到平台,则平台的登录信息可以与 MiniApp 共享, 快速实现 MiniApp 自身账号 系统与平台账号系统的互通,使 MiniApp 的访问流程更加顺畅。
例如,传统的 SMS 验证登录流程更耗时;用户需要 先手动输入手机号,然后在收到 SMS 后输入验证码才能登录。MiniApp 的优势在于,开发者可以使用平台提供的组件 / API, 安全且便捷地获取用户手机号,提示 用户授权使用手机号进行一键登录,这使 整个流程对用户而言更加简单,也降低了开发者获取用户信息的成本。
MiniApp 分包是一种用于改进 MiniApp 包开发过程的构建机制。它 帮助开发者将不同业务模块划分到不同子包中。
对于开发者:MiniApp 默认具有主包;它包含启动页面文件和 公共资源。子包是一种构建类型,可灵活划分开发者的业务 模块。用户可以在按需加载不同子包后打开特殊页面。
对于用户:当用户启动 MiniApp 时,默认会下载主包,并 启动主包中的页面。如果用户需要打开子包中的页面, MiniApp Runtime 将开始下载并加载子包,并启动子包页面。
通过这样的分包构建机制,在多个 团队共同开发时更有利于解耦和协作。当用户使用 MiniApps 时,分包机制可以提高 MiniApp 首页的 加载速度,按需加载子包,并优化用户体验。
在 MiniApp 中,add-on/extension 是一个封装模块,可向 现有 MiniApp 添加特定功能,它可以是组件、JavaScript 模块或页面。add-on/extension 只能在 MiniApp 中执行,而不能单独运行。开发者可以像开发 MiniApp 一样开发 add-on/extension,并将其上传到 MiniApp 平台,以供其他 MiniApps 复用。
MiniApp 支持 add-on/extensions 以:
add-on/extension 机制降低了开发 MiniApps 的门槛,并将更多开发者 带入 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 连接为一个整体。
PC 上的 MiniApps 仍处于早期探索阶段。360 PC MiniApp 是一种运行在其 PC 浏览器中的轻应用。与传统网页相比,它提供了更多 功能,并且更容易与 PC 操作系统交互。
PC MiniApps 仅向通过企业账号验证的用户开放。大多数特性 都受到严格监管,因此它们可以被视为高度可信的 Web 内容。
PWAs 是概括现代 Web 应用的最新术语。作为原生应用的对应物,PWA 外观和体验都像原生应用,并且可以安装到设备主 屏幕/启动器/开始菜单;它可以发送推送通知以重新吸引用户;它可以在离线时使用, 并能在网络状况不佳时运行;它适用于能力范围广泛的设备, 并且仍在演进以配合开放 Web 标准定义的新能力;用户可以在 PWAs 应用内完成支付;并且 PWAs 应用 对搜索引擎友好,能够完美配合超链接。PWAs 在技术和 商业方面都取得了成功(被许多网站广泛采用,尤其是在面向消费者的网站中)。
本节选择了一些典型用例,并提出了若干 MiniApps 希望从 Web 获得支持的 API。
MiniApp 是 Web 渲染和原生渲染的混合解决方案。如果有一种好 方法可以结合来自 Web 和原生的渲染结果,那将会很棒。
提议:MiniApp 需要一个标准化 API,以帮助将原生渲染结果集成到 Web 渲染结果中。
MiniApp 希望在页面切换期间提供过渡动画,使用户可以获得 与使用原生应用时类似的体验,但现在几乎不可能做到这一点。
提议:MiniApp 需要一个 API,用于在 MiniApp 页面切换期间添加过渡动画。
MiniApp 可以通过标准化分发格式,为多个 MiniApp 托管平台形成一套包和解析约定。 目前,每个 MiniApp 托管平台都提供不同的 开发工具(不同的打包方式),并且 MiniApp 在不同的 MiniApp 托管环境中会被不同地解析。
提议:MiniApp 实际上是在分发 过程中打包(压缩)的文件集合。我们可以用统一的文件后缀描述 MiniApp(.ma),并指定如何创建 .ma 文件以及如何解析 .ma 文件。
类似 Android 小组件或 Apple dashboard,用户可以直接获取信息和/或完成任务, 而无需打开任何 Web 或应用页面。MiniApp 小组件可以显示在 Web 浏览器之外的环境中,例如桌面或 dashboard。
提议:
MiniApp 需要知道 MiniApp 页面可交互时间(TTI)何时完成。
提议:一个标准化事件,用于通知 MiniApp 页面可交互时间已经 完成。
3D 模型凭借其丰富细节变得越来越流行。结合 AR,它们将 提供比 2D 更好的用户体验。业务案例可能包括在线购物、 广告、教育等。然而,当前 Web 缺少一种标准且便捷的方式来处理 3D 模型。在本文档中,我们提议定义一个 HTML 标签,用于直接处理 3D 模型, 类似于我们使用相应 HTML 标签处理音频、视频和图像的方式:
用户可以通过手势从不同角度查看 3D 模型。并且 3D 模型也可以放大/ 缩小。它可以全屏查看,也可以嵌入网页中,与 其他 HTML 内容一起显示。
用户可以借助相机将 3D 模型放置在真实世界中。用户可以指定不同的 位置来放置该模型。
提议:一个 <xmodel> 元素,用于在 Web 上指定 3D 模型并支持
带 AR 的交互式 3D 内容。
人脸跟踪可用于许多 3D 场景。
提议:一个 Face Tracking API 使用视频元素作为输入,并每帧更新人脸跟踪输出, 其包括:
手势可以用于视频特效和 AR/VR 游戏场景,使应用更具表现力和 交互性。
提议:一个高级 API,用于跟踪手部运动并获取手部轮廓。
MiniApps 中有一些 AR API 是我们希望迁移到 Web 的,因为它们有助于在游戏、3D 模型预览和互动广告中提供更好的 AR 体验。
提议:提供基于 ARCore 和 ARKit 的低级 AR API,其中包括:
[MINIAPP-LIFECYCLE] 定义了 MiniApp 生命周期事件以及 管理 MiniApp 和每个页面生命周期的过程。实现本规范使 用户代理能够管理全局应用生命周期和页面 生命周期的生命周期事件。
如 2.1.1 将视图层与逻辑层分离 中所述,在 MiniApp 中, 视图层与逻辑层分离。视图层负责渲染 MiniApp 页面, 包括 Web 渲染和原生渲染,这可以被视为混合渲染。逻辑层 使用 JavaScript Worker 实现。逻辑层负责 MiniApp 的事件处理、 API 调用和生命周期管理。
MiniApp 生命周期机制提供了一种通过 MiniApp 全局应用生命周期事件和 MiniApp 页面生命周期事件来管理 MiniApp 视图层和逻辑层的方法。了解 MiniApp 全局应用生命周期状态和 MiniApp 页面生命周期状态来开发 MiniApp,可以带来 更好的用户体验。MiniApp 生命周期包括一组事件,MiniApp 可以借助这些事件 根据自身状态选择改变其行为。
[MINIAPP-MANIFEST] 是定义用于描述 MiniApps 的一组 元数据的规范。MiniApp Manifest 扩展了 [APPMANIFEST] 和 [MANIFEST-APP-INFO] 规范, 提供附加机制来设置 MiniApp 的基本信息,例如标识、 人类可读的描述、版本数据和样式信息。MiniApp manifest 还 配置作为 MiniApp 一部分的页面和小组件的路由。
MiniApp manifest 是一个 JSON 文档,它使用 Web App Manifest 的一些基本元素来描述
MiniApp(name、short_name、description 和 icons),
并添加九个补充成员来指定 MiniApp 的技术细节(app_id、
version、platform_version、device_type、pages、
req_permissions 和 widgets),以及配置应用的外观和感觉
(color_scheme 和 window)。
[MINIAPP-PACKAGING] 定义了 MiniApp 包的语义和一致性 要求,以及用于保存 MiniApp 资源的容器结构,包括页面组件 (即模板、样式表和 JavaScript 逻辑)、manifest 以及其他媒体文件或配置资源。
本规范确定 MiniApps 的逻辑结构和物理结构,规定了 基于 ZIP 的容器在文件系统组织和处理方面的要求,该容器用于打包 MiniApp。 MiniApp 包实例有助于 MiniApp 在运行时 环境或 MiniApp 用户代理中的分发和执行。
[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 包的示例流程。
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 规范进行技术开发。
2021 年,工作组发布了两份文档,[MINIAPP-MANIFEST] 和 [MINIAPP-LIFECYCLE]。与此同时,各厂商已有一些
标准前实现。为了验证标准的可行性并兼容
标准前实现,工作组开发了一个工具,用于将 MiniApp 标准
Manifest 转换为不同的标准前 manifest 文件,例如百度的 App.json 和 HarmonyOS
FA 的 config.json。并且在 2021 年 TPAC 分会场会议中,工作组演示了该
工具的 demo。
随着标准和预部署的进展,工作组计划完善这些工具,以支持 完整、标准化的开发方法,其中可能包括 Packaging、Addressing、Lifecycle、UI components 和 APIs。
MiniApp 组件是用于定义构成 MiniApp 的页面结构、内容和逻辑的构建块。 每个组件都封装功能、数据和样式,使开发者能够 构建可复用且可定制的项目。
MiniApp UI Components 规范收集了一组基本元素,开发者可以使用这些元素 在 MiniApp 平台之间构建同质但可定制的用户界面。
本规范不引用 HTML 和 CSS 的特定版本。它指向最新的 W3C 推荐标准,以保证采用和 实现 HTML 和 CSS 标准的变更。MiniApp 用户代理厂商和 开发者都需要跟踪这些规范的变化,以确保其流程和 系统保持最新。
本规范基于 Web Components 定义了一组在所有 MiniApp 规范中通用的预定义元素。
面向 IoT 的 MiniApp 描述了 MiniApp 面向 IoT 的用例。根据这些用例,本规范定义了面向 IoT 的 MiniApp 架构。文中规定了如何 复用和扩展 MiniApp Packaging 与 MiniApp Lifecycle。此外,还 为面向 IoT 的 MiniApp APIs 规定了若干 API。
面向 IoT 的 MiniApp 与运行在手机和 PC 上的 MiniApps 具有类似架构。但由于 IoT 设备具有不同的硬件能力,面向 IoT 的 MiniApp 具有其独特特性,包括:
MiniApp 利用 HTTPS 来支持安全连接。同一宿主环境中的多个 MiniApps 彼此独立。
MiniApp 中的用户交互需要不同级别的用户权限:
| 权限 | 用户交互 |
|---|---|
| 默认(无需额外操作) | 页面分享、剪贴板、振动、指南针、运动传感器、地图、屏幕亮度、屏幕 捕获、电池状态 |
| 首次使用时授权 | 地理定位、相机(扫描二维码)、网络状态、蓝牙、NFC |
| 每次使用时授权 | 联系人、file-apis、添加到主屏幕、照片选择器、电话呼叫 |
| 使用 token 验证 | 推送 |
| 回调/消息传递 | 免密支付 |
| 请求密码 | 支付 |
从不同角度并根据不同安全级别,MiniApp 框架提供了 以下方法。
对于具有高隐私风险的能力,MiniApp 要求开发者在 MiniApp 开发者平台上 申请使用此类特性的权限。申请包括理由、使用场景的详细 描述以及使用 demo。然后平台将根据 MiniApp 使用要求审查申请。 只有获批准的 MiniApps 才允许调用此类 接口。例如,获取用户手机号的能力就是具有高安全风险的能力之一。
MiniApp 包在发布前会由 MiniApp 平台审查。开发者必须遵循 MiniApp 平台运营条款,因为该平台是他们发布新版 MiniApp 的唯一途径。 平台审核涉及许多方面,例如数据收集、数据使用、数据安全和 地理位置。
对于某些容器组件,例如可能渲染在线网页的 <web-view>,
MiniApp 用户代理可能会限制该组件访问的 URL。只有在
MiniApp 管理中心配置的域名才能在 <web-view> 中访问。此外,如果该组件
包含 <iframe>,则 iframe 打开的 URL 也应
在 MiniApp 管理中心中配置。通过这种方式,MiniApp 平台可以对
MiniApp 打开的动态页面进行更强健的控制。
类似地,MiniApp 框架会验证异步请求地址的合法性。
例如,对于由 request、download、upload 等发起的 URL,其域名必须属于 MiniApp 管理中心配置的域名,并且其协议必须是 HTTPS 协议,以 确保数据传输安全。
尽管 MiniApp 起源于中国,但它在全球范围内越来越受欢迎。类似的产品形态 已在世界其他地区出现,包括日本、韩国、东南亚、美国、欧洲和非洲。 MiniApp 技术的标准化已经引起全球 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 及其开发者体验中学到什么。
亚洲市场中的 MiniApp 产品形态和技术具有许多相似之处。为了汇聚全球 社区,尤其是中国、日本和韩国参与者,围绕各地区的 MiniApp 生态系统进行交流,并讨论 MiniApps 标准化工作的未来,W3C MiniApps Working Group 和 MiniApps Ecosystem Community Group 于 2021 年 4 月组织了 首届 MiniApps CJK 会议。来自 30 多个组织的约 90 名参与者参加了 讨论,并就 MiniApp 生态系统、技术架构、框架以及车载 MiniApp 等新场景中的 MiniApps 交换了想法。关于讨论的粗略结论是,随着 MiniApps Working Group 中 MiniApp 标准的发展顺利推进,现在是时候开始 MiniApp 标准在安全、隐私、无障碍以及国际化方面的横向审查; 同时,在 MiniApp 中利用 IoT 技术可能是 MiniApp 新场景中一个非常有前景的方向, 全球 MiniApp 社区将有很好的机会 在相关标准化工作上开展合作。
虽然欧洲只有少数 MiniApps 案例,但这一概念正在受到关注;并且 社区已经开始探索这些技术,寻找传统应用市场之外的新商业模式和创新。
2021 年,一组利益相关方,包括三家 W3C 成员,发起了 Quick App Initiative,这是一个面向开源的兴趣小组,对任何组织和个人开放,并 由开放协作驱动。该小组由 OW2 托管,OW2 是一家位于 法国的独立非营利组织,该小组遵循透明流程,旨在从厂商中立角度推动 W3C 工作,并专注于 宣传推广、实现以及从欧洲市场 视角收集标准化需求。
为了满足 MiniApps 的用例和需求,使 Web 标准更好地支持 MiniApp, 探索用户代理创新,并丰富 Web,我们希望在 W3C 中设立一个小组, 并纳入以下工作:
具体而言,应进一步研究以下技术工作:
注:当前 MiniApp APIs 与 Web APIs 之间的进一步差距将并行分析。
| 中文 | 英文 | 定义 |
|---|---|---|
| 小程序 | Mini Program | 运行在原生应用中的一种 MiniApp 形式。 |
| 快应用 | Quick App | 由快应用联盟中的 12 家手机制造商开发的一种 MiniApp 标准。 |
| 渲染环境 | rendering view | 原生视图或 WebView。 |
| 智能助理(负一屏) | smart assistant | 一种为便利提供服务的智能助理,通常位于主屏幕左侧。 |
| 热更新 | hot reload | 修复或更新特性时无需重新安装。在 MiniApps 中,由于一部分 框架使用 JavaScript 实现,因此 MiniApp runtime 可以热重载。 |
非常感谢 Guanyu Liu(360)、He Du(Xiaomi)、Hongguang Dong(Xiaomi)、Xiaoqian Wu(W3C)、Yi Shen(Baidu)、Yefeng Xia(China Mobile),他们也 为本文档作出了贡献。
Referenced in: