# 多端应用使用云开发

在多端框架内，可以使用云开发绝大部分能力，本文档主要讲解云开发初始化以及相关的注意事项。

## 一、初始化改造

微信云开发环境会隶属于一个小程序或公众号。在小程序运行时，可以不用填云开发环境所属 appid，甚至不需要填 envid（系统默认会取第一个），但在「多端应用」开发时，由于客户端独立性，SDK 并不知道 appid 和 envid，所以需要显性的强调这一点。

因此在「多端应用」中使用云开发时，需要在 `cloud.init` 时显式指定云开发环境所在的公众号或者小程序 AppID：

```js
wx.cloud.init({
  appid: 'wx1234567890', // 创建云开发环境的 AppID（小程序、公众号），不是多端应用 AppID
  envid: 'env-id-example', // 云开发环境名称
})
```

## 二、多端登录模式

当「多端应用」中采用以下登录方式成功登录后，可以无缝使用云开发，和在微信小程序内使用无异。

1. [唤起微信小程序登录](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.weixinMiniProgramLogin)
2. [移动应用微信登录](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.weixinAppLogin)：此方式需要在「微信开发者工具-云开发-更多-环境共享-添加共享」给 **移动应用 APPID** 共享环境。
3. 其他方式登录：如果使用**其他方式登录**，如手机号登录，需要在登录后去[绑定微信](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.miniapp.bindWeixin)，绑定成功后以其他方式登录，会自动关联移动应用微信账号，等同于使用[移动应用微信登录](/miniprogram/dev/platform-capabilities/miniapp/api/auth/wx.weixinAppLogin)。

以上的登录模式，第 1 种使用的是小程序身份，其他模式使用的都是「移动应用」身份，因此使用前需要在云开发控制完成[环境共享](/miniprogram/dev/wxcloudservice/wxcloud/guide/resource-sharing/index.md)

在环境共享时，填写的 APPID 应为 `移动应用 APPID`（需是绑定多端应用的），如下所示

![](https://res.wx.qq.com/op_res/LyT_lIWk7cbSywbzgr-XlFZJOxCRSgbMRGyBxlYIiQ-_mhrKGmgk6PKnfh5yP3F4FIoJ8xHfCvbmdac6fVKlEg)

环境共享后，在代码层面，需要使用实例化的形式调用云开发（之前 wx.cloud.init 模式只能用于第 1 种模式，其他登录模式不可用）

使用实例模式初始化时，示例代码如下：

``` js
App({
  async onLaunch() {
    this.cloud = new wx.cloud.Cloud({
      appid: 'wx1234567890', // 此应为移动应用 APPID
      resourceAppid: 'wx987654321', // 云开发环境所归属的资源小程序、公众号或第三方平台 APPID
      resourceEnv: 'env-id-example', // 云开发环境ID
    })
    // 在 app 中初始化后，可以在各个页面使用 getApp().cloud 获取云开发实例，比如 getApp().cloud.callFunction
  }
})
```

``` js
const app = getApp()
wx.weixinAppLogin({
    success (res) {
      // 成功登录后初始云开发，登录之前云开发只能用未登录模式。
      await app.cloud.init()
      // 初始化后即可调用云开发资源
      // await app.cloud.database()
    }
})
```

> 登录前、登录失败情况下，使用云开发参考以下「未登录模式」

## 三、未登录模式使用

默认情况下，在多端框架内是无法正常使用云开发的，包括云函数、数据库等。这是因为多端环境中缺失微信登录态信息的（即 `cloud.getWXContext` 内无 `OPENID`）。为此，我们提供了云开发的未登录模式，开发者可以进行以下配置，在多端环境中以未登录态模式使用云开发。

### 3.1 开启环境级别开关

为了允许未登录模式用户访问云环境资源，需要在「微信开发者工具-云开发-设置-权限设置-未登录用户访问云资源权限设置」打开相应云环境的开关。

![](https://mmbiz.qpic.cn/mmbiz_jpg/PxLPibq1ibyh3Zcg9l0ldrusJe4qic7H2yEfPdj3UjGAL62HEo8tnwU5Hlf5jUD2yAicXm5ibzU3HpicGa8lbDYveeHw/0?wx_fmt=jpeg)

### 3.2 配置云函数安全规则

调用云函数时，由于未登录模式的限制，还需要配置[云函数的安全规则](/miniprogram/dev/wxcloudservice/wxcloud/guide/functions/security-rules.md)。参考安全规则如下（云函数 function1 支持未登录模式调用）：

```json
{
  // * 为通配符，表示对所有函数适用
  "*": {
    // invoke 表示调用权限控制
    // auth 包含鉴权信息，如果是未登录模式，则 auth == null
    "invoke": "auth != null"
  },
  // 函数名，该规则优先级会高于通配符
  "function1": {
    // 表示允许所有来源调用，包括未登录用户
    "invoke": true
  }
}
```

### 3.3 配置数据库安全规则

访问数据库时，由于未登录模式的限制，还需要配置[数据库安全规则](/miniprogram/dev/wxcloudservice/wxcloud/guide/database/security-rules.md#%E8%A7%84%E5%88%99%E7%BC%96%E5%86%99)。参考安全规则如下（所有用户可读，仅登录后创建者可写）：

```js
{
  "read": true,
  "write": "auth != null && doc._openid == auth.openid"
}
```

### 3.4 uploadFile 、cloudId 和其他接口

未登录模式下，不支持 `wx.cloud.uploadFile` 以及 `cloudId` 等需要登录态的接口。如有上传文件需求，建议使用"多端登录模式"，或者通过腾讯云对象存储等形式直接上传到存储桶中。`cloudId` 访问云存储建议改以 https url 形式访问。

### 3.5 wx.cloud.extend.AI 接口

- 在多端框架中已支持 `wx.cloud.extend.AI`，此接口依旧需在具有登录态的情况下使用，即未登录模式下，不支持 `wx.cloud.extend.AI`

- 点击前往[wx.cloud.extend.AI](/miniprogram/dev/wxcloudservice/wxcloud/guide/extensions/extend/ai.md)查看详情
