2025-10-09 16:48:46 +08:00

385 lines
14 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "NECallEngine.h"
#import "NECallEngineConsts.h"
#import "NEGroupCallKit.h"
#import "NERtcCallKitConsts.h"
#import "NERtcCallKitContext.h"
#import "NERtcCallKitJoinChannelEvent.h"
#import "NERtcCallKitPushConfig.h"
#import "NERtcCallOptions.h"
// #import "NERtcCallKitDelegate.h"
//! Project version number for NERtcCallKit.
// FOUNDATION_EXPORT double NERtcCallKitVersionNumber;
//! Project version string for NERtcCallKit.
// FOUNDATION_EXPORT const unsigned char NERtcCallKitVersionString[];
// In this header, you should import all the public headers of your framework using statements like
// #import <NERtcCallKit/PublicHeader.h>
NS_ASSUME_NONNULL_BEGIN
typedef void (^NERtcCallKitRecordMessageHander)(NIMMessage *message);
@protocol NERtcCallKitDelegate <NSObject>
@optional
/// 收到邀请的回调
/// @param invitor 邀请方
/// @param userIDs 房间中的被邀请的所有人(不包含邀请者)
/// @param isFromGroup 是否是群组
/// @param groupID 群组ID
/// @param type 通话类型
- (void)onInvited:(NSString *)invitor
userIDs:(NSArray<NSString *> *)userIDs
isFromGroup:(BOOL)isFromGroup
groupID:(nullable NSString *)groupID
type:(NERtcCallType)type
NERtcCallKitDeprecate("use -onInvited:userIDs:isFromGroup:groupID:type:attachment: instead");
/// 收到邀请的回调
/// @param invitor 邀请方
/// @param userIDs 房间中的被邀请的所有人(不包含邀请者)
/// @param isFromGroup 是否是群组
/// @param groupID 群组ID
/// @param type 通话类型
- (void)onInvited:(NSString *)invitor
userIDs:(NSArray<NSString *> *)userIDs
isFromGroup:(BOOL)isFromGroup
groupID:(nullable NSString *)groupID
type:(NERtcCallType)type
attachment:(nullable NSString *)attachment;
/// 接受邀请的回调
/// @param userID 接受者
- (void)onUserEnter:(NSString *)userID;
/// 拒绝邀请的回调
/// @param userID 拒绝者
- (void)onUserReject:(NSString *)userID;
/// 取消邀请的回调
/// @param userID 邀请方
- (void)onUserCancel:(NSString *)userID;
/// 用户离开的回调.
/// @param userID 用户userID
- (void)onUserLeave:(NSString *)userID;
/// 用户异常离开的回调
/// @param userID 用户userID
- (void)onUserDisconnect:(NSString *)userID;
/// 用户接受邀请的回调
/// @param userID 用户userID
- (void)onUserAccept:(NSString *)userID;
/// 忙线
/// @param userID 忙线的用户ID
- (void)onUserBusy:(NSString *)userID;
/// 通话类型切换的回调仅1对1呼叫有效
/// @param callType 切换后的类型
/// @param state 切换应答类型: 邀请/同意/拒绝
- (void)onCallTypeChange:(NERtcCallType)callType withState:(NERtcSwitchState)state;
/// 通话类型切换的回调仅1对1呼叫有效
/// @param callType 切换后的类型
- (void)onCallTypeChange:(NERtcCallType)callType
NERtcCallKitDeprecate("use -onCallTypeChange:withState: instead");
/// 通话结束
- (void)onCallEnd;
/// 呼叫超时
- (void)onCallingTimeOut;
/// 连接断开
/// @param reason 断开原因
- (void)onDisconnect:(NSError *)reason;
/// 发生错误
- (void)onError:(NSError *)error;
/// 启用/禁用相机
/// @param available 是否可用
/// @param userID 用户ID
- (void)onCameraAvailable:(BOOL)available userID:(NSString *)userID;
/// 启用/禁用麦克风
/// @param available 是否可用
/// @param userID 用户userID
- (void)onAudioAvailable:(BOOL)available userID:(NSString *)userID;
/// 视频采集变更回调
/// @param muted 是否关闭采集
/// @param userID 用户ID
- (void)onVideoMuted:(BOOL)muted userID:(NSString *)userID;
/// 音频采集变更回调
/// @param muted 是否关闭采集
/// @param userID 用户ID
- (void)onAudioMuted:(BOOL)muted userID:(NSString *)userID;
/// 自己加入成功的回调,通常用来上报、统计等
/// @param event 回调参数
- (void)onJoinChannel:(NERtcCallKitJoinChannelEvent *)event;
/// 首帧解码成功的回调
/// @param userID 用户id
/// @param width 宽度
/// @param height 高度
- (void)onFirstVideoFrameDecoded:(NSString *)userID width:(uint32_t)width height:(uint32_t)height;
/// 网络状态监测回调
/// @param stats key为用户ID, value为对应网络状态
- (void)onUserNetworkQuality:(NSDictionary<NSString *, NERtcNetworkQualityStats *> *)stats;
/// 呼叫请求已被其他端接收的回调
- (void)onOtherClientAccept;
/// 呼叫请求已被其他端拒绝的回调
- (void)onOtherClientReject;
/// 远端用户暂停或恢复发送视频流回调。
- (void)onNERtcEngineUser:(uint64_t)userID videoMuted:(BOOL)muted;
- (void)onNERtcEngineUserVideoDidStartWithUserID:(uint64_t)userID
videoProfile:(NERtcVideoProfileType)profile;
- (void)onRtcInitEnd;
@end
@interface NERtcCallKit : NSObject
/// 通话状态
@property(nonatomic, assign, readonly) NERtcCallStatus callStatus;
/// 单位:秒,IM服务器邀请2分钟后无响应为超时,最大值不超过2分钟。
@property(nonatomic, assign) NSTimeInterval timeOutSeconds;
/// 安全模式音视频房间token获取nil表示非安全模式. Block中一定要调用complete
@property(nonatomic, copy, nullable) NERtcCallKitTokenHandler tokenHandler;
/// 推送配置定制化修改config.pushTitleconfig.pushContent来完成。需要的上下文内容在context对象中提供。
@property(nonatomic, copy, nullable) NERtcCallKitPushConfigHandler pushConfigHandler;
/// 话单自定义回调如果需要修发送话单内容可以在此回调中修改message相关字段
@property(nonatomic, copy, nullable) NERtcCallKitRecordMessageHander recordHandler;
/// NERtcEngine 的回调接口,由用户提供
@property(nonatomic, weak) id<NERtcEngineDelegateEx> engineDelegate;
/// 中转NERtcEngine统计回调
@property(nonatomic, weak) id<NERtcEngineMediaStatsObserver> observer;
/// 单例
+ (instancetype)sharedInstance;
/// 初始化,所有功能需要先初始化
/// @param appKey 云信后台注册的appKey
- (void)setupAppKey:(NSString *)appKey options:(nullable NERtcCallOptions *)options;
/// 初始化,所有功能需要先初始化
/// @param appKey 云信后台注册的appKey
/// @param rtcUid 用户自定义rtc uid如果不需要自定义传入 <= 0 任意整数(或者使用-
/// (void)setupAppKey:(NSString *)appKey options:(nullable NERtcCallOptions *)options
/// 初始化接口),内部自动生成,如果初始化传入会优先使用外部传入
- (void)setupAppKey:(NSString *)appKey
withRtcUid:(uint64_t)rtcUid
options:(nullable NERtcCallOptions *)options;
/// 初始化,所有功能需要先初始化,支持私有化
/// @param appKey 云信后台注册的appKey
/// @param options IM 推送配置Rtc是否初始化
/// @param context Rtc初始化配置私有化参数配置
- (void)setupAppKey:(NSString *)appKey
options:(nullable NERtcCallOptions *)options
withContext:(nonnull NERtcEngineContext *)context;
/// 登录IM接口所有功能需要先进行登录后才能使用
/// @param userID IM用户accid
/// @param token IM用户token
/// @param completion 回调
- (void)login:(NSString *)userID
token:(NSString *)token
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 更新APNS deviceToken
/// @param deviceToken 注册获得的deviceToken
- (void)updateApnsToken:(NSData *)deviceToken;
/// 更新 PushKit Token
/// @param pushkitToken 目前仅支持 PKPushTypeVoIP
- (void)updatePushKitToken:(NSData *)pushkitToken;
/// 登出
- (void)logout:(nullable void (^)(NSError *_Nullable error))completion;
/// 开始呼叫
/// @param userID 呼叫的用户ID
/// @param type 通话类型
/// @param completion 回调
- (void)call:(NSString *)userID
type:(NERtcCallType)type
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 开始呼叫
/// @param userID 呼叫的用户ID
/// @param type 通话类型 {@link NERtcCallKitConsts => NERtcCallType}
/// @param attachment 附件信息透传到onInvited
/// @param completion 回调
- (void)call:(NSString *)userID
type:(NERtcCallType)type
attachment:(nullable NSString *)attachment
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 开始呼叫
/// @param userID 呼叫的用户ID
/// @param type 通话类型 {@link NERtcCallKitConsts => NERtcCallType}
/// @param attachment 附件信息透传到onInvited
/// @param extra 扩展
/// @param completion 回调
- (void)call:(NSString *)userID
type:(NERtcCallType)type
attachment:(nullable NSString *)attachment
globalExtra:(nullable NSString *)extra
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 开始呼叫
/// @param userID 呼叫的用户ID
/// @param type 通话类型 {@link NERtcCallKitConsts => NERtcCallType}
/// @param attachment 附件信息透传到onInvited
/// @param extra 全局抄送
/// @param token 安全模式token如果用户直接传入不需要实现 tokenHandler block回调
/// @param channelName 自定义channelName不传会默认生成
/// @param completion 回调
- (void)call:(NSString *)userID
type:(NERtcCallType)type
attachment:(nullable NSString *)attachment
globalExtra:(nullable NSString *)extra
withToken:(nullable NSString *)token
channelName:(nullable NSString *)channelName
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 取消呼叫
/// @param completion 回调
- (void)cancel:(nullable void (^)(NSError *_Nullable error))completion;
/// 接受呼叫
/// @param completion 回调
- (void)accept:(nullable void (^)(NSError *_Nullable error))completion;
/// 接受呼叫
/// @param token 用户token如果用户直接传入不需要实现 tokenHandler block回调
/// @param completion 回调
- (void)acceptWithToken:(nullable NSString *)token
withCompletion:(nullable void (^)(NSError *_Nullable error))completion;
/// 拒绝呼叫
/// @param completion 回调
- (void)reject:(nullable void (^)(NSError *_Nullable error))completion;
/// 拒绝呼叫
/// @param completion 回调
/// @param reason 挂断原因
- (void)rejectWithReason:(NSInteger)reason
withCompletion:(nullable void (^)(NSError *_Nullable error))completion;
/// 挂断
/// @param completion 回调
- (void)hangup:(nullable void (^)(NSError *_Nullable error))completion;
/// 设置自己画面
/// @param localView 渲染自己画面的View
/// @discussion localView上不建议有任何subview
- (void)setupLocalView:(nullable UIView *)localView;
/// 设置其他用户画面
/// @param remoteView 渲染其他画面的View
/// @param userID 其他用户ID
/// @discussion remoteView上不建议有任何subview
- (void)setupRemoteView:(nullable UIView *)remoteView forUser:(nullable NSString *)userID;
/// 启动或关闭摄像头
/// @param enable YES:启动NO:关闭
/// @return 操作返回值,成功则返回 0
- (int)enableLocalVideo:(BOOL)enable;
/// 开启或关闭视频采集
/// @param muted YES关闭NO开启
/// @return 操作返回值,成功则返回 0
- (int)muteLocalVideo:(BOOL)muted;
/// 切换摄像头
/// @return 操作返回值,成功则返回 0
- (int)switchCamera;
/// 麦克风静音
/// @param mute YES静音 NO开启
/// @return 操作返回值,成功则返回 0
- (int)muteLocalAudio:(BOOL)mute;
/// 在通话过程中切换通话类型。非通话过程中调用无效。仅支持1对1通话。
/// @param type 通话类型: 音频/视频
/// @param state 切换应答类型: 邀请/同意/拒绝
/// @param completion 回调
/// @discussion
/// 切换完成后,组件内部会将己端和对端调用-enableLocalVideo:,此时外部不建议再调用-enableLocalVideo:,防止状态错乱.
- (void)switchCallType:(NERtcCallType)type
withState:(NERtcSwitchState)state
completion:(nullable void (^)(NSError *_Nullable error))completion;
/// 是否使用扬声器模式
/// @param speaker YES扬声器 NO听筒
/// @param error 错误成功为nil
- (void)setLoudSpeakerMode:(BOOL)speaker error:(NSError *_Nonnull *_Nonnull)error;
/// 指定对某个用户静音。
/// @param mute 是否静音
/// @param userID 用户ID
/// @param error 错误成功为nil
/// @discussion 只能不接收指定用户的音频,并不影响房间中其他人接受该用户的音频
- (void)setAudioMute:(BOOL)mute forUser:(NSString *)userID error:(NSError *_Nonnull *_Nonnull)error;
/// 根据uid 获取 accid
/// @param uid 用户id
/// @discussion 只有在通话中才能通过uid获取accid
- (void)memberOfUid:(uint64_t)uid
completion:(nullable void (^)(NIMSignalingMemberInfo *_Nullable info))completion;
/// 根据uid 获取 accid
/// @param accid IM 用户id
/// @discussion 只有在通话中才能通过accid获取获取uid
- (void)memberOfAccid:(NSString *)accid
completion:(nullable void (^)(NIMSignalingMemberInfo *_Nullable info))completion;
/// 添加代理 接受回调
/// @param delegate 代理对象
- (void)addDelegate:(id<NERtcCallKitDelegate>)delegate;
/// 移除代理
/// @param delegate 代理对象
- (void)removeDelegate:(id<NERtcCallKitDelegate>)delegate;
/// 音视频切换是否需要确认配置
/// @param video 切换到视频是否需要确认
/// @param audio 切换到音频是否需要确认
- (void)enableSwitchCallTypeConfirmVideo:(BOOL)video audio:(BOOL)audio;
/// 版本号
+ (NSString *)versionCode;
@end
NS_ASSUME_NONNULL_END