Skip to content

加入频道

加入频道是开始 RTC 通信的第一步。用户需要提供有效的认证信息才能成功加入频道。

joinChannel

加入频道的主要方法。

方法签名

typescript
joinChannel(authInfoOrToken: AliRtcAuthInfo | string, userNameOrParam?: string | AliRtcChannelParam, extraData?: any): Promise<void>

参数说明

参数类型描述
authInfoOrTokenAliRtcAuthInfo | string认证信息对象或 token 字符串
userNameOrParamstring | AliRtcChannelParam用户名或频道参数对象
extraDataany额外数据(可选)

使用方式

1. 使用完整认证信息对象

javascript
const authInfo = {
  channelId: 'test-channel-001',
  userId: 'user-12345',
  appId: 'your-app-id',
  timestamp: Date.now(),
  token: 'your-jwt-token',
  nonce: 'random-nonce',
  sessionId: 'session-001',
  role: AliRtcEngine.AliRtcSdkTokenRole.AliRtcSdkTokenRoleAppServer,
};

try {
  await engine.joinChannel(authInfo);
  console.log('成功加入频道');
} catch (error) {
  console.error('加入频道失败:', error);
}

2. 使用 Token 字符串(简化方式)

javascript
const token = 'your-jwt-token';
const userName = '张三';

try {
  await engine.joinChannel(token, userName);
  console.log('成功加入频道');
} catch (error) {
  console.error('加入频道失败:', error);
}

3. 使用频道参数对象

javascript
const authInfo = {
  channelId: 'test-channel-001',
  userId: 'user-12345',
  appId: 'your-app-id',
  timestamp: Date.now(),
  token: 'your-jwt-token',
};

const channelParam = {
  userName: '张三',
  capabilityProfile: AliRtcEngine.AliRtcCapabilityProfile.Human,
};

try {
  await engine.joinChannel(authInfo, channelParam);
  console.log('成功加入频道');
} catch (error) {
  console.error('加入频道失败:', error);
}

加入频道前的准备工作

1. 设置频道模式

javascript
// 通信模式(默认)- 适用于一对一或小群组通话
engine.setChannelProfile(AliRtcEngine.AliRtcSdkChannelProfile.AliRtcSdkCommunication);

// 互动直播模式 - 适用于直播场景
engine.setChannelProfile(AliRtcEngine.AliRtcSdkChannelProfile.AliRtcInteractiveLive);

2. 设置用户角色(仅互动直播模式)

javascript
// 设置为主播角色
engine.setClientRole(AliRtcEngine.AliRtcSdkClientRole.AliRtcSdkInteractive);

// 设置为观众角色
engine.setClientRole(AliRtcEngine.AliRtcSdkClientRole.AliRtcSdkLive);

3. 设置默认订阅行为

javascript
// 设置是否默认订阅所有远端音频流
engine.setDefaultSubscribeAllRemoteAudioStreams(true);

// 设置是否默认订阅所有远端视频流
engine.setDefaultSubscribeAllRemoteVideoStreams(true);

4. 添加事件监听器

javascript
// 监听连接状态变化
engine.on('connectionStatusChange', (status, reason) => {
  console.log('连接状态变化:', status, reason);
  handleConnectionStatusChange(status, reason);
});

// 监听远端用户上线
engine.on('remoteUserOnLineNotify', uid => {
  console.log('远端用户上线:', uid);
  onRemoteUserJoined(uid);
});

常见问题

1. 重复加入频道

javascript
async function safeJoinChannel(authInfo) {
  if (engine.isInCall()) {
    console.log('已在频道中,先离开当前频道');
    await engine.leaveChannel();
  }

  await engine.joinChannel(authInfo);
}

2. 网络异常处理

javascript
engine.on('connectionStatusChange', (status, reason) => {
  switch (status) {
    case AliRtcEngine.AliRtcConnectionStatus.AliRtcConnectionStatusDisconnected:
      if (reason === AliRtcEngine.AliRtcConnectionStatusChangeReason.AliRtcConnectionChangedNetworkInterrupted) {
        console.log('网络中断,等待自动重连...');
        showReconnectingMessage();
      }
      break;

    case AliRtcEngine.AliRtcConnectionStatus.AliRtcConnectionStatusReconnecting:
      console.log('正在重新连接...');
      break;

    case AliRtcEngine.AliRtcConnectionStatus.AliRtcConnectionStatusConnected:
      console.log('重连成功');
      hideReconnectingMessage();
      break;

    case AliRtcEngine.AliRtcConnectionStatus.AliRtcConnectionStatusFailed:
      console.log('连接失败,请检查网络');
      showConnectionFailedDialog();
      break;
  }
});