iOS CallKit 开发指南

    简介

    CallKit 是融云音视频通话功能的 UI 界面 SDK。包含了单人、多人音视频通话的界面的各种场景和功能。您可以快速的集成 CallKit 来实现丰富的音视频通话界面,并进行自己的 UI 定制开发。同时我们开源了 CallKit,您可以根据您的需要去使用。

    GitHub 项目:CallKit 开源代码

    开通方式

    音视频服务开通,请参考音视频开通方式说明。

    使用说明

    由于底层引擎技术不同,2.9.0 及之后的音视频 SDK 与 2.9.0 之前的 SDK 中的实时音视频不能互通。

    集成说明

    导入 SDK

    有两种方式可以将 SDK 导入您的项目中:

    • 通过 CocoaPods 管理依赖
    • 手动导入 SDK 并管理依赖

    使用 CocoaPods 导入 SDK

    1、 Cocoapods 的安装、使用,可以参考IM SDK - 下载与导入SDK文档。

    2、 使用 CocoaPods 导入融云 SDK

    在您的工程根目录下新建一个 Podfile 文件,在文件中输入以下内容。(在此以 2.9.0 版本为例,其中 “MyApp” 为自己工程名)

      target 'MyApp' do
        pod 'RongCloudRTC/RongCallLib', '2.9.0'
        pod 'RongCloudRTC/RongCallKit', '2.9.0'
      end
    

    然后在终端中运行以下命令:

      pod install
    

    完成后,CocoaPods 会在您的工程根目录下生成一个 .xcworkspace 文件。您需要通过此文件打开您的工程,而不是之前的 .xcodeproj

    手动导入 SDK

    1、 下载 SDK

    您可以到融云官方网站下载 SDK。

    2、 融云 IM SDKCall SDK 的基础。使用 CallKitCallLib,必须同时集成使用融云 IM SDK。 手动导入 IM SDK,可以参考 IM SDK - 下载与导入文档。

    SDK 文件说明:

    文件 说明 注意事项
    RongCallKit.framework CallKit 的 framework 库 使用 CallKit 必须导入
    RongCallLib.framework CallLib 的 framework 库 使用 CallLib 与使用 CallKit 都必须导入
    Blink.framework 通话引擎 必须导入,否则通话功能将无法使用
    Bailingquic.framework quic连接引擎 必须导入,否则通话连接将无法建立

    3、 手动集成了融云 SDK 之后,您需要在您的工程中导入以下库:

    • RongCallKit.framework
    • RongCallLib.framewrok
    • Bailingquic.framework
    • Blink.framework
    • CoreGraphics.framework
    • Foundation.framework
    • AudioToolbox.framework
    • UIKit.framework
    • GLKit.framework
    • CoreMedia.framework
    • CFNetwork.framework
    • AVFoundation.framework
    • SystemConfiguration.framework
    • Security.framework
    • CoreFoundation.framework
    • CoreMotion.framework
    • libz.tbd
    • libbz2.tbd
    • libiconv.tbd
    • libstdc++.tbd
    • libresolv.tbd
    • CoreVideo.framework
    • VideoToolbox.framework

    4、 在 Xcode 项目 Build Settings -> Other Linker Flags 中,增加"-ObjC"。

    5、 在 Xcode 项目 Build Settings 中,搜索 Enable Bitcode 将此设置为 NO。

    快速集成

    使用融云通话之前,必须先初始化 SDK 和连接服务器,详细内容可以参考 IMKit SDK 集成文档。

    发起通话

    使用 CallKit 可以通过两种方式发起通话:

    1. 在聊天界面输入扩展的加号内,点击音频通话/视频通话按钮直接发送通话。
    这个功能在 SDK 中已经默认实现了,您不需要做什么额外的操作。
    1. 调用 RCCall 类中的以下方法发起通话。

    2. 发起单人通话

    // RCCall Class
    
    /*!
     发起单人通话
    
     @param targetId  对方的用户ID
     @param mediaType 使用的媒体类型
     */
    - (void)startSingleCall:(NSString *)targetId
                  mediaType:(RCCallMediaType)mediaType;
    
    • 选择成员并发起多人通话
    // RCCall Class
    
    /*!
     选择成员并发起多人通话
    
     @param conversationType 会话类型
     @param targetId         会话目标ID
     @param mediaType        使用的媒体类型
    
     @discussion 此方法会先弹出选择成员界面,选择完成后再会发起通话。目前支持的会话类型有群组。
    
     @warning 如果您需要在群组中调用此接口发起多人会话,需要设置并实现groupMemberDataSource。
     */
    - (void)startMultiCall:(RCConversationType)conversationType
                  targetId:(NSString *)targetId
                 mediaType:(RCCallMediaType)mediaType;
    
    需要注意的是,如果您需要在群组中调用此接口发起多人会话,需要设置并实现 groupMemberDataSource
    SDK 在选择群组成员的时候,会调用 getAllMembersOfGroup:result: 接口获取群成员列表并显示。
    • 直接发起多人通话
    // RCCall Class
    
    /*!
     直接发起多人通话
    
     @param conversationType 会话类型
     @param targetId         会话目标ID
     @param mediaType        使用的媒体类型
     @param userIdList       邀请的用户ID列表
    
     @discussion 此方法会直接发起通话。目前支持的会话类型有群组。
    
     @warning 您需要设置并实现groupMemberDataSource才能加人。
     */
    - (void)startMultiCallViewController:(RCConversationType)conversationType
                                targetId:(NSString *)targetId
                               mediaType:(RCCallMediaType)mediaType
                              userIdList:(NSArray *)userIdList;
    

    通话接听

    当收到一个通话呼叫的时候,

    1. 当 App 处于前台状态的时候,SDK 会自动弹出通话界面。

    2. 当 App 处于后台活动状态的时候,SDK 会弹出本地通知并播放铃声。

    3. 当 App 处于后台暂停状态的时候,如果您的 App 开启了实时音视频后台运行模式并在开发者后台上传了 VoIP 推送证书,这时候 App 会在后台启动并弹出本地通知;否则,App 会收到远程推送提醒,VoIP Push 设置请参考 VoIP 推送设置文档

    关于 App 运行状态的更多信息,您可以参考 SDK 的运行状态文档。

    会话是否支持发起通话

    目前,SDK 支持在单聊发起单人通话,在群聊中发起多人通话。

    您可以通过 RCCall 类的以下接口查询当前会话的通话能力。

    // RCCall Class
    
    /*!
     当前会话类型是否支持音频通话
    
     @param conversationType 会话类型
    
     @return 是否支持音频通话
     */
    - (BOOL)isAudioCallEnabled:(RCConversationType)conversationType;
    
    /*!
     当前会话类型是否支持视频通话
    
     @param conversationType 会话类型
    
     @return 是否支持视频通话
     */
    - (BOOL)isVideoCallEnabled:(RCConversationType)conversationType;
    

    设置多人最大通话人数限制

    CallKit 默认音频通话最大人数为 20 人,视频通话最大人数为 7 人。

    如果不符合您的需求,您可以通过 RCCall 以下接口设置最大人数。

    // RCCall Class
    
    /*!
     音频通话支持的最大通话人数
     */
    @property (nonatomic, assign) int maxMultiAudioCallUserNumber;
    
    /*!
     视频通话支持的最大通话人数
     */
    @property (nonatomic, assign) int maxMultiVideoCallUserNumber;
    
    建议您在设置最大人数的时候,考虑移动设备的带宽(主要是多路视频通话)和UI交互友好。
    CallLib 的话音频和视频人数默认均没有限制。

    系统来电显示的app名字

    // RCCall Class
    
    /**
    系统来电显示的 app 名字
    */
    @property(nonatomic, copy) NSString *appLocalizedName;
    

    UI 界面说明

    CallKit 中默认实现了一套较为通用的通话 UI,包含单人音视频通话界面 RCCallSingleCallViewController 、多人音频通话界面 RCCallAudioMultiCallViewController 、多人视频通话界面 RCCallVideoMultiCallViewController、最小化的通话界面 RCCallFloatingBoard、聊天界面的通话提示 RCCallDetailMessageCellRCCallTipMessageCell等。

    如果能满足您的需求,您可以基于 CallKit 直接开发,如果您的需求较为特殊,可以直接使用 CallLib 并实现相关的界面UI,您也可以向我们商务索取 CallKit 源码以供参考。

    实时音视频推送设置

    详细请参考 VoIP 推送设置文档