# 宿主与用户

## platform.host

同步字符串属性。当前值为 `"web"`，不要写成 `platform.host()`。开发测试宿主分别返回 `"ios"`、`"macos"`、`"android"`；它们用于验证公共契约，完整原生客户端尚未交付。

## platform.can(name)

同步返回 boolean。Web runtime 支持以下能力；实际返回值取决于应用声明与本次宿主提供的能力集合：

| 名称 | 含义 |
| --- | --- |
| `data.read` | 数据发现和查询。 |
| `data.write` | 数据写入和删除。 |
| `ui` | 界面组件。 |
| `clipboard.write` | 宿主实现了剪贴板写入接口。 |
| `app.close` | 关闭当前应用。 |

兼容旧名称 `tables.read` 与 `tables.write`；新应用使用 `data.read` 与 `data.write`。未知名称返回 `false`，例如 `camera`、`fs`、`notify`。目前没有 `user` 或 `host` 对应的能力字符串。

`can` 不是用户授权检查。即使返回 `true`，剪贴板也可能被浏览器拒绝，数据请求也可能失败。调用时仍然需要错误处理。

## platform.user()

异步方法，返回 `Promise<{ id: string, name: string }>`。只提供当前用户 ID 和名称，不提供邮箱、登录凭据或模型密钥。

```js preview height=280
export default async function render(root, platform) {
  const ui = platform.ui;
  root.replaceChildren(ui.loading("正在读取用户信息…"));
  try {
    const user = await platform.user();
    root.replaceChildren(ui.page([ui.card([
      ui.title("你好，" + user.name),
      ui.hint("当前宿主：" + platform.host),
      ui.hint(platform.can("data.read") ? "支持读取数据" : "当前不支持读取数据"),
      ui.hint(platform.can("camera") ? "支持相机" : "当前没有相机能力"),
    ])]));
  } catch (error) {
    root.replaceChildren(ui.hint(error.message));
  }
}
```

预览中的用户信息是演示数据。安装到桌面后，方法返回实际登录用户的信息。
