通过阅读本文,您可以了解到iOS端互动大班课的集成方法。

环境要求

iOS端具体环境要求,更多信息,请参见使用限制

前提条件

  • 老师端(Electron)已集成并开启。具体操作,请参见Electron集成
  • 服务端已集成并开启。具体操作,请参见服务端集成
  • 环境中已安装Xcode 9.0或以上版本,更多信息,请参见Xcode
  • 您需要持有Apple开发证书或个人账号。

操作步骤

  1. 下载并解压Demo,更多信息,请参见Demo源码下载
    说明
    • 源码压缩文件内分为Android、iOS、Electron、Server四端文件。
    • 如果GitHub代码库下载缓慢,可安装加速插件等方式加速下载。
  2. 获取RTC鉴权。

    RTC登录鉴权是通过服务端获取的,需要在图中的位置输入Server地址:

    001
    说明
    • 此处Server地址和Electron端的baseServer保持一致,更多信息,请参见Electron集成
    • Server地址末尾需要加/,例如:https://www.aliyun.com/。
  3. 配置IM的AppID和AppKey。
    002
    说明 此处的AppID、AppKey和Electron端保持一致,更多信息,请参见Electron集成
  4. 在Podfile文件所在的目录执行以下命令安装功能模块。

    pod install

  5. 运行Demo。
    1. 使用Xcode打开\RTCSolution\RTCSolution.xcworkspace工程文件。
    2. 选择运行的Target为RTCSolution,然后将iOS设备与电脑有线连接,并在Xcode中选择相对应的设备(暂不支持模拟器运行)。
      001
    3. 单击General页签,修改Bundle Identifier,建议将Bundle Identifier改成com.<公司名>.<项目名>,避免由于Bundle已被注册从而运行失败。
      002
    4. 单击Signing & Capabilities页签,选中Automatically manage signing,然后单击Team下拉框,根据实际情况选择Team。
      003
      说明 如果之前没有添加过账号,可以选择Add an Account...,根据提示添加账号,然后在此处选择新添加的账号。
    5. 单击004,编译并运行。
      005

      如果在编译过程中出现问题或无法正常通话,请参见iOS端运行常见问题

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说明

表 1. RTC管理类功能实现接口
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 获取用户名。
表 2. RTC回调接口
API 描述
onEnterSeatResult 用户上麦的通知。
onLeaveSeatResult 用户下麦的通知。
onOccurError 错误信息的通知。
onOccurWarning 警告信息的通知。
onRoomDestroy 房间被销毁的回调。
onSDKError SDK发生异常需要销毁实例。
onJoinChannelResult 加入房间的通知。
onLeaveChannelResult 离开房间的通知。
onRemoteTrackAvailableNotify 远端用户音视频流发生变化时的回调。
onSubscribeChangedNotify 订阅情况发生变化时的回调。
onUserAudioMuted 用户取消音频的通知。
onUserVideoMuted 用户取消视频的通知。
onNetworkQualityChanged 网络质量变化时的回调。
onUpdateRoleNotify 角色切换成功的通知。
onRemoteUserOnLineNotify 远端用户上线的通知。
onRemoteUserOffLineNotify 远端用户下线的通知。
onAudioVolumeCallback 订阅的音频音量、语音状态、UID。
表 3. IM功能实现接口
API 描述
sharedInstance 获取IM管理类单例。
destroySharedInstance 销毁IM管理类。
login 登录频道。
logout 退出登录。
sendTextMessage 发送文本消息。
sendHandUp 发送举手。
getGroupMessages 获取群消息。
表 4. IM回调接口
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;