本文介绍一对一音视频通话iOS SDK集成的代码示例及集成说明。
功能时序图
功能实现
初始化ARTC引擎及回调注册
SDK出现异常时内部会优先进行重试恢复,需要业务处理的异常SDK会通过明确的回调API通知。
异常发生原因 | 回调及参数 | 解决方案 | 备注 |
鉴权失败 | onJoinChannelResult回调result返回AliRtcErrJoinBadToken | 发生错误时需要App检查token是否正确。 | 出现鉴权失败发生在用户主动调用API时发生,所以在API对应的回调中返回。 |
鉴权过期 | onWillAuthInfoExpire | 发生该异常时App需要重新获取最新的鉴权信息后,再调用refreshAuthInfo刷新鉴权信息。 | 出现鉴权过期的情况分为用户主动调用API、程序运行阶段时发生,所以会在API对应的回调及独立的错误回调时发生 |
鉴权过期 | onAuthInfoExpired | 发生该异常时App需要重新入会。 | 出现鉴权过期的情况分为用户主动调用API、程序运行阶段时发生,所以会在API对应的回调及独立的错误回调时发生 |
网络链接异常 | onConnectionStatusChange回调返回AliRtcConnectionStatusFailed | 发生该异常时需要重新入会。 | SDK具备一定时间断网自动恢复能力,超过限定的时间后会超时断开;此时需要App检查当前的状态后再次入会。 |
被踢下线 | onBye |
| ARTC服务具备踢人的能力。 |
本地设备异常 | onLocalDeviceException | 本地设备异常,需要App检测权限、设备硬件是否正常。 | ARTC服务具备设备检测、异常诊断的能力;在本地设备异常时会通过回调的方式通知客户本地设备异常,此时SDK内部无法恢复,需要App方介入查看设备是否正常。 |
- (AliRtcEngine *)engine{
if (!_engine) {
NSString *extras = @"";
/* 构造引擎并传入delegate */
_engine = [AliRtcEngine sharedInstance:self extras:extras];
}
return _engine;
}
#pragma mark - "Delegates of engine"
/* 鉴权距离过期还有30s时会回调,务必进行鉴权时间刷新 */
- (void)onAuthInfoWillExpire{
/* TODO: 务必处理;业务触发重新获取当前channel\user的鉴权信息,然后设置refreshAuthInfo即可 */
}
/* SDK与服务器的链接状态通知,务必处理链接失败的情况 */
- (void)onConnectionStatusChange:(AliRtcConnectionStatus)status reason:(AliRtcConnectionStatusChangeReason)reason {
if (status == AliRtcConnectionStatusFailed) {
/* TODO: 务必处理;建议业务提示客户,此时SDK内部已经尝试了各种恢复策略已经无法继续使用时才会上报 */
} else {
/* TODO: 可选处理;增加业务代码,一般用于数据统计、UI变化 */
}
}
/* SDK尝试控制本地设备异常 */
- (void)onLocalDeviceException:(AliRtcLocalDeviceType)deviceType exceptionType:(AliRtcLocalDeviceExceptionType)exceptionType message:(NSString *_Nullable)msg {
/* TODO: 务必处理;建议业务提示客户错误,此时SDK内部已经尝试了各种恢复策略已经无法继续使用时才会上报 */
}
/* 业务可能会触发踢人的动作,所以这个地方也需要处理 */
- (void)onBye:(int)code {
/* TODO: 建议业务根据自己的场景,进行对应的处理 */
}
/* 远端推流通知,自动订阅时这个时候设置窗口黑屏时间和首帧可以兼顾 */
- (void)onRemoteTrackAvailableNotify:(NSString *_Nonnull)uid audioTrack:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack {
/* TODO: 务必处理;给SDK设置一个视频渲染窗口 */
dispatch_async(dispatch_get_main_queue(), ^{
if (videoTrack & AliRtcVideoTrackCamera) {
AliVideoCanvas *canvas = [[AliVideoCanvas alloc] init];
canvas.view = self.remoteRenderView;
canvas.renderMode = AliRtcRenderModeAuto;
[self.engine setRemoteViewConfig:canvas uid:uid forTrack:AliRtcVideoTrackCamera];
} else {
/* 这里清空远端用户的渲染窗口,但是有可能远端用户直接离会 */
[self.engine setRemoteViewConfig:nil uid:uid forTrack:AliRtcVideoTrackCamera];
}
});
}
- (void)onRemoteUserOffLineNotify:(NSString *)uid offlineReason:(AliRtcUserOfflineReason)reason {
dispatch_async(dispatch_get_main_queue(), ^{
/* 这里也清空远端用户的渲染窗口 */
[self.engine setRemoteViewConfig:nil uid:uid forTrack:AliRtcVideoTrackBoth];
});
}
- (void)onJoinChannelResult:(int)result channel:(NSString *)channel userId:(NSString *)userId elapsed:(int)elapsed {
/* TODO: 可选处理;增加业务代码,一般用于数据统计、UI变化 */
}
- (void)onLeaveChannelResult:(int)result stats:(AliRtcStats)stats {
/* TODO: 可选处理;增加业务代码,一般用于数据统计、UI变化 */
}
设置入会前的参数
SDK在互动模式下、主播角色,默认会推本地的音视频,同时拉其他主播的音视频流。
SDK在互动模式下、观众角色,不会推本地的音视频流,但是会拉取其他主播的音视频流。
SDK默认是按照自动推拉流模式,用户也可以关闭自动推拉流模式。
示例代码
- (void)initBeforeJoin {
/* 可选:入会前的参数设置 */
[self.engine setChannelProfile:AliRtcInteractivelive];
[self.engine setClientRole:AliRtcClientRoleInteractive];
/* 设置音频的属性 */
[self.engine setAudioProfile:AliRtcEngineStereoHighQualityMode audio_scene:AliRtcSceneMusicMode];
/* 可选:摄像头预览,不设置也会进行推流 */
AliVideoCanvas *canvas = [[AliVideoCanvas alloc] init];
canvas.view = self.previewView;
canvas.renderMode = AliRtcRenderModeAuto;
[self.engine setLocalViewConfig:canvas forTrack:AliRtcVideoTrackCamera];
return;
}
入会
入会后会按照入会前的参数进行对应的推流和拉流
默认SDK会自动推拉流,减少客户需要调用的API
[self initBeforeJoin];
/* 这个地方channlid,userid完全取决于服务器下发的值,app不感知 */
[self.engine joinChannel:@"您的鉴权信息" channelId:nil userId:nil name:@"testUserName" onResultWithUserId:nil];
离会
[self.engine leaveChannel];
销毁引擎
[AliRtcEngine destroy];
效果展示
按照上面的代码集成完毕后,可以得到下面的结果,您可以根据自身业务需求进行调整。
其他API
更多API说明请参见AliRtcEngine接口。