您可以阅读本文,了解iOS端超级小班课的集成操作。

前提条件

开发前的环境要求如下表所示,详情请参见:使用限制

类别 说明
iPhone设备 支持iPhone5及以上。
系统版本 支持iOS 8.0及以上。
CPU架构 支持真机架构armv7+arm64,不支持模拟器i386、x86架构。
Xcode版本 支持Xcode9.0及以上。下载Xcode
CocoaPods版本 支持1.5.0及以上。具体操作,请参见安装CocoaPods
其他 不支持Bitcode,不支持屏幕旋转。

您需要集成并启动Web端,具体操作,请参见Web集成

说明 您需要持有Apple开发证书或个人账号。

Demo运行指引

说明

您在集成iOS端时,如果遇到问题,或者Demo体验过程中出现无法创建房间或通话等问题,请参见iOS端运行常见问题

  1. 获取应用ID和AppKey。
    说明

    应用ID和AppKey需要对应,不同的应用ID有不同的AppKey。

    在后续开发中会使用应用ID和AppKey,建议记录到本地文档中,妥善保存。

    1. 登录RTC控制台
    2. 在左侧导航栏单击应用管理,进入应用管理页面。
    3. 获取应用ID和查询AppKey。
      • 应用ID:可在应用ID/名称列表下直接获取。
      • AppKey:单击查询AppKey获取AppKey。
      如果您还未有应用,您可以单击创建应用创建。获取AppKey和应用ID
  2. 下载Demo并解压。
    解压成功之后如下图所示:目录
    说明
    • Demo源码中未集成AliRTC SDK。需要手动进行集成。
    • 源码压缩文件内分为Web端、Android端、iOS端三个文件。
    • 若遇到GitHub代码库下载缓慢的问题,可通过安装加速插件等方式加速下载。
  3. 打开终端,定位到iOS文件夹下Podfile文件所在的目录,执行pod install命令。
    安装后生成的Pods文件夹已在iOS目录下。
  4. 修改配置文件。

    打开解压后的Demo文件夹alibabacloud-AliRtcSuperClass-demo,找到iOS/RTCSmallClass/RTCSmallClass/RTC/RTCSmallClass.m⁩文件。在文件的第339行和340行填写AppId和AppKey。

    配置文件
    注意

    本Demo中在客户端代码配置AppId和AppKey的方式,很容易被反编译逆向破解,一旦AppId和AppKey泄露,攻击者就可以盗用您的阿里云流量,因此该配置方式仅适合用于本地Demo的运行和功能调试。

    正确的Token签发方式是将Token的计算代码集成到您的服务端,并提供面向App的接口,在需要Token时由您的App接口向业务服务器发起请求获取动态Token。具体操作,请参见生成Token

  5. 导入Demo源码。

    打开Xcode,单击Open a project or file,双击打开iOS目录下的RTCSolution.xcworkspace文件。

    导入源码
  6. 选择运行Target为RTCSolution,将一台IOS真机设备使用数据线与电脑链接,在Xcode中选择相应的真机设备,真机在设置中打开开发者模式。(暂不支持模拟器运行)
    选择Target
  7. 修改Bundle Identifier。
    注意 Bundle Identifier改成为com.<公司名>.<项目名>,避免由于Bundle已被注册从而运行失败。
    General选项卡中修改Bundle Identifier。General
    Sign & Capabilities选项卡中修改Bundle Identifier。Sign
  8. Sign & Capabilities选项卡,勾选Automatically manage signing,在下方选择自己的Team
    1. 选择Team
      选择Team
    2. 若以前没添加过账号,单击Add an Account添加。
      添加
    3. 完成账号添加。
      添加Team
    4. 在Team里选择新创建的账号即可,并且在完成签名后确保下方没有报错提示。
  9. 单击build and run按钮编译。
    编译
  10. 开启超级小班课。

    iOS端主要为学生听课场景。

    1. 教师由Web端输入姓名进入教室,为助教和学生发送教室码。
    2. 助教由Web端输入姓名和教室码进入教室,选择需要管理的小组进行管理。
    3. 学生由Web端或移动端(Android或iOS)输入姓名和教室码进行教室听课学习,还可以进行连麦互动。

Demo源码解析

  1. 项目结构说明

    Demo是以Cocoapods Lib的方式集成到项目中的。

    RTC把开发的业务代码封装到名称为RTCSmallClass的库当中,这样RTCSmallClass就可以像一个本地的第三方库一样。可以随便移植到其他项目中。

    您只需在Podfile中指定RTCSmallClass库的路径即可。
     pod 'RTCSmallClass', :path => '../RTCSmallClass'
        ##   pod 'RTCSmallClass'  表示项目依赖RTCSmallClass库
        ##   path => './RTCSmallClass'  表示RTCSmallClass库的位置(相对于Podfile文件)
    livcVoiceCallSolo组件库目录说明,如下表所示。
    文件名 说明
    RTCSmallClass.podspec 组件的描述文件
    RTCSmallClass.bundle 存放资源的bundle
    SmallClassLogin 登录页
    SmallClassMainController 通话页
    SmallClassGroupMemberController 小组成员页
  2. 接口与回调

    接口

    API 描述
    sharedInstance 获取单例对象
    destorySharedInstance 销毁实例对象
    login 加入房间
    logout 退出房间
    muteLocalCamera 切换是否停止发布本地视频麦
    muteLocalMic 切换是否停止发布本地音频
    switchCamera 切换摄像头
    getUserInfo 获取用户信息
    startPreview 开始预览
    stopPreview 停止预览
    startPublish 开始推流
    stopPublish 停止推流
    getRemoteUserList 获取远端用户列表

    事件回调

    API 描述
    onJoin 用户上线通知
    onLeave 用户下线通知
    onOccurError SDK报错
    onOccurWarning SDK警告
    onRoomDestroy 房间被销毁的回调
    onSDKError SDK报错,需要销毁实例
    onJoinChannelResult 加入房间通知
    onLeaveChannelResult 离开房间通知
    onNetworkQualityChanged 网络状态回调
    onUserVideoMuted 用户muteVideo通知
    onUserAudioMuted 用户muteAudio通知
    onSubscribeResult 订阅成功回调
    onUserSpeaking 判断用户是否在说话
    onRemoteTraceAvaliable 当订阅情况发生变化时的回调

    接口示例

    • 获取单例对象

      接口名称:sharedInstance。

      /**
           * 获取单例
           */
         [RTCSmallClass sharedInstance];
    • 毁单例对象

      接口名称:destorySharedInstance。

      /// 销毁RTCSDK
      - (void)destroySharedInstance;
    • 加入房间

      接口名称:login。

      /// 加入频道
      /// @param channel 频道
      /// @param userName 用户昵称
      - (void)login:(NSString *)channel userName:(NSString *)userName;
    • 退出房间

      接口名称:logout。

      /// 离开所有频道
      - (void)logout;
    • 切换是否停止发布本地视频

      接口名称:muteLocalCamera。

      /// 禁用摄像头
      /// @param mute 是否禁用
      /// @param channel 频道
      - (int)muteLocalCamera:(BOOL)mute channel:(NSString *)channel;
    • 切换是否停止发布本地音频

      接口名称:muteLocalMic。

      /// 静音
      /// @param mute 是否静音
      /// @param channel 频道
      - (int)muteLocalMic:(BOOL)mute channel:(NSString *)channel;
    • 设置摄像头

      接口名称:switchCamera。

      /// 旋转摄像头
      - (int)switchCamera;
    • 获取用户信息

      接口名称:getUserInfo。

       /// 获取用户信息
      /// @param uid 用户id
      /// @param channel 频道
      - (NSDictionary *)getUserInfo:(NSString *)uid channel:(NSString *)channel;
    • 开始预览

      接口名称:startPreview。

      /// 开始本地预览
      /// @param preview 预览的view
      - (void)startPreview:(UIView *)preview;
    • 停止预览

      接口名称:stopPreview。

      /// 停止本地预览
      - (void)stopPreview;
    • 开始推流

      接口名称:startPublish。

        /// 开始推流
      /// @param channel 频道
      - (void)startPublish:(NSString *)channel;
    • 停止推流

      接口名称:stopPublish。

        
      /// 停止推流
      /// @param channel 频道
      - (void)stopPublish:(NSString *)channel;
    • 获取远端用户列表

      接口名称:getRemoteUserList。

      /// 获取某个频道远端用户列表
      /// @param channel 频道
      - (NSArray *)getRemoteUserList:(NSString *)channel;

    回调示例

    • 用户上线通知

      回调名称:onJoin。

        /// 远端用户加入频道
      /// @param channel 频道
      /// @param uid 用户id
      - (void)channel:(NSString *)channel onJoin:(NSString *)uid;
    • 用户下线通知

      回调名称:onLeave。

      /// 远端用户离开频道
      /// @param channel 频道
      /// @param uid 用户id
      - (void)channel:(NSString *)channel onLeave:(NSString *)uid;
    • SDK报错

      回调名称:onOccurError。

      /// 错误码
      /// @param channel 频道
      /// @param error 错误码
      - (void)channel:(NSString *)channel onOccurError:(int)error;
    • SDK警告

      回调名称:onOccurWarning。

      /// 警告
      /// @param channel 频道
      /// @param warn 警告码
      - (void)channel:(NSString *)channel onOccurWarning:(int)warn;
    • 房间被销毁的回调

      回调名称:onRoomDestroy。

         /// 房间被销毁通知
      - (void)onRoomdestroy;
    • SDK报错,需要销毁实例

      回调名称:onSDKError。

      /// sdk严重错误 需要销毁引擎
      /// @param channel 频道
      /// @param error 错误码
      - (void)channel:(NSString *)channel onSDKError:(int)error;
    • 加入房间通知

      回调名称:onJoinChannelResult。

        /// 加入频道
      /// @param channel 频道
      /// @param result 结果
      - (void)channel:(NSString *)channel onJoinChannelResult:(int)result;
    • 离开房间通知

      回调名称:onLeaveChannelResult。

      /// 离开频道
      /// @param channel 频道
      /// @param result 结果
      - (void)channel:(NSString *)channel onLeaveChannelResult:(int)result ;
    • 网络状态

      回调名称:onNetworkQualityChanged。

      /// 网络变化判断
      /// @param uid 用户id
      /// @param upQuality 上行网络质量
      /// @param downQuality 下行网络质量
      - (void)onNetworkQualityChanged:(NSString *)uid
                     upNetworkQuality:(AliRtcNetworkQuality)upQuality
                   downNetworkQuality:(AliRtcNetworkQuality)downQuality;
    • 用户muteVideo通知

      回调名称:onUserVideoMuted。

      /// 用户是否禁用摄像头
      /// @param channel 频道
      /// @param uid 用户id
      /// @param isMute 是否禁用
      - (void)channel:(NSString *)channel onUserVideoMuted:(NSString *)uid videoMuted:(BOOL)isMute;
    • 用户muteAudio通知

      回调名称:onUserAudioMuted。

      /// 用户是否静音
      /// @param channel 频道
      /// @param uid 用户id
      /// @param isMute 用户是否静音
      - (void)channel:(NSString *)channel onUserAudioMuted:(NSString *)uid audioMuted:(BOOL)isMute;
    • 订阅成功

      回调名称:onSubscribeResult。

      /// 订阅成功
      /// @param channel 频道
      /// @param uid 用户id
      /// @param result 结果
      - (void)channel:(NSString *)channel onSubscribe:(NSString *)uid result:(BOOL)result;
    • 判断用户是否在说话

      回调名称:onUserSpeaking。

      /// 用户说话状态改变
      /// @param channel 频道
      /// @param uid 用户id
      /// @param speaking 是否正在说话
      /// @param name 用户昵称
      - (void)channel:(NSString *)channel onUserSpeaking:(NSString *)uid speaking:(BOOL) speaking displayName:(NSString *)name;
    • 当订阅情况发生变化时的回调

      回调名称:onRemoteTraceAvaliable。

      /// 远端流变化
      /// @param channel 频道
      /// @param uid 用户id
      /// @param abaliable 是否可用
      - (void)channel:(NSString *)channel onRemoteTrace:(NSString *)uid avaliable:(BOOL)abaliable;