# 集成智能云会议 (/zh-CN/realtime-media/meeting/get-started/integrate-meeting)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

<_PlatformTabsGroup>
<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="android" platform="android" />
## 前提条件 [#前提条件]

本文介绍如何将智能云会议集成到你的 Android 项目中。开始前，请确保满足以下前提条件：

- `Android Studio Jellyfish | 2023.3.1 Patch 1` 或以上版本。
- Android 手机，版本 Android 7.0 或以上。
- Gradle 8.1.1 或以上版本。
- JDK 17 或以上版本。
- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙，否则无法正常使用声网服务。
- 已[开通智能云会议服务](/zh-CN/realtime-media/meeting/build/enable-service)。

## （可选）创建项目 [#可选创建项目]

如需创建一个新的 Android 项目来集成智能云会议，你可以在 **Android Studio** 里，依次选择 **Phone and Tablet > Empty Activity**，创建 [Android 项目](https://developer.android.com/studio/projects/create-project)。

:::warning[注意]
创建项目后，**Android Studio** 会自动开始同步 Gradle，稍等片刻至同步成功后再进行下一步操作。
:::

## 通过 Maven 集成依赖 [#通过-maven-集成依赖]

1. 在 `<your_app>/settings.gradle` 文件中，添加以下引用：

    ```groovy
    buildscript {
        repositories {
            mavenCentral()
            maven { url 'https://jitpack.io' }
        }
    }
    ```

2. 在 `<your_app>/app/build.gradle` 文件中，添加依赖：

    ```groovy
    dependencies {
        implementation "io.github.agora-apaas:FcrUIScene:3.1.0"
    }
    ```

    :::warning[注意]
    通过 Maven 集成时，如果遇到依赖库冲突，可以通过 `exclude` 关键字排除依赖包，或者修改项目所依赖的版本来解决冲突。
    :::

## （可选）防止代码混淆 [#可选防止代码混淆]

在 `<your_app>/app/proguard-rules.pro` 文件中添加如下行，以防止声网 SDK 的代码被混淆：

```kotlin
-keep class io.agora.** {*;}
-keep class cn.shengwang.** {*;}
```

## 动态申请权限 [#动态申请权限]

智能云会议需要你动态申请如下权限：

- 摄像头权限：`Manifest.permission.CAMERA`
- 麦克风权限：`Manifest.permission.RECORD_AUDIO`

## 启动智能云会议 [#启动灵动会议]

本节介绍如何调用客户端 API 启动智能云会议。开始前，请确保已通过[服务端 RESTful API](/zh-CN/api-reference/meeting/restful/api/create-room) 创建了房间。

1. 在 `Application` 的 `onCreate` 方法中，添加如下代码初始化 SDK：

    ```kotlin
    FcrSDKInitUtils.initSDK(this)
    ```

2. 调用 [`init`](/zh-CN/api-reference/meeting/android#init) 和 [`launch`](/zh-CN/api-reference/meeting/android#launch) 初始化和启动智能云会议。

    ```kotlin
    val creatorConfig = FcrUISceneCreatorConfig(appId, userId)
    val sceneConfig = FcrUISceneConfig(roomId, roomToken, userName, userRole, inviteLink)

    FcrUISceneCreator.init(creatorConfig)
    FcrUISceneCreator.launch(activity, sceneConfig)
    ```

    填写参数时可参考 [`FcrUISceneCreatorConfig`](/zh-CN/api-reference/meeting/android#fcruiscenecreatorconfig) 和 [`FcrUISceneConfig`](/zh-CN/api-reference/meeting/android#fcruisceneconfig) 的 API 文档。需关注的核心参数如下：

| 参数 | 类型 | 描述 |
| --- | --- | --- |
| `appId` | String | 项目的 App ID。详见[获取 App ID](/zh-CN/realtime-media/meeting/build/enable-service#获取-app-id)。 |
| `userId` | String | [integrate-meeting-android-html-0-2-2 details](#table-slot-integrate-meeting-android-html-0-2-2) |
| `roomToken` | String | [integrate-meeting-android-html-0-3-2 details](#table-slot-integrate-meeting-android-html-0-3-2) |

<a id="table-slot-integrate-meeting-android-html-0-2-2"></a>

**integrate-meeting-android-html-0-2-2 details**

用户 ID，是用户的**唯一标识符**，不可重复取值。长度在 64 字符以内。支持的字符集范围（共 36 个字符）：

- 26 个小写英文字母 a~z
- 10 个数字 0-9

<a id="table-slot-integrate-meeting-android-html-0-3-2"></a>

**integrate-meeting-android-html-0-3-2 details**

用于鉴权的 Token。详见[控制台生成临时 Token](/zh-CN/realtime-media/meeting/build/enable-service#生成临时-token) 或[服务端生成正式 Token](/zh-CN/realtime-media/meeting/build/generate-token)。

:::warning[注意]
临时 Token 仅适用于集成测试和体验。在生产环境中，请使用正式 Token 以确保安全。无论是临时 Token 还是正式 Token，有效期最长都是 24 小时，请尽快使用。
:::

3. （可选）如需主动退出会议，调用 [`exit`](/zh-CN/api-reference/meeting/android#exit) 退出智能云会议。

    ```kotlin
    FcrUISceneCreator.exit()
    ```

## 日志文件路径 [#日志文件路径]

智能云会议默认的日志文件在 `sdcard/Android/obb/{your_app_package_name}/FcrCore/logs/` 目录下。
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="android" platform="ios" />
本文介绍如何将智能云会议集成到你的 iOS 项目中。
## 前提条件 [#前提条件-1]

开始前，请确保满足以下前提条件：

- Xcode 12.0 或以上版本。
- 有效的 Apple 开发者账号。
- iOS 设备，版本 11.0 或以上。
- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙，否则无法正常使用声网服务。
- 已[开通智能云会议服务](/zh-CN/realtime-media/meeting/build/enable-service)。

## （可选）创建项目 [#可选创建项目-1]

如需创建一个新的 iOS 项目来集成智能云会议，你可以参考如下步骤在 Xcode 创建项目：

1. [创建一个新的项目](https://help.apple.com/xcode/mac/current/#/dev07db0e578)，**Application** 选择 **App**，**Interface** 选择 **Storyboard**，**Language** 选择 **Swift**。

    :::warning[注意]
    如果你没有添加过开发团队信息，会看到 **Add account…** 按钮。点击该按钮并按照屏幕提示登入 Apple ID，点击 **Next**，完成后即可选择你的 Apple 账户作为开发团队。
    :::

2. 为你的项目设置[自动签名](https://help.apple.com/xcode/mac/current/#/dev23aab79b4)。

3. 设置部署你的 App 的[目标设备](https://help.apple.com/xcode/mac/current/#/deve69552ee5)。

4. 在 **General** 标签页中设置 **Minimum Deployments** 为 iOS 11.0。

## 通过 CocoaPods 集成依赖 [#通过-cocoapods-集成依赖]

1. 开始前，确保你已安装 CocoaPods。如果尚未安装，可参考 [Getting Started with CocoaPods](https://guides.cocoapods.org/using/getting-started.html#getting-started) 进行安装操作。

    在终端输入以下命令检查 CocoaPods 是否安装成功：

    ```shell
    pod --version
    ```

    如果安装成功，终端会打印出版本信息，例如 `1.11.3`。

2. 在终端里进入项目文件夹（即 `*.xcodeproj` 文件所在目录），并运行 `pod init` 命令。项目文件夹下会生成一个 `Podfile` 文本文件。

3. 打开 `Podfile` 文件，修改文件为如下内容，以引用智能云会议所依赖的库：

    ```ruby
    platform :ios, '11.0'
    use_frameworks!

    target 'YourTargetName' do
        # highlight-start
        pod 'FcrUIScene', '3.1.0'
        pod "AgoraRtm_OC_Special", '2.2.1.1'
        # highlight-end
    end
    ```

4. 在终端里进入项目文件夹，运行如下命令安装依赖。

    ```shell
    pod install
    ```

    以灵动会议 v3.1.0 为例，安装过程中终端会打印如下信息：

    ```shell
    Analyzing dependencies
    Downloading dependencies
    Installing FcrUIScene (3.1.0)
    Installing FcrCore (3.1.0)
    Generating Pods project
    Integrating client project
    ```

## 添加设备权限 [#添加设备权限]

为确保智能云会议能正常使用，你需要添加必要的设备权限。在 Xcode 项目导航栏中打开 `Info.plist` 文件，编辑[属性列表](https://help.apple.com/xcode/mac/current/#/dev3f399a2a6)，添加以下属性：

| key                                         | type   | value                                           |
| ------------------------------------------- | ------ | ----------------------------------------------- |
| Privacy - Camera Usage Description          | String | 填写使用相机的目的           |
| Privacy - Microphone Usage Description      | String | 填写使用麦克风的目的 |
| Privacy - Photo Library Additions Usage Description | String | 填写访问和添加照片或视频到图库的目的 |
| Privacy - Photo Library Usage Description   | String | 填写访问图库的目的     |

## 启动智能云会议 [#启动灵动会议-1]

本节介绍如何调用客户端 API 启动智能云会议。开始前，请确保已通过[服务端 RESTful API](/zh-CN/api-reference/meeting/restful/api/create-room) 创建了房间。

1. 创建一个 `FcrUISceneCreator` 对象，并调用 [`launch`](/zh-CN/api-reference/meeting/ios#launch) 启动智能云会议。

```swift tab="Swift" tabGroup="language"
import FcrUIScene

let config = FcrUISceneCreatorConfig(appId: appId,
                                     userId: userId)

let creator = FcrUISceneCreator(config: config)

let sceneConfig = FcrUISceneConfig(roomId: roomId,
                                   roomToken: token,
                                   userName: userName,
                                   userRole: userRole,
                                   inviteLink: inviteLink,
                                   userProperties: nil,
                                   resource: resource)

creator.launch(config: sceneConfig,
               cancel: {
                   print("cancel")
               }, success: { scene in
                   print("success")
               }, failure: { error in
                   print("failure")
               }, parent: viewController)
```

```objc tab="Objective-C" tabGroup="language"
#import <FcrUIScene/FcrUIScene-Swift.h>

FcrUISceneCreatorConfig *config = [[FcrUISceneCreatorConfig alloc] initWithAppId:appId
                                                                          userId:userId];

FcrUISceneConfig *sceneConfig = [[FcrUISceneConfig alloc] initWithRoomId:roomId
                                                               roomToken:roomToken
                                                                userName:userName
                                                                userRole:userRole
                                                              inviteLink:inviteLink
                                                          userProperties:nil
                                                                resource:resource];

[creator launchWithConfig:sceneConfig
                   cancel:^{
                       NSLog(@"cancel");
                   } success:^(id<FcrUISceneItem> _Nonnull scene) {
                       NSLog(@"success");
                   } failure:^(AgoraError * _Nonnull error) {
                       NSLog(@"failure");
                   } parent:viewController];
```

    填写参数时可参考 [`FcrUISceneCreatorConfig`](/zh-CN/api-reference/meeting/ios#fcruiscenecreatorconfig) 和 [`FcrUISceneConfig`](/zh-CN/api-reference/meeting/ios#fcruisceneconfig) 的 API 文档。需关注的核心参数如下：

| 参数 | 类型 | 描述 |
| --- | --- | --- |
| `appId` | String | 项目的 App ID。详见[获取 App ID](/zh-CN/realtime-media/meeting/build/enable-service#获取-app-id)。 |
| `userId` | String | [integrate-meeting-ios-html-0-2-2 details](#table-slot-integrate-meeting-ios-html-0-2-2) |
| `roomToken` | String | [integrate-meeting-ios-html-0-3-2 details](#table-slot-integrate-meeting-ios-html-0-3-2) |

<a id="table-slot-integrate-meeting-ios-html-0-2-2"></a>

**integrate-meeting-ios-html-0-2-2 details**

用户 ID，是用户的**唯一标识符**，不可重复取值。长度在 64 字符以内。支持的字符集范围（共 36 个字符）：

- 26 个小写英文字母 a~z
- 10 个数字 0-9

<a id="table-slot-integrate-meeting-ios-html-0-3-2"></a>

**integrate-meeting-ios-html-0-3-2 details**

用于鉴权的 Token。详见[控制台生成临时 Token](/zh-CN/realtime-media/meeting/build/enable-service#生成临时-token) 或[服务端生成正式 Token](/zh-CN/realtime-media/meeting/build/generate-token)。

:::warning[注意]
临时 Token 仅适用于集成测试和体验。在生产环境中，请使用正式 Token 以确保安全。无论是临时 Token 还是正式 Token，有效期最长都是 24 小时，请尽快使用。
:::

2. （可选）如需主动退出会议，调用 [`exit`](/zh-CN/api-reference/meeting/ios#exit) 退出智能云会议。

```swift tab="Swift" tabGroup="language"
// 退出会议
scene.exit()

// 释放 FcrUISceneCreator 与 FcrUIScene 对象
// ...
```

```objc tab="Objective-C" tabGroup="language"
// 退出会议
[scene exit];

// 释放 FcrUISceneCreator 与 FcrUIScene 对象
// ...
```

## 日志文件路径 [#日志文件路径-1]

智能云会议默认的日志文件在 `App Sandbox/Library/Caches/AgoraLog/` 目录下。

## 开发注意事项 [#开发注意事项]

在 Xcode 14.0 及更高版本中，如果遇到以下问题，可以在你的 `Podfile` 中添加代码来解决：

- Bundle 需要签名：例如 `FcrUIScene-FcrUIScene` 的 Bundle 在构建时需要进行签名。
- Pod 引用的库版本过低：引用的库不满足项目所需的最低 iOS 版本要求（11.0），导致兼容性问题。
- 启用 bitcode 支持导致错误：启用 bitcode 支持可能导致构建错误或其他兼容性问题，因此需要关闭 bitcode 支持。
- 依赖库中会多导入一个 `aosl.xcframework`：目前通过 `pre_install` 移除重复导入的 `aosl.xcframework`。

`Podfile` 中添加的代码示例如下：

```ruby
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|

      # 针对 Xcode 14 及以上版本，禁用对 Bundle 类型目标的签名，以避免构建错误
      if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
        config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
      end

      # 确保 iOS 部署版本至少为 11.0，以避免兼容性问题
      deployment = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
      if deployment.to_f < 11.0
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
      end

      # 关闭 bitcode 支持
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

pre_install do |installer|
  # 移除重复导入的 aosl.xcframework
  pods_root = installer.sandbox.root
  duplicated_frameworks = Dir.glob("#{pods_root}/**/aosl.xcframework")

  if duplicated_frameworks.size > 1
    duplicated_frameworks.drop(1).each do |framework_path|
      FileUtils.rm_rf(framework_path)
    end
  end
end
```
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="android" platform="electron" />
本文介绍如何将智能云会议集成到你的 Electron 项目中。
## 前提条件 [#前提条件-2]

开始前，请确保满足以下前提条件：

- Node.js 18 或以上版本。

<Accordions type="multiple">
<Accordion title="检查 Node.js 安装结果">

在终端输入以下命令检查 Node.js 是否安装成功：

```shell
node --version
```

如果安装成功，终端会打印出版本信息，例如 `v18.19.0`。

</Accordion>
</Accordions>


- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙，否则无法正常使用声网服务。
- 已[开通智能云会议服务](/zh-CN/realtime-media/meeting/build/enable-service)。

## （可选）创建项目 [#可选创建项目-2]

如需创建一个新的 Electron 项目来集成智能云会议，在本地创建一个项目文件夹，并在文件夹下新建以下文件：

- `package.json`：用于安装和管理项目依赖项。
- `tsconfig.json`：TypeScript 配置文件。
- `main/bootstrap.ts`：主进程文件。
- `renderer/index.tsx`：渲染进程文件。
- `public/index.html`：客户端页面文件。
- `installer/icons/favicon.ico`：Windows 应用图标。
- `installer/icons/favicon.png`：macOS 应用图标。
- `installer/mac/entitlements.mac.plist`：打包 macOS 应用所使用的 `entitlements` 文件。
- `.env`：用于构建项目的环境变量文件。

## 通过 npm 集成依赖 [#通过-npm-集成依赖]

1. 在项目的 `package.json` 文件中添加以下依赖项：

    ```json
    {
      "devDependencies": {
        "electron": "24.8.8"
      },
      "dependencies": {
        "fcr-ui-scene": "^3.1.0",
        "agora-edu-core": "^3.1.0",
        "agora-rte-sdk": "^3.1.0",
        "agora-foundation": "^1.0.0",
        "agora-ui-foundation": "^1.0.0",
        "@electron/remote": "2.0.1",
        "agora-electron-sdk": "4.3.2-build.90-rc.1",
        "electron-screenshots": "^0.5.26",
        "jszip": "^3.10.1"
      }
    }
    ```

    版本要求：

    - `electron`：当前仅支持 24.8.8 版本，不要修改成其他版本。
    - `fcr-ui-scene`、`agora-edu-core`、`agora-rte-sdk`：均为智能云会议依赖库，当前支持 3.1.0 版本。如果智能云会议发布更新版本，你可以按需升级。

2. 执行以下命令安装依赖：

    ```shell
    npm install
    ```

    安装成功后，终端会打印如下信息：

    ```shell
    + agora-toolchain@1.0.1-1
    + fcr-ui-scene@3.1.0
    + electron@24.8.8
    + agora-edu-core@3.1.0
    + agora-rte-sdk@3.1.0
    + agora-foundation@1.0.0
    + agora-ui-foundation@1.0.0
    + @electron/remote@2.0.1
    + agora-electron-sdk@4.3.2-build.90-rc.1
    + electron-screenshots@0.5.26
    + jszip@3.10.1
    ```

## 添加设备权限 [#添加设备权限-1]

如果你的开发目标平台为 Windows，则无需添加设备权限。

如果你的开发目标平台为 macOS，那么打包 macOS 应用时，你需要在 `installer/mac/entitlements.mac.plist` 文件中增加以下内容，以获取运行智能云会议所需权限。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <!-- 允许即时编译（JIT） -->
        <key>com.apple.security.cs.allow-jit</key>
        <true/>

        <!-- 允许未签名的可执行内存 -->
        <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
        <true/>

        <!-- 允许使用 dyld 环境变量 -->
        <key>com.apple.security.cs.allow-dyld-environment-variables</key>
        <true/>

        <!-- 允许访问音频输入设备 -->
        <key>com.apple.security.device.audio-input</key>
        <true/>

        <!-- 允许访问摄像头 -->
        <key>com.apple.security.device.camera</key>
        <true/>
    </dict>
</plist>
```

## 启动智能云会议 [#启动灵动会议-2]

本节介绍如何调用客户端 API 启动智能云会议。开始前，请确保已通过[服务端 RESTful API](/zh-CN/api-reference/meeting/restful/api/create-room) 创建了房间。

1. 在 Electron 主进程文件（例如 `main/bootstrap.ts`）中添加如下代码，以初始化 Electron 应用，挂载 `fcr-ui-scene` 钩子函数，创建并启动会议窗口。

    ```javascript
    // 引入 fcr-ui-scene/electron 模块
    const { app, BrowserWindow } = require("electron");
    const { initialize } = require("@electron/remote/main");
    const { hookApp, hookWindow } = require("fcr-ui-scene/electron");

    // 初始化 @electron/remote/main 模块
    initialize();

    // 将 fcr-ui-scene 的钩子函数挂载到 Electron 应用上
    hookApp(app);

    // 当 Electron 应用准备就绪时
    app.addListener("ready", () => {
      // 创建一个新的浏览器窗口
      const browserWindow = new BrowserWindow({
        webPreferences: {
          nodeIntegration: true,
          nodeIntegrationInWorker: true,
          backgroundThrottling: false,
          contextIsolation: false,
          preload: require.resolve("fcr-ui-scene/lib/electron/preload.js"),
        },
      });
      // 开启窗口远程模块访问
      enable(browserWindow.webContents);

      // 将钩子函数挂载到浏览器窗口
      hookWindow(browserWindow);

      // 加载打包后的 index.html 文件
      browserWindow.loadFile("dist/index.html");
    });
    ```

2. 在渲染进程代码中引入 `fcr-ui-scene` 模块，创建一个 `FcrUISceneCreator` 对象，并调用 [`launch`](/zh-CN/api-reference/meeting/electron#launch) 启动智能云会议。

    ```javascript
    const { FcrUISceneCreator } = require('fcr-ui-scene');

    // 创建 FcrUISceneCreator 实例
    const creator = new FcrUISceneCreator({
      appId,
      userId,
    });

    // 启动场景
    const scene = creator.launch(
      {
        roomId,
        roomToken,
        userName,
        userRole,
        inviteLink
      },
      // 取消加入房间
      () => {},
      // 加入房间成功
      (scene) => {},
      // 加入房间失败
      (error) => {},
      // 要挂载的 DOM 节点
      dom
    );
    ```

    填写参数时可参考 [`FcrUISceneCreatorConfig`](/zh-CN/api-reference/meeting/electron#fcruiscenecreatorconfig) 和 [`FcrUISceneConfig`](/zh-CN/api-reference/meeting/electron#fcruisceneconfig) 的 API 文档。需关注的核心参数如下：

| 参数 | 类型 | 描述 |
| --- | --- | --- |
| `appId` | String | 项目的 App ID。详见[获取 App ID](/zh-CN/realtime-media/meeting/build/enable-service#获取-app-id)。 |
| `userId` | String | [integrate-meeting-electron-html-0-2-2 details](#table-slot-integrate-meeting-electron-html-0-2-2) |
| `roomToken` | String | [integrate-meeting-electron-html-0-3-2 details](#table-slot-integrate-meeting-electron-html-0-3-2) |

<a id="table-slot-integrate-meeting-electron-html-0-2-2"></a>

**integrate-meeting-electron-html-0-2-2 details**

用户 ID，是用户的**唯一标识符**，不可重复取值。长度在 64 字符以内。支持的字符集范围（共 36 个字符）：

- 26 个小写英文字母 a~z
- 10 个数字 0-9

<a id="table-slot-integrate-meeting-electron-html-0-3-2"></a>

**integrate-meeting-electron-html-0-3-2 details**

用于鉴权的 Token。详见[控制台生成临时 Token](/zh-CN/realtime-media/meeting/build/enable-service#生成临时-token) 或[服务端生成正式 Token](/zh-CN/realtime-media/meeting/build/generate-token)。

:::warning[注意]
临时 Token 仅适用于集成测试和体验。在生产环境中，请使用正式 Token 以确保安全。无论是临时 Token 还是正式 Token，有效期最长都是 24 小时，请尽快使用。
:::

3. （可选）如需主动退出会议，调用 [`exit`](/zh-CN/api-reference/meeting/electron#exit) 退出智能云会议。

    ```javascript
    scene.exit();
    ```

## （可选）构建和打包 [#可选构建和打包]

本节介绍如何使用声网提供的 `agora-toolchain` 工具链进行项目构建和应用打包。如果你的项目已经使用了 Webpack、Electron-Builder 等构建工具，也可以自行配置相关命令。

操作步骤如下：

1. 在项目的 `package.json` 文件中添加以下配置：

    ```json
    {
      "main": "dist/bootstrap.js",
      "scripts": {
        "bundle": "agora-tc-bundle --entry renderer/index && agora-tc-transpile --src main --out dist --transpile-only",
        "build-electron-mac": "agora-tc-pack-app --platform darwin --arch x64 --main electron",
        "build-electron-win": "agora-tc-pack-app --platform win32 --arch x64 --main electron",
        "postinstall": "cp -r node_modules/agora-ui-foundation/patches/ patches/ && patch-package"
      },
      "devDependencies": {
        "agora-toolchain": "^1.0.0"
      }
    }
    ```

    | 参数              | 描述  |
    |----------------|---------------------------|
    | `main`            | 代表 Electron 主进程的入口文件。                                                         |
    | `scripts`         | 包含各种构建和打包命令。                                                                 |
    | `scripts.bundle`          | 用于构建项目中的页面代码和静态资源。                                                     |
    | `scripts.build-electron-mac` | 用于打包 macOS 平台的项目客户端。                                                      |
    | `scripts.build-electron-win` | 用于打包 Windows 平台的项目客户端。                                                    |
    | `scripts.postinstall`     | 用于拷贝补丁文件并为使用到的库打补丁。                                                   |
    | `agora-toolchain` | 声网提供的工具链，用于构建和打包项目。                                                   |

2. 在 `public/index.html` 文件中添加基本的 HTML 模板，作为项目的入口页面。

    ```html
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title><%= htmlWebpackPlugin.options.title %></title>
      </head>
      <body>
        <div id="root" />
      </body>
    </html>
    ```

3. 在 `.env` 文件中添加以下环境变量：

    ```shell
    fcr_fragments=control-bar
    fcr_fragment_plugins=multi-lang-plugin,css-preset-plugin
    fcr_app_name=Meeting # 打包后的应用名称
    ```

4. 执行以下命令构建项目代码：

    ```shell
    npm run bundle
    ```

    构建产物会保存至 `dist` 文件夹。构建成功后，终端会打印如下信息：

    ```shell
    Successfully compiled 1 file with Babel.
    ```

5. 执行以下命令打包应用：

    ```shell
    npm run build-electron-mac # 打包 macOS 应用
    npm run build-electron-win # 打包 Windows 应用
    ```

    打包完成的应用会保存至 `release` 文件夹。

## 日志文件路径 [#日志文件路径-2]

智能云会议默认的日志文件在如下目录中：

- macOS：`/Users/{your_system_user_name}/Library/Logs/{your_app_name}/logs/`
- Windows 11：`C:\Users\{your_system_username}\AppData\Roaming\{your_app_name}\logs\logs\`
- Windows 7 至 10：`C:\Users\{your_system_username}\AppData\Roaming\{your_app_name}\{your_app_name}\logs\logs\`
<_PlatformProcessedMarker close="true" />
</_PlatformTabsGroup>
