通过阅读本文,您可以了解到iOS端互动大班课的集成方法。
环境要求
iOS端具体环境要求,更多信息,请参见使用限制。
前提条件
- 老师端(Electron)已集成并开启。具体操作,请参见Electron集成。
- 服务端已集成并开启。具体操作,请参见服务端集成。
- 环境中已安装Xcode 9.0或以上版本,更多信息,请参见Xcode。
- 您需要持有Apple开发证书或个人账号。
操作步骤
Demo目录结构说明
RTC把业务代码封装到RTCInteractiveLiveClass-RTC的库中,因此只需在Podfile中指定RTCInteractiveLiveClass-RTC库的路径,RTCInteractiveLiveClass-RTC就可以以本地第三方库的形式移植到其他项目中。如下所示:
pod 'RTCInteractiveLiveClass', :path => '../RTCInteractiveLiveClass-RTC'
## pod 'RTCInteractiveLiveClass' 说明项目依赖RTCInteractiveLiveClass库
## path => '../RTCInteractiveLiveClass-RTC' 指明RTCInteractiveLiveClass库的位置(相对于Podfile)
此外,工程中还依赖的其他组件如下所示:
target 'RTCSolution' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for RTCSolution
#begin
#IMSDK 本地集成
pod 'libdps', :path => 'AIMSDK-3.0.0.23/'
pod 'libaim', :path => 'AIMSDK-3.0.0.23/'
pod 'gaea', :path => 'AIMSDK-3.0.0.23/'
pod 'dmojo_support', :path => 'AIMSDK-3.0.0.23/'
pod 'xlite', :path => 'AIMSDK-3.0.0.23/'
pod 'OpenSSL', :path => 'AIMSDK-3.0.0.23/'
#IM 快速集成使用组件(只需要填写appKey和appId)
pod 'ALiIM', :path => '../ALiIM'
pod 'RTCCommon', :path => '../RTCCommon'
pod 'RTCCommonView', :path => '../RTCCommonView'
#大班课核心代码
pod 'RTCInteractiveLiveClass', :path => '../RTCInteractiveLiveClass-RTC'
#RTCSDK 本地集成
pod 'AliRTCSdk', :path => 'AliRtcSDK_iOS'
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag=>'4.0.1'
end
RTC和IM管理类的说明如下所示:
类别 | 文件名 | 说明 |
---|---|---|
RTC | AliRtcInterrativeEngine.h | RTC对外接口。 |
AliRtcInterrativeEngine.m | 接口内部实现。 | |
AliRtcInterrativeEngineDelegate.h | 回调接口。 | |
IM | AliImInterrativeEngine.h | IM对外接口。 |
AliImInterrativeEngine.m | 接口内部实现。 | |
AliImInterrativeEngineDelegate.h | 回调接口。 |
API说明
API | 描述 |
---|---|
sharedInstance | 获取RTCSuperClassImpl的实例对象,初始化RTC SDK。 |
destorySharedInstance | 销毁RTCSuperClassImpl的实例对象,销毁后需要再调用sharedInstance接口再次初始化实例。 |
login | 根据输入的房间号、用户名加入RTC频道。 |
logout | 退出RTC频道。 |
enterSeat | 连麦。 |
leavelSeat | 断开连麦。 |
muteLocalMic | 是否停止本地音频采集。 |
muteLocalCamera | 是否停止本地视频采集。 |
setLocalViewConfig | 为本地预览设置参数及绘制窗口。 |
startPreview | 开始本地预览。 |
stopPreview | 停止本地预览。 |
configRemoteTrack | 设置是否拉取相机、屏幕、音频流,必须调用subscribe才能生效。 |
subscribe | 手动拉视频和音频流。 |
setRemoteViewConfig | 为远端的视频设置参数及绘制窗口。 |
setDelegate | 设置代理。 |
switchCamera | 切换前后摄像头。 |
subscribeRemoteTrack | 设置是否拉取远端用户的流(相机流、屏幕流、音频流)。 |
getDisplayNameWithUid | 获取用户名。 |
API | 描述 |
---|---|
onEnterSeatResult | 用户上麦的通知。 |
onLeaveSeatResult | 用户下麦的通知。 |
onOccurError | 错误信息的通知。 |
onOccurWarning | 警告信息的通知。 |
onRoomDestroy | 房间被销毁的回调。 |
onSDKError | SDK发生异常需要销毁实例。 |
onJoinChannelResult | 加入房间的通知。 |
onLeaveChannelResult | 离开房间的通知。 |
onRemoteTrackAvailableNotify | 远端用户音视频流发生变化时的回调。 |
onSubscribeChangedNotify | 订阅情况发生变化时的回调。 |
onUserAudioMuted | 用户取消音频的通知。 |
onUserVideoMuted | 用户取消视频的通知。 |
onNetworkQualityChanged | 网络质量变化时的回调。 |
onUpdateRoleNotify | 角色切换成功的通知。 |
onRemoteUserOnLineNotify | 远端用户上线的通知。 |
onRemoteUserOffLineNotify | 远端用户下线的通知。 |
onAudioVolumeCallback | 订阅的音频音量、语音状态、UID。 |
API | 描述 |
---|---|
sharedInstance | 获取IM管理类单例。 |
destroySharedInstance | 销毁IM管理类。 |
login | 登录频道。 |
logout | 退出登录。 |
sendTextMessage | 发送文本消息。 |
sendHandUp | 发送举手。 |
getGroupMessages | 获取群消息。 |
API | 描述 |
---|---|
imUpdateMessages | 消息更新(包含从服务器拉取消息及新增消息)。 |
imUpdateSingleMessage | 更新单条消息。 |
imGroupMembersChanged | 群成员加入离开变化更新。 |
imReceiveRemoteBackHandUpCommand | 收到老师反馈举手信令。 |
imReceiveRemoteMuteMicCommand | 收到静音指令。 |
imReceiveRemoteMuteCameraCommand | 收到相机流指令。 |
imReceiveRemoteMuteAllMicCommand | 收到全员静音指令。 |
imSendMessageFailure | 发送消息失败通知。 |
RTC管理类功能实现接口
- sharedInstance:获取RTCSuperClassImpl的实例对象,初始化RTC SDK。
/** * 获取单例 */ [RTCManager sharedInstance];
- destorySharedInstance:销毁RTCSuperClassImpl的实例对象,销毁后需要再调用sharedInstance接口再次初始化实例。
/// 销毁RTC SDK - (void)destroySharedInstance;
- login:根据输入的房间号、用户名加入RTC频道。
/// 加入频道 /// @param channel 频道 /// @param userName 用户昵称 - (void)login:(NSString *)channel userName:(NSString *)userName;
- logout:退出RTC频道。
/// 离开频道 - (void)logout;
- enterSeat:连麦。
/// 连麦 - (int)enterSeat;
- leavelSeat:断开连麦。
//断开连麦 - (void)leaveSeat;
- muteLocalMic:是否停止本地音频采集。
/** * @brief mute或unmute本地音频采集 * @param mute YES表示本地音频采集空帧;NO表示恢复正常 * @note mute是指采集和发送静音帧。采集和编码模块仍然在工作 * @return 0表示成功放入队列,-1表示被拒绝 */ - (int)muteLocalMic:(BOOL)mute;
- muteLocalCamera:是否停止本地视频采集。
/** * @brief 是否将停止本地视频采集 * @param mute YES表示停止视频采集;NO表示恢复正常 * @param track 需要停止采集的track * @return 0表示Success 非0表示Failure * @note 发送黑色的视频帧。本地预览也呈现黑色。采集,编码,发送模块仍然工作,只是视频内容是黑色帧 */ - (int)muteLocalCamera:(BOOL)mute forTrack:(AliRtcVideoTrack)track;
- setLocalViewConfig:为本地预览设置参数及绘制窗口。
/** * @brief 为本地预览设置参数以及绘制窗口 * @param viewConfig 包含了窗口以及渲染方式 * @param track must be AliVideoTrackCamera * @return 0表示Success,非0表示Failure * @note 支持joinChannel之前和之后切换窗口。如果viewConfig或者viewConfig中的view为nil,则停止渲染 * 如果在播放过程中需要重新设置render mode,请保持canvas中其他成员变量不变,仅修改renderMode * 如果在播放过程中需要重新设置mirror mode,请保持canvas中其他成员变量不变,仅修改mirrorMode */ - (int)setLocalViewConfig:(AliVideoCanvas *)viewConfig forTrack:(AliRtcVideoTrack)track;
- startPreview:开始本地预览。
/** * @brief 开始本地预览 * @return 0表示Success 非0表示Failure * @note 如果没有设置view,则无法预览。可以在joinChannel之前就开启预览 * 会自动打开摄像头 */ - (int)startPreview;
- stopPreview:停止本地预览。
/** * @brief 停止本地预览 * @return 0表示Success 非0表示Failure * @note leaveChannel会自动停止本地预览 * 会自动关闭摄像头 (如果正在publish camera流,则不会关闭摄像头) */ - (int)stopPreview;
- configRemoteTrack:设置是否拉取相机、屏幕、音频流,必须调用subscribe才能生效。
/** * @brief 设置是否拉取相机、屏幕、音频流 * @param uid userId 从App server分配的唯一标示符。 * @param master 是否优先拉取大流 * @param enable YES: 拉取; NO: 不拉取 * @note 可以在joinChannel之前或者之后设置。如果已经订阅该用户的流,需要调用subscribe:(NSString *)uid onResult:才生效 */ - (void)configRemoteTrack:(NSString *)uid preferMaster:(BOOL)master enable:(BOOL)enable;
- subscribe:手动拉视频和音频流。
/** * @brief 手动拉视频和音频流 * @param uid User ID。不允许为nil * @param onResult 当subscribe执行结束后调用这个回调 * @note 如果需要手动选择拉取的流,调用configRemoteAudio, configRemoteTrack, * configRemoteScreenTrack来设置。缺省是拉取audio和camera track * 如果需要unsub所有的流,先通过configRemoteAudio, configRemoteTrack, * configRemoteScreenTrack来清除设置,然后调用subscribe */ - (void)subscribe:(NSString *)uid onResult:(void (^)(NSString *uid, AliRtcVideoTrack vt, AliRtcAudioTrack at))onResult;
- setRemoteViewConfig:为远端的视频设置参数及绘制窗口。
/** * @brief 为远端的视频设置参数及绘制窗口 * @param canvas canvas包含了窗口以及渲染方式 * @param uid User ID。从App server分配的唯一标示符 * @param track 需要设置的track * @return 0表示Success,非0表示Failure * @note 支持joinChannel之前和之后切换窗口。如果canvas为nil或者view为nil,则停止渲染相应的流 * 如果在播放过程中需要重新设置render mode,请保持canvas中其他成员变量不变,仅修改renderMode * 如果在播放过程中需要重新设置mirror mode,请保持canvas中其他成员变量不变,仅修改mirrorMode */ - (int)setRemoteViewConfig:(AliVideoCanvas *)canvas uid:(NSString *)uid forTrack:(AliRtcVideoTrack)track;
- setDelegate:设置代理。
/// 设置代理 /// @param delegate 代理对象 - (void)setDelegate:(id<RTCInteractiveClassDelegate>)delegate;
- switchCamera:切换前后摄像头。
/** * @brief 切换前后摄像头 * @return 0表示Success 非0表示Failure * @note 只有iOS和android提供这个接口 */ - (int)switchCamera;
- subscribeRemoteTrack:设置是否拉取远端用户的流(相机流、屏幕流、音频流)。
/** * @brief 设置是否拉取远端用户的流(相机流,屏幕流,音频流) * @param uid userId 从App server分配的唯一标示符。 * @param master 是否优先拉取大流 * @param enable YES: 拉取; NO: 不拉取 * @note 可以在joinChannel之前或者之后设置。 */ - (void)subscribeRemoteTrack:(NSString *)uid preferMaster:(BOOL)master enable:(BOOL)enable;
- getDisplayNameWithUid:获取用户名。
/// 获取用户名 /// @param userid userId - (NSString *)getDisplayNameWithUid:(NSString *)userid;
RTC回调接口
- onEnterSeatResult:用户上麦的通知。
/// 自己上麦通知 /// @param errorCode 结果 - (void)onEnterSeatResult:(int)errorCode;
- onLeaveSeatResult:用户下麦的通知。
/// 自己下线通知 /// @param errorCode 结果 - (void)onLeaveSeatResult:(int)errorCode;
- onOccurError:错误信息的通知。
/** * @brief 如果engine出现error,通过这个回调通知app * @param error Error type */ - (void)onOccurError:(int)error;
- onOccurWarning:警告信息的通知。
/** * @brief 如果engine出现warning,通过这个回调通知app * @param warn Warning type */ - (void)onOccurWarning:(int)warn;
- onRoomDestroy:房间被销毁的回调。
/// 房间被销毁通知 - (void)onRoomdestroy;
- onSDKError:SDK发生异常需要销毁实例。
/** * @brief 如果engine出现严重error,通过这个回调通知app * @param error 错误类型 */ - (void)onSDKError:(int)error;
- onJoinChannelResult:加入房间的通知。
/** * @brief 加入频道结果 * @param result 加入频道结果,成功返回0,失败返回错误码 * @note 此回调等同于joinChannel接口的block,二者择一处理即可 */ - (void)onJoinChannelResult:(int)result onJoinChannelResult:(AliRtcAuthInfo *)authInfo;
- onLeaveChannelResult:离开房间的通知。
/** * @brief 离开频道结果 * @param result 离开频道结果,成功返回0,失败返回错误码 * @note 调用leaveChannel接口后返回,如果leaveChannel后直接调用destroy,将不会收到此回调 */ - (void)onLeaveChannelResult:(int)result;
- onRemoteTrackAvailableNotify:远端用户音视频流发生变化时的回调。
/** * @brief 当远端用户的流发生变化时,返回这个消息 * @note 远方用户停止推流,也会发送这个消息 */ - (void)onRemoteTrackAvailableNotify:(NSString *)uid onRemoteTrackAvailableNotify:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack;
- onSubscribeChangedNotify:当订阅情况发生变化时的回调。
/** * @brief 当订阅情况发生变化时,返回这个消息 */ - (void)onSubscribeChangedNotify:(NSString *)uid onSubscribeChangedNotify:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack;
- onUserAudioMuted:用户取消音频的通知
/** * @brief 用户muteAudio通知 * @param uid 执行muteAudio的用户 * @param isMute YES:静音 NO:未静音 */ - (void)onUserAudioMuted:(NSString *)uid onUserAudioMuted:(BOOL)isMute;
- onUserVideoMuted:用户取消视频通知。
/** * @brief 用户muteVideo通知 * @param uid 执行muteVideo的用户 * @param isMute YES:推流黑帧 NO:正常推流 */ - (void)onUserVideoMuted:(NSString *)uid videoMuted:(BOOL)isMute;
- onNetworkQualityChanged:网络质量变化时的回调。
/** * @brief 网络质量变化时发出的消息 * @param uid 网络质量发生变化的uid * @param upQuality 上行网络质量 * @param downQuality 下行网络质量 * @note 当网络质量发生变化时触发,uid为@""时代表self的网络质量变化 */ - (void)onNetworkQualityChanged:(NSString *)uid onNetworkQualityChanged:(AliRtcNetworkQuality)upQuality downNetworkQuality:(AliRtcNetworkQuality)downQuality;
- onUpdateRoleNotify:角色切换成功的通知。
/** * @brief 当用户角色发生变化化时通知 * @param oldRole 变化前角色类型 * @param newRole 变化后角色类型 * @note 调用setClientRole方法切换角色成功时触发此回调 */ - (void)onUpdateRoleNotifyWithOldRole:(AliRtcClientRole)oldRole newRole:(AliRtcClientRole)newRole;
- onRemoteUserOnLineNotify:远端用户上线的通知。
/// 远端用户上线通知 /// @param uid 用户id - (void)onRemoteUserOnLineNotify:(NSString *)uid;
- onRemoteUserOffLineNotify:远端用户下线的通知。
/// 远端用户下线通知 /// @param uid 用户id - (void)onRemoteUserOffLineNotify:(NSString *)uid;
- onAudioVolumeCallback:订阅的音频音量、语音状态、UID。
/** * @brief 订阅的音频音量,语音状态和UID * @param array 表示回调用户音量信息数组,包含用户UID,语音状态以及音量,UID为"0"表示本地说话人。 * @param totalVolume 混音后的总音量,范围[0,255]。在本地用户的回调中,totalVolume;为本地用户混音后的音量;在远端用户的回调中,totalVolume; 为所有说话者混音后的总音量 */ - (void)onAudioVolumeCallback:(NSArray <AliRtcUserVolumeInfo *> *_Nullable)array totalVolume:(int)totalVolume;
IM功能实现接口
- sharedInstance:获取IM管理类单例。
/// 获取IM管理类单例 + (AliImInterrativeEngine *)sharedInstance;
- destroySharedInstance:销毁IM管理类。
/// 销毁IM管理类 + (void)destroySharedInstance;
- login:登录频道。
/// 登录 /// @param uid 用户ID /// @param channelId 频道号ID /// @param name 用户昵称 - (void)login:(NSString *)uid channel:(NSString *)channelId displayName:(NSString *)name;
- logout:退出登录。
/// 退出登录 - (void)logout;
- sendTextMessage:发送文本消息。
/// 发送文本消息 /// @param message 发送文本 - (void)sendTextMessage:(NSString *)message;
- sendHandUp:发送举手。
/// 发送举手 /// @param mute 是否举手(YES:举手,目前仅支持YES) - (void)sendHandUp:(BOOL)mute;
- getGroupMessages:获取群消息。
/// 获取群消息 - (NSArray *)getGroupMessages;
IM回调接口
- imUpdateMessages:消息更新(包含从服务器拉取消息及新增消息)。
/// 消息更新 包含从服务器拉取消息及新增消息 /// @param messages 消息(全部) - (void)imUpdateMessages:(NSArray<LCIMMessage *> *)messages;
- imUpdateSingleMessage:更新单条消息。
/// 更新单条消息 /// @param msg 新消息 - (void)imUpdateSingleMessage:(LCIMMessage *)msg;
- imGroupMembersChanged:群成员加入离开变化更新。
/// 群成员加入离开变化更新 /// @param members 成员 - (void)imGroupMembersChanged:(NSArray<AIMPubGroupMember *> *)members;
- imReceiveRemoteBackHandUpCommand:收到老师反馈举手信令。
/// 收到老师反馈举手信令 /// @param mute 是否同意举手(YES:同意举手,NO:拒绝举手) /// @param uid 需执行的用户id - (void)imReceiveRemoteBackHandUpCommand:(BOOL)mute userId:(NSString *)uid;
- imReceiveRemoteMuteMicCommand:收到静音指令。
/// 收到静音指令 /// @param mute 是否静音 (YES:关闭麦克风,NO:打开麦克风) /// @param uid 需执行的用户id - (void)imReceiveRemoteMuteMicCommand:(BOOL)mute userId:(NSString *)uid;
- imReceiveRemoteMuteCameraCommand:收到相机流指令。
/// 收到相机流指令 /// @param mute 是否关闭相机流 (YES:关闭相机流,NO:打开相机流) /// @param uid 需执行的用户id - (void)imReceiveRemoteMuteCameraCommand:(BOOL)mute userId:(NSString *)uid;
- imReceiveRemoteMuteAllMicCommand:收到全员静音指令。
/// 收到全员静音指令 /// @param mute 是否全员静音 (YES:全员静音,NO:解除全员静音) - (void)imReceiveRemoteMuteAllMicCommand:(BOOL)mute;
- imSendMessageFailure:发送消息失败通知。
/// 发送消息失败通知 - (void)imSendMessageFailure:(NSString *)error;