Skip to content

清单(manifest.json) ​

manifest.json 放在项目(和小程序包)的根目录,描述内容是什么、需要什么。

json
{
  "id": "com.example.day-progress",
  "name": { "en": "Day Progress", "zh-Hans": "今日进度" },
  "type": "widget",
  "version": "1.0.0",
  "apiVersion": 1,
  "author": "Example",
  "icon": "assets/icon.png",
  "widget": { "sizes": ["small", "medium"] },
  "parameters": [
    { "key": "accent", "title": "强调色", "type": "color", "default": "#0A84FF" }
  ]
}
字段必填说明
id是反向域名形式的唯一标识符,只能包含字母、数字、点和连字符,例如 com.example.clock
name是显示在资源库里的名称,可以翻译,见多语言
type是wallpaper(壁纸)、widget(小组件)、pet(桌面伙伴)
version是版本号,建议使用语义化版本,例如 1.0.0
apiVersion需要的最低运行时 API 版本,见 API 版本
author作者,显示在详情栏
description一两句话的介绍,可以翻译
icon、preview包内相对路径的图标和预览图
widget.sizes小组件支持的尺寸:small 164×164、medium 344×164、large 344×344,缺省为 small
wallpaper.span为 true 时壁纸可以跨所有显示器,见跨显示器
permissions需要的权限,见权限
parameters用户可调的选项,见选项

desktopengine validate 按应用的规则检查清单,应用会拒绝导入不合规则的包。

JSON Schema ​

在清单里加上 $schema,编辑器(例如 VS Code)就能补全和检查字段:

json
{
  "$schema": "https://desktopengine.app/desktopengine-sdk/manifest.schema.json",
  "id": "com.example.day-progress"
}

同一份 Schema 也在 npm 包的 schema/manifest.schema.json 里。

多语言 ​

name、description、选项的 title 和 options[].title 可以是一个字符串,也可以按语言给出翻译,应用按用户的首选语言挑选,都不匹配时用 en:

json
"name": { "en": "Day Progress", "zh-Hans": "今日进度" }

语言代码与 macOS 一致,例如 en、zh-Hans、zh-Hant、ja,zh-CN 这样带地区的也能匹配。画在画布上的文字由代码自己翻译,按 DesktopEngine.launchOptions.locale 挑选。

选项(parameters) ​

开发者只声明有哪些选项,应用在详情栏里统一画成系统表单,不需要自己做设置界面。

json
{ "key": "accent", "title": "强调色", "type": "color", "default": "#0A84FF" }
type控件default
toggle开关布尔值
number同时有 min 和 max 时为滑块(step 为步长),否则为数字输入框数字
text文本框字符串
color颜色选择器#RRGGBB
choice弹出菜单,options 为 [{ "value": …, "title": "…" }]某个 value

用户修改选项后,新的取值在 DesktopEngine.launchOptions.parameters 里。监听了 parameterschange 的内容会在运行中应用它们,见选项改变时;其他内容由应用重新启动(连续拖动滑块或输入时会合并成一次)。

权限(permissions) ​

权限含义
network连接互联网
files读取用户选择的文件
audio播放声音
system-infoCPU、内存、网络用量
now-playing正在播放的音乐
window-positions其他应用窗口的位置

应用在详情栏列出这些权限。audio 不询问:声明了就能发出声音,用户用音量和「所有内容静音」控制。其余权限在用户第一次把内容添加到桌面时逐项询问,用户可以只允许一部分,之后也能在详情栏里随时更改(内容会重新启动);内置内容不询问。没有声明权限的内容不会弹出询问。

被拒绝的权限不会阻止内容运行:内容照常启动,只是对应的能力关闭,所以要为没有权限的情况做好降级。实际得到的权限在 DesktopEngine.launchOptions.permissions 里:

js
const permissions = DesktopEngine.launchOptions?.permissions ?? [];
if (permissions.includes('network')) {
  refresh();
} else {
  showOfflineHint(); // 不要反复重试
}

由运行时强制执行的权限:network(没有它不能联网,见网络)、audio(没有它不能发出声音,见音频)、system-info(没有它 cpuUsage() / memoryUsage() 抛出错误)。files、now-playing、window-positions 目前还没有对应的 API,声明的作用是让用户知情。desktopengine dev 和「开发」菜单载入的内容由开发者自己运行,不询问,得到声明的全部权限;没有声明的同样用不了。

API 版本 ​

运行时有一个整数的 API 版本,新增 API 时递增,JavaScript 里是 DesktopEngine.apiVersion,当前的 SDK 对应的版本是 1(desktopengine --help 的第一行也会显示)。用到之后新增的 API 时,在清单的 "apiVersion" 写上它的版本,API 版本更低的应用会拒绝导入并提示用户更新;也可以不写,在运行时判断 DesktopEngine.apiVersion 后降级。

版本新增
1首个版本

SDK 以 Apache License 2.0 发布