【音視頻】iOS CallLib 開發指南
音視頻服務開通,請參考音視頻開通方式說明。
使用說明
由於底層引擎技術不同,2.6.0
之後的音視頻 SDK 與 2.6.0
之前的 SDK 中的實時音視頻不能互通。
音視頻 SDK 為商用收費功能,之前的 SDK 中的實時音視頻為免費測試功能,如果您還想使用之前的實時音視頻,可以使用 2.5.2
版本。
集成說明
導入 SDK
有兩種方式可以將 SDK 導入您的項目中:
通過 CocoaPods 管理依賴
手動導入 SDK 並管理依賴
手動導入 SDK
1、 下載 SDK 您可以到融雲官方網站下載SDK。
2、 融雲 IM SDK
是 Call SDK
的基礎。使用 CallLib
,必須同時集成使用融雲 IM SDK
IM SDK
,可以參考 IM SDK - 下載與導入 SDK文檔。SDK 文件說明
文件 | 說明 | 註意事項 |
---|---|---|
RongCallLib.framework | CallLib 的 framework 庫 | 必須導入 |
AgoraRtcEngineKit.framework | 通話引擎 | 必須導入,否則通話功能將無法使用 |
3、 手動集成了融雲 SDK 之後,您需要在您的工程中導入
RongCallLib.framewrok、AgoraRtcEngineKit.framework 以及系統庫 CoreMotion.framework、VideoToolbox.framework、libresolv.tbd。
4、 在 Xcode
Build Settings -> Other Linker Flags
中,增加"-ObjC"。快速集成
使用融雲通話之前,必須先初始化 SDK 和連接服務器,詳細內容可以參考 IMLib 快速集成文檔。
1、發起通話
您可以調用 RCCallClient
以下接口,發起通話。
// RCCallCleint Class/*! 發起一個通話 @param conversationType 會話類型 @param targetId 目標會話ID @param userIdList 邀請的用戶ID列表 @param type 發起的通話媒體類型 @param delegate 通話監聽 @param extra 附件信息 @return 呼出的通話實體 */- (RCCallSession *)startCall:(RCConversationType)conversationType targetId:(NSString *)targetId to:(NSArray *)userIdList mediaType:(RCCallMediaType)type sessionDelegate:(id<RCCallSessionDelegate>)delegate extra:(NSString *)extra;
其中,您可以通過返回的通話實體,操控通話和獲取通話相關信息,通話狀態發生變化時會通過您傳入的 delegate 進行回調。
2、接收呼入的通話
您需要設置 RCCallClient
的全局通話監聽,來監聽通話呼入。
// RCCallCleint Class/*! 設置全局通話呼入的監聽器 @param delegate CallLib全局通話呼入的監聽器 */- (void)setDelegate:(id<RCCallReceiveDelegate>)delegate;
3、會話是否支持發起通話
目前,SDK 支持在單聊發起單人通話,在討論組、群聊中發起多人通話。
您可以通過 RCCallClient
類的以下接口查詢當前會話的通話能力。
// RCCallClient Class/*! 當前會話類型是否支持音頻通話 @param conversationType 會話類型 @return 是否支持音頻通話 */- (BOOL)isAudioCallEnabled:(RCConversationType)conversationType;/*! 當前會話類型是否支持視頻通話 @param conversationType 會話類型 @return 是否支持視頻通話 */- (BOOL)isVideoCallEnabled:(RCConversationType)conversationType;
4、獲取當前的通話實體
您可以通過 RCCallClient 的以下接口,查詢當前的通話實體。
// RCCallClient Class/*! 當前的通話會話實體 */@property (nonatomic, strong, readonly) RCCallSession *currentCallSession;
5、通過通話實體操控通話
通話實體 RCCallSession
包含當前通話的所有信息,您可以通過其中的接口,操控當前通話和獲取相關信息,在發起通話和接收到呼入的通話時會獲取到相應的通話實體。
如:接聽當前來電。
// RCCallSession Class/*! 接聽來電 @param type 接聽使用的媒體類型 */- (void)accept:(RCCallMediaType)type;
掛斷當前通話。
// RCCallSession Class/*! 掛斷通話 */- (void)hangup;
邀請用戶加入當前通話(僅限邀請討論組和群組中的成員加入)。
// RCCallSession Class/*! 邀請用戶加入通話 @param userIdList 用戶ID列表 @param type 建議被邀請者使用的媒體類型 */- (void)inviteRemoteUsers:(NSArray *)userIdList mediaType:(RCCallMediaType)type;
設置視頻通話中某個用戶的 View 。
// RCCallSession Class/*! 設置用戶所在的視頻View @param userId 用戶ID(自己或他人) @param view 視頻的View */- (void)setVideoView:(UIView *)view userId:(NSString *)userId;
切換自己使用的媒體類型。
// RCCallSession Class/*! 更換自己使用的媒體類型 @param type 媒體類型 */- (BOOL)changeMediaType:(RCCallMediaType)type;
一個通話中,允許每個用戶的媒體類型不一致,也就是說可以有些人以視頻接入,有些人以音頻接入。
設置靜音。
// RCCallSession Class/*! 設置靜音狀態 @param muted 是否靜音 @return 是否設置成功 @discussion 默認值為NO。 */- (BOOL)setMuted:(BOOL)muted;
設置揚聲器狀態。
// RCCallSession Class/*! 設置揚聲器狀態 @param speakerEnabled 是否開啟揚聲器 @return 是否設置成功 */- (BOOL)setSpeakerEnabled:(BOOL)speakerEnabled;
開啟或關閉攝像頭。
// RCCallSession Class/*! 設置攝像頭狀態 @param cameraEnabled 是否開啟攝像頭 @return 是否設置成功 @discussion 音頻通話的默認值為NO,視頻通話的默認值為YES。 */- (BOOL)setCameraEnabled:(BOOL)cameraEnabled;
切換前後攝像頭。
// RCCallSession Class/*! 切換前後攝像頭 @return 是否切換成功 */- (BOOL)switchCameraMode;
6、獲取通話相關信息
您可以通過通話實體 RCCallSession
中獲取當前通話的相關信息。
當前的通話狀態。
// RCCallSession Class/*! 通話的當前狀態 */@property (nonatomic, assign, readonly) RCCallStatus callStatus;
通話的發起人和邀請者。
// RCCallSession Class/*! 通話的最初發起人 */@property (nonatomic, strong, readonly) NSString *caller;/*! 邀請當前用戶加入通話的邀請者 */@property (nonatomic, strong, readonly) NSString *inviter;
通話的開始時間和接通時間。
// RCCallSession Class/*! 通話開始的時間 @discussion 如果是用戶呼出的通話,則startTime為通話呼出時間;如果是呼入的通話,則startTime為通話呼入時間。 */@property (nonatomic, assign, readonly) long long startTime;/*! 通話接通時間 */@property (nonatomic, assign, readonly) long long connectedTime;
通話掛斷的原因。
// RCCallSession Class/*! 通話掛斷原因 */@property (nonatomic, assign) RCCallDisconnectReason disconnectReason;
7、通話狀態的回調
如果您實現並設置了 RCCallSessionDelegate
,當通話狀態發生變化的時候,會回調相關接口。
您可以在 startCall
的時候傳入或者手動設置通話狀態監聽。
// RCCallClient Class /*! 發起一個通話 @param conversationType 會話類型 @param targetId 目標會話ID @param userIdList 邀請的用戶ID列表 @param type 發起的通話媒體類型 @param delegate 通話監聽 @param extra 附件信息 @return 呼出的通話實體 */ - (RCCallSession *)startCall:(RCConversationType)conversationType targetId:(NSString *)targetId to:(NSArray *)userIdList mediaType:(RCCallMediaType)type sessionDelegate:(id<RCCallSessionDelegate>)delegate extra:(NSString *)extra; // RCCallSession Class /*! 設置通話狀態變化的監聽器 @param delegate 通話狀態變化的監聽器 */ - (void)setDelegate:(id<RCCallSessionDelegate>)delegate;
當通話狀態發生變化的時候,如接通、結束、對方振鈴、有人加入通話、有人掛斷、發生警告等都會進行回調。
// RCCallSession Class/*! 通話狀態變化的監聽器 */@protocol RCCallSessionDelegate <NSObject>@optional/*! 通話已接通 */- (void)callDidConnect;/*! 通話已結束 */- (void)callDidDisconnect;/*! 對端用戶正在振鈴 @param userId 用戶ID */- (void)remoteUserDidRing:(NSString *)userId;/*! 有用戶被邀請加入通話 @param userId 被邀請的用戶ID @param mediaType 希望被邀請者使用的媒體類型 */- (void)remoteUserDidInvite:(NSString *)userId mediaType:(RCCallMediaType)mediaType;/*! 對端用戶加入了通話 @param userId 用戶ID @param mediaType 用戶的媒體類型 */- (void)remoteUserDidJoin:(NSString *)userId mediaType:(RCCallMediaType)mediaType;/*! 對端用戶切換了媒體類型 @param userId 用戶ID @param mediaType 切換至的媒體類型 */- (void)remoteUserDidChangeMediaType:(NSString *)userId mediaType:(RCCallMediaType)mediaType;/*! 對端用戶開啟或管理了攝像頭的狀態 @param userId 用戶ID @param muted 是否關閉攝像頭 */- (void)remoteUserDidDisableCamera:(BOOL)disabled byUser:(NSString *)userId;/*! 對端用戶掛斷 @param userId 用戶ID @param reason 掛斷的原因 */- (void)remoteUserDidLeft:(NSString *)userId reason:(RCCallDisconnectReason)reason;/*! 通話過程中的錯誤回調 @param error 錯誤碼 @warning 這個接口回調的錯誤碼主要是為了提供必要的log以及提示用戶,如果是不可恢復的錯誤,SDK會掛斷電話並回調callDidDisconnect,App可以在callDidDisconnect中統一處理通話結束的邏輯。 */- (void)errorDidOccur:(RCCallErrorCode)error;@end
實時音視頻推送設置
詳細請參考 VoIP 推送設置文檔。
更多說明
CallLib
通話不限制最大人數。如果需要限制的話,您可以在調用 startCall
和 inviteRemoteUsers
的時候加判斷人數的邏輯。
【音視頻】iOS CallLib 開發指南