需要添加直播接口

This commit is contained in:
cbb
2026-01-12 17:52:15 +08:00
parent 83fec2617c
commit 13af9eb303
281 changed files with 313157 additions and 104 deletions

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>AtomicXCore.framework/AtomicXCore</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>AtomicXCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>AtomicXCore.framework/AtomicXCore</string>
<key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>AtomicXCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,622 @@
#if 0
#elif defined(__arm64__) && __arm64__
// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
#ifndef ATOMICXCORE_SWIFT_H
#define ATOMICXCORE_SWIFT_H
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"
#if !defined(__has_include)
# define __has_include(x) 0
#endif
#if !defined(__has_attribute)
# define __has_attribute(x) 0
#endif
#if !defined(__has_feature)
# define __has_feature(x) 0
#endif
#if !defined(__has_warning)
# define __has_warning(x) 0
#endif
#if __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif
#pragma clang diagnostic ignored "-Wauto-import"
#if defined(__OBJC__)
#include <Foundation/Foundation.h>
#endif
#if defined(__cplusplus)
#include <cstdint>
#include <cstddef>
#include <cstdbool>
#include <cstring>
#include <stdlib.h>
#include <new>
#include <type_traits>
#else
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#endif
#if defined(__cplusplus)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
#if defined(__arm64e__) && __has_include(<ptrauth.h>)
# include <ptrauth.h>
#else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
# ifndef __ptrauth_swift_value_witness_function_pointer
# define __ptrauth_swift_value_witness_function_pointer(x)
# endif
# ifndef __ptrauth_swift_class_method_pointer
# define __ptrauth_swift_class_method_pointer(x)
# endif
#pragma clang diagnostic pop
#endif
#pragma clang diagnostic pop
#endif
#if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if __has_include(<uchar.h>)
# include <uchar.h>
# elif !defined(__cplusplus)
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
# define SWIFT_CLASS_PROPERTY(...)
# endif
#endif
#if !defined(SWIFT_RUNTIME_NAME)
# if __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
# else
# define SWIFT_RUNTIME_NAME(X)
# endif
#endif
#if !defined(SWIFT_COMPILE_NAME)
# if __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
# else
# define SWIFT_COMPILE_NAME(X)
# endif
#endif
#if !defined(SWIFT_METHOD_FAMILY)
# if __has_attribute(objc_method_family)
# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
# else
# define SWIFT_METHOD_FAMILY(X)
# endif
#endif
#if !defined(SWIFT_NOESCAPE)
# if __has_attribute(noescape)
# define SWIFT_NOESCAPE __attribute__((noescape))
# else
# define SWIFT_NOESCAPE
# endif
#endif
#if !defined(SWIFT_RELEASES_ARGUMENT)
# if __has_attribute(ns_consumed)
# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
# else
# define SWIFT_RELEASES_ARGUMENT
# endif
#endif
#if !defined(SWIFT_WARN_UNUSED_RESULT)
# if __has_attribute(warn_unused_result)
# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
# else
# define SWIFT_WARN_UNUSED_RESULT
# endif
#endif
#if !defined(SWIFT_NORETURN)
# if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
# else
# define SWIFT_NORETURN
# endif
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_RESILIENT_CLASS)
# if __has_attribute(objc_class_stub)
# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
# else
# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM_ATTR)
# if __has_attribute(enum_extensibility)
# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
# else
# define SWIFT_ENUM_ATTR(_extensibility)
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# if __has_feature(generalized_swift_name)
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# else
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_WEAK_IMPORT)
# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED_OBJC)
# if __has_feature(attribute_diagnose_if_objc)
# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
# else
# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
# endif
#endif
#if defined(__OBJC__)
#if !defined(IBSegueAction)
# define IBSegueAction
#endif
#endif
#if !defined(SWIFT_EXTERN)
# if defined(__cplusplus)
# define SWIFT_EXTERN extern "C"
# else
# define SWIFT_EXTERN extern
# endif
#endif
#if !defined(SWIFT_CALL)
# define SWIFT_CALL __attribute__((swiftcall))
#endif
#if !defined(SWIFT_INDIRECT_RESULT)
# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
#endif
#if !defined(SWIFT_CONTEXT)
# define SWIFT_CONTEXT __attribute__((swift_context))
#endif
#if !defined(SWIFT_ERROR_RESULT)
# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
#endif
#if defined(__cplusplus)
# define SWIFT_NOEXCEPT noexcept
#else
# define SWIFT_NOEXCEPT
#endif
#if !defined(SWIFT_C_INLINE_THUNK)
# if __has_attribute(always_inline)
# if __has_attribute(nodebug)
# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
# else
# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
# endif
# else
# define SWIFT_C_INLINE_THUNK inline
# endif
#endif
#if defined(_WIN32)
#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
#endif
#else
#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
# define SWIFT_IMPORT_STDLIB_SYMBOL
#endif
#endif
#if defined(__OBJC__)
#if __has_feature(objc_modules)
#if __has_warning("-Watimport-in-framework-header")
#pragma clang diagnostic ignored "-Watimport-in-framework-header"
#endif
@import CoreFoundation;
@import Foundation;
@import ObjectiveC;
@import RTCRoomEngine;
@import UIKit;
#endif
#endif
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"
#if __has_warning("-Wpragma-clang-attribute")
# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wnullability"
#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
#if __has_attribute(external_source_symbol)
# pragma push_macro("any")
# undef any
# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="AtomicXCore",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
# pragma pop_macro("any")
#endif
#if defined(__OBJC__)
@class TUIBattleInfo;
@class NSString;
@class TUIBattleUser;
SWIFT_PROTOCOL("_TtP11AtomicXCore14BattleObserver_") SWIFT_DEPRECATED
@protocol BattleObserver
- (void)onBattleStartedWithBattleInfo:(TUIBattleInfo * _Nonnull)battleInfo;
- (void)onBattleEndedWithBattleInfo:(TUIBattleInfo * _Nonnull)battleInfo;
- (void)onUserJoinBattleWithBattleId:(NSString * _Nonnull)battleId battleUser:(TUIBattleUser * _Nonnull)battleUser;
- (void)onUserExitBattleWithBattleId:(NSString * _Nonnull)battleId battleUser:(TUIBattleUser * _Nonnull)battleUser;
- (void)onBattleScoreChangedWithBattleId:(NSString * _Nonnull)battleId battleUserList:(NSArray<TUIBattleUser *> * _Nonnull)battleUserList;
- (void)onBattleRequestReceivedWithBattleId:(NSString * _Nonnull)battleId inviter:(TUIBattleUser * _Nonnull)inviter invitee:(TUIBattleUser * _Nonnull)invitee;
- (void)onBattleRequestCancelledWithBattleId:(NSString * _Nonnull)battleId inviter:(TUIBattleUser * _Nonnull)inviter invitee:(TUIBattleUser * _Nonnull)invitee;
- (void)onBattleRequestTimeoutWithBattleId:(NSString * _Nonnull)battleId inviter:(TUIBattleUser * _Nonnull)inviter invitee:(TUIBattleUser * _Nonnull)invitee;
- (void)onBattleRequestAcceptWithBattleId:(NSString * _Nonnull)battleId inviter:(TUIBattleUser * _Nonnull)inviter invitee:(TUIBattleUser * _Nonnull)invitee;
- (void)onBattleRequestRejectWithBattleId:(NSString * _Nonnull)battleId inviter:(TUIBattleUser * _Nonnull)inviter invitee:(TUIBattleUser * _Nonnull)invitee;
@end
SWIFT_CLASS("_TtC11AtomicXCore19BattleUserViewModel") SWIFT_DEPRECATED
@interface BattleUserViewModel : NSObject
@property (nonatomic, strong) TUIBattleUser * _Nonnull battleUser;
@property (nonatomic) CGRect rect;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
SWIFT_CLASS("_TtC11AtomicXCore15C2CSettingStore")
@interface C2CSettingStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
SWIFT_CLASS("_TtC11AtomicXCore13CallListStore")
@interface CallListStore : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
SWIFT_CLASS("_TtC11AtomicXCore17CallListStoreImpl")
@interface CallListStoreImpl : CallListStore
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
@class TUICallObserverExtraInfo;
@interface CallListStoreImpl (SWIFT_EXTENSION(AtomicXCore)) <TUICallObserver>
- (void)onCallReceived:(NSString * _Nonnull)callId callerId:(NSString * _Nonnull)callerId calleeIdList:(NSArray<NSString *> * _Nonnull)calleeIdList mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallBegin:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallEnd:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType reason:(TUICallEndReason)reason userId:(NSString * _Nonnull)userId totalTime:(float)totalTime info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallNotConnected:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType reason:(TUICallEndReason)reason userId:(NSString * _Nonnull)userId info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallCancelled:(NSString * _Nonnull)callerId;
@end
SWIFT_CLASS("_TtC11AtomicXCore20CallParticipantStore")
@interface CallParticipantStore : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
SWIFT_CLASS("_TtC11AtomicXCore24CallParticipantStoreImpl")
@interface CallParticipantStoreImpl : CallParticipantStore
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
@class NSNumber;
@class TUINetworkQualityInfo;
@interface CallParticipantStoreImpl (SWIFT_EXTENSION(AtomicXCore)) <TUICallObserver>
- (void)onCallReceived:(NSString * _Nonnull)callId callerId:(NSString * _Nonnull)callerId calleeIdList:(NSArray<NSString *> * _Nonnull)calleeIdList mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallBegin:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallEnd:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType reason:(TUICallEndReason)reason userId:(NSString * _Nonnull)userId totalTime:(float)totalTime info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallNotConnected:(NSString * _Nonnull)callId mediaType:(TUICallMediaType)mediaType reason:(TUICallEndReason)reason userId:(NSString * _Nonnull)userId info:(TUICallObserverExtraInfo * _Nonnull)info;
- (void)onCallCancelled:(NSString * _Nonnull)callerId;
- (void)onUserJoin:(NSString * _Nonnull)userId;
- (void)onUserLeave:(NSString * _Nonnull)userId;
- (void)onUserReject:(NSString * _Nonnull)userId;
- (void)onUserInviting:(NSString * _Nonnull)userId;
- (void)onUserLineBusy:(NSString * _Nonnull)userId;
- (void)onUserNoResponse:(NSString * _Nonnull)userId;
- (void)onUserVoiceVolumeChanged:(NSDictionary<NSString *, NSNumber *> * _Nonnull)volumeMap;
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkQualityInfo *> * _Nonnull)networkQualityList;
- (void)onUserAudioAvailable:(NSString * _Nonnull)userId isAudioAvailable:(BOOL)isAudioAvailable;
- (void)onUserVideoAvailable:(NSString * _Nonnull)userId isVideoAvailable:(BOOL)isVideoAvailable;
- (void)onKickedOffline;
@end
@class TUIConnectionUser;
SWIFT_CLASS("_TtC11AtomicXCore10CoHostUser") SWIFT_DEPRECATED
@interface CoHostUser : NSObject
@property (nonatomic, strong) TUIConnectionUser * _Nonnull connectionUser;
@property (nonatomic) BOOL hasAudioStream;
@property (nonatomic) BOOL hasVideoStream;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
@class TUIUserInfo;
/// ************************************** observer ***************************************
SWIFT_PROTOCOL("_TtP11AtomicXCore18ConnectionObserver_") SWIFT_DEPRECATED
@protocol ConnectionObserver
- (void)onConnectedUsersUpdatedWithUserList:(NSArray<TUIUserInfo *> * _Nonnull)userList joinList:(NSArray<TUIUserInfo *> * _Nonnull)joinList leaveList:(NSArray<TUIUserInfo *> * _Nonnull)leaveList;
- (void)onUserConnectionRequestWithInviterUser:(TUIUserInfo * _Nonnull)inviterUser;
- (void)onUserConnectionCancelledWithInviterUser:(TUIUserInfo * _Nonnull)inviterUser;
- (void)onUserConnectionAcceptedWithUserInfo:(TUIUserInfo * _Nonnull)userInfo;
- (void)onUserConnectionRejectedWithUserInfo:(TUIUserInfo * _Nonnull)userInfo;
- (void)onUserConnectionTimeoutWithUserInfo:(TUIUserInfo * _Nonnull)userInfo;
- (void)onUserConnectionTerminated;
- (void)onUserConnectionExitedWithUserInfo:(TUIUserInfo * _Nonnull)userInfo;
- (void)onConnectedRoomsUpdatedWithHostUserList:(NSArray<TUIConnectionUser *> * _Nonnull)hostUserList;
- (void)onCrossRoomConnectionRequestWithHostUser:(TUIConnectionUser * _Nonnull)hostUser;
- (void)onCrossRoomConnectionCancelledWithHostUser:(TUIConnectionUser * _Nonnull)hostUser;
- (void)onCrossRoomConnectionAcceptedWithHostUser:(TUIConnectionUser * _Nonnull)hostUser;
- (void)onCrossRoomConnectionRejectedWithHostUser:(TUIConnectionUser * _Nonnull)hostUser;
- (void)onCrossRoomConnectionTimeoutWithInviter:(TUIConnectionUser * _Nonnull)inviter invitee:(TUIConnectionUser * _Nonnull)invitee;
- (void)onCrossRoomConnectionExitedWithHostUser:(TUIConnectionUser * _Nonnull)hostUser;
- (void)onRoomDismissedWithRoomId:(NSString * _Nonnull)roomId;
@end
SWIFT_CLASS("_TtC11AtomicXCore16ContactListStore")
@interface ContactListStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
SWIFT_CLASS("_TtC11AtomicXCore21ConversationListStore")
@interface ConversationListStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
SWIFT_CLASS("_TtC11AtomicXCore17GroupSettingStore")
@interface GroupSettingStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
typedef SWIFT_ENUM(NSInteger, LayoutMode, open) {
LayoutModeGridLayout = 0,
LayoutModeFloatLayout = 1,
LayoutModeFreeLayout = 2,
};
@class NSCoder;
SWIFT_CLASS("_TtC11AtomicXCore12LiveCoreView")
@interface LiveCoreView : UIView
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder SWIFT_UNAVAILABLE;
- (nonnull instancetype)initWithFrame:(CGRect)frame SWIFT_UNAVAILABLE;
@end
@interface LiveCoreView (SWIFT_EXTENSION(AtomicXCore))
- (void)didMoveToWindow;
@end
/// Login management class.
SWIFT_CLASS("_TtC11AtomicXCore10LoginStore")
@interface LoginStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
SWIFT_CLASS("_TtC11AtomicXCore16MessageListStore")
@interface MessageListStore : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
SWIFT_CLASS("_TtC11AtomicXCore15ParticipantView")
@interface ParticipantView : UIView
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder SWIFT_UNAVAILABLE;
- (nonnull instancetype)initWithFrame:(CGRect)frame SWIFT_UNAVAILABLE;
@end
@interface ParticipantView (SWIFT_EXTENSION(AtomicXCore))
- (void)didMoveToWindow;
@end
SWIFT_CLASS("_TtC11AtomicXCore15SignalVideoView")
@interface SignalVideoView : UIView
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder SWIFT_UNAVAILABLE;
- (void)didMoveToWindow;
- (nonnull instancetype)initWithFrame:(CGRect)frame SWIFT_UNAVAILABLE;
@end
SWIFT_CLASS("_TtC11AtomicXCore18UserInfoModifyFlag") SWIFT_DEPRECATED
@interface UserInfoModifyFlag : NSObject
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) UserInfoModifyFlag * _Nonnull none;)
+ (UserInfoModifyFlag * _Nonnull)none SWIFT_WARN_UNUSED_RESULT;
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) UserInfoModifyFlag * _Nonnull userRole;)
+ (UserInfoModifyFlag * _Nonnull)userRole SWIFT_WARN_UNUSED_RESULT;
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) UserInfoModifyFlag * _Nonnull nameCard;)
+ (UserInfoModifyFlag * _Nonnull)nameCard SWIFT_WARN_UNUSED_RESULT;
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) UserInfoModifyFlag * _Nonnull hasVideoStream;)
+ (UserInfoModifyFlag * _Nonnull)hasVideoStream SWIFT_WARN_UNUSED_RESULT;
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) UserInfoModifyFlag * _Nonnull hasAudioStream;)
+ (UserInfoModifyFlag * _Nonnull)hasAudioStream SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end
@class TUISeatFullInfo;
enum ViewLayer : NSInteger;
/// Video view adapter protocol
SWIFT_PROTOCOL("_TtP11AtomicXCore17VideoViewDelegate_")
@protocol VideoViewDelegate
/// Create co-guest view.
/// @param seatInfo User information.
/// @param viewLayer View layer. {@link ViewLayer}
/// @return Co-guest view.
- (UIView * _Nullable)createCoGuestViewWithSeatInfo:(TUISeatFullInfo * _Nonnull)seatInfo viewLayer:(enum ViewLayer)viewLayer SWIFT_WARN_UNUSED_RESULT;
/// Create cross-room co-host view.
/// @param seatInfo Cross-room co-host user information.
/// @param viewLayer View layer.
/// @return Cross-room co-host view.
- (UIView * _Nullable)createCoHostViewWithSeatInfo:(TUISeatFullInfo * _Nonnull)seatInfo viewLayer:(enum ViewLayer)viewLayer SWIFT_WARN_UNUSED_RESULT;
/// Create PK view.
/// @param battleUser PK user information.
/// @return PK view.
- (UIView * _Nullable)createBattleViewWithBattleUser:(TUIBattleUser * _Nonnull)battleUser SWIFT_WARN_UNUSED_RESULT;
/// Create PK container view.
/// @return PK container view.
- (UIView * _Nullable)createBattleContainerView SWIFT_WARN_UNUSED_RESULT;
@end
/// View layer.
typedef SWIFT_ENUM(NSInteger, ViewLayer, open) {
/// Foreground layer.
ViewLayerForeground = 0,
/// Background layer.
ViewLayerBackground = 1,
};
#endif
#if __has_attribute(external_source_symbol)
# pragma clang attribute pop
#endif
#if defined(__cplusplus)
#endif
#pragma clang diagnostic pop
#endif
#else
#error unsupported Swift architecture
#endif

View File

@@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double AtomicXCoreVersionNumber;
FOUNDATION_EXPORT const unsigned char AtomicXCoreVersionString[];

View File

@@ -0,0 +1,11 @@
framework module AtomicXCore {
umbrella header "AtomicXCore-umbrella.h"
export *
module * { export * }
}
module AtomicXCore.Swift {
header "AtomicXCore-Swift.h"
requires objc
}

View File

@@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double AtomicXCoreVersionNumber;
FOUNDATION_EXPORT const unsigned char AtomicXCoreVersionString[];

View File

@@ -0,0 +1,11 @@
framework module AtomicXCore {
umbrella header "AtomicXCore-umbrella.h"
export *
module * { export * }
}
module AtomicXCore.Swift {
header "AtomicXCore-Swift.h"
requires objc
}

View File

@@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/AtomicXCore-Swift.h</key>
<data>
0dmswbw3RWzDigjAYHUzaqL4CN4=
</data>
<key>Headers/AtomicXCore-umbrella.h</key>
<data>
g7gcVChc6M2o9SyWmZ5d3DT5Bck=
</data>
<key>Info.plist</key>
<data>
pxyKul0PUz96X+xK4PlbTCR+4hw=
</data>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.abi.json</key>
<data>
d4eG79RPvGY6Xoq1433e8iiLKa8=
</data>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface</key>
<data>
ZFdJRfcLH5xQSS+YkWAm603b6f8=
</data>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftdoc</key>
<data>
ScLj6E3f03mEQ40uJ5f9cAPQ0y0=
</data>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftinterface</key>
<data>
ZFdJRfcLH5xQSS+YkWAm603b6f8=
</data>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftmodule</key>
<data>
dHg9opx4H9kXDQ00K0UwzpYY5CE=
</data>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
<data>
d4eG79RPvGY6Xoq1433e8iiLKa8=
</data>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
<data>
U/JvN8jBiCb9ZGAnBJgmL+BzAzM=
</data>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
<data>
GZTbYyi8tDZ3nHCB3qfQQsPOTos=
</data>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
<data>
U/JvN8jBiCb9ZGAnBJgmL+BzAzM=
</data>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
<data>
Eu1zT3FuFh0lXuRynTnoudL9A+U=
</data>
<key>Modules/module.modulemap</key>
<data>
CVIbcqidHGDTUSq8lpk9bR3T1AM=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/AtomicXCore-Swift.h</key>
<dict>
<key>hash</key>
<data>
0dmswbw3RWzDigjAYHUzaqL4CN4=
</data>
<key>hash2</key>
<data>
HjShXRLFtfDVz3QEKugubHKSpfIrLG2s66u9zANYp5s=
</data>
</dict>
<key>Headers/AtomicXCore-umbrella.h</key>
<dict>
<key>hash</key>
<data>
g7gcVChc6M2o9SyWmZ5d3DT5Bck=
</data>
<key>hash2</key>
<data>
tOAe4tsjHYbEaMSLYEkve2xtuM2VnFqc14CIWt4xdSg=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.abi.json</key>
<dict>
<key>hash</key>
<data>
d4eG79RPvGY6Xoq1433e8iiLKa8=
</data>
<key>hash2</key>
<data>
o/AA86qNw/GWgAoo5ALJZizPlFQkHX4v3ZPMqg5bXeI=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface</key>
<dict>
<key>hash</key>
<data>
ZFdJRfcLH5xQSS+YkWAm603b6f8=
</data>
<key>hash2</key>
<data>
aw3+kcmgy1AFWkAzaiR1g/GEmiZwM/MQYlNJr15J+OM=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftdoc</key>
<dict>
<key>hash</key>
<data>
ScLj6E3f03mEQ40uJ5f9cAPQ0y0=
</data>
<key>hash2</key>
<data>
wFfcV/YiIWIHZT5VLxXhMdfK9BYJ6hXM7r7u0/nKoi8=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftinterface</key>
<dict>
<key>hash</key>
<data>
ZFdJRfcLH5xQSS+YkWAm603b6f8=
</data>
<key>hash2</key>
<data>
aw3+kcmgy1AFWkAzaiR1g/GEmiZwM/MQYlNJr15J+OM=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/arm64-apple-ios-simulator.swiftmodule</key>
<dict>
<key>hash</key>
<data>
dHg9opx4H9kXDQ00K0UwzpYY5CE=
</data>
<key>hash2</key>
<data>
SHFHqRPyCKNzZ3TWjoEOGErMzM1KzQbMW2XGG3MSUb4=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
<dict>
<key>hash</key>
<data>
d4eG79RPvGY6Xoq1433e8iiLKa8=
</data>
<key>hash2</key>
<data>
o/AA86qNw/GWgAoo5ALJZizPlFQkHX4v3ZPMqg5bXeI=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
<dict>
<key>hash</key>
<data>
U/JvN8jBiCb9ZGAnBJgmL+BzAzM=
</data>
<key>hash2</key>
<data>
Ed7kOBklhWMpOoIrwE8CDK5jUF4QFWnzwbr3RTLd0/U=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
<dict>
<key>hash</key>
<data>
GZTbYyi8tDZ3nHCB3qfQQsPOTos=
</data>
<key>hash2</key>
<data>
i30Kt2XbXkE4BfZ6N3EVI3+DCLF3IoZUA7Lth8rHD/k=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
<dict>
<key>hash</key>
<data>
U/JvN8jBiCb9ZGAnBJgmL+BzAzM=
</data>
<key>hash2</key>
<data>
Ed7kOBklhWMpOoIrwE8CDK5jUF4QFWnzwbr3RTLd0/U=
</data>
</dict>
<key>Modules/AtomicXCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
<dict>
<key>hash</key>
<data>
Eu1zT3FuFh0lXuRynTnoudL9A+U=
</data>
<key>hash2</key>
<data>
FDKiMHuUvc4Yp1qQl5VNoxUYtYO78efLYbSZ/hXeItA=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
CVIbcqidHGDTUSq8lpk9bR3T1AM=
</data>
<key>hash2</key>
<data>
1Y5XpYnPrQ9YxnJG/+tUEQeOswjkdJAJnFTedr3m+TA=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>RTCRoomEngine.framework/RTCRoomEngine</string>
<key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>RTCRoomEngine.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>RTCRoomEngine.framework/RTCRoomEngine</string>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>RTCRoomEngine.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,204 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
*/
#import "TUIRoomEngine.h"
@class TRTCCloud;
@class TXDeviceManager;
@class TXAudioEffectManager;
@class TXBeautyManager;
NS_ASSUME_NONNULL_BEGIN
@interface TUIRoomEngine (deprecated)
/////////////////////////////////////////////////////////////////////////////////
//
// 弃用接口(建议使用对应的新接口)
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 获得设备管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXDeviceManager *)getDeviceManager NS_SWIFT_NAME(getDeviceManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 获得音效管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXAudioEffectManager *)getAudioEffectManager NS_SWIFT_NAME(getAudioEffectManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 获得美颜管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXBeautyManager *)getBeautyManager NS_SWIFT_NAME(getBeautyManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 设置本地用户视频渲染的视图控件
*
* @deprecated v1.6.1 版本开始不推荐使用。
*/
- (void)setLocalVideoView:(TUIVideoStreamType)streamType
view:(TUIVideoView *__nullable)view
NS_SWIFT_NAME(setLocalVideoView(streamType:view:))
__attribute__((deprecated("Deprecated from v1.6.1")));
#if TARGET_OS_IPHONE
/**
* 切换前置或后置摄像头(仅适用于移动端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* switchCamera}代替。
* @return 0操作成功负数操作失败。
*/
- (NSInteger)switchCamera:(BOOL)frontCamera NS_SWIFT_NAME(switchCamera(frontCamera:))
__attribute__((deprecated("Deprecated from v2.0")));
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
/**
* 获取设备列表(仅适用于桌面端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* getDevicesList}代替。
* @param type 设备类型,指定需要获取哪种设备的列表。详见 TXMediaDeviceType 定义。
* @note
* - 使用完毕后请调用 release 方法释放资源,这样可以让 SDK 维护 ITXDeviceCollection 对象的生命周期。
* - 不要使用 delete 释放返回的 Collection 对象delete ITXDeviceCollection* 指针会导致异常崩溃。
* - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera。
* - 此接口只支持 Mac 和 Windows 平台。
*/
- (NSArray<TXMediaDeviceInfo *> *_Nullable)getDevicesList:(TUIMediaDeviceType)type
NS_SWIFT_NAME(getDevicesList(type:)) __attribute__((deprecated("Deprecated from v2.0")));
/**
* 设置当前要使用的设备(仅适用于桌面端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* setCurrentDevice}代替。 设置当前要使用的设备后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onDeviceChanged} 通知您。
* @param type 设备类型,详见 TXMediaDeviceType 定义。
* @param deviceId 设备ID您可以通过接口 {@link getDevicesList} 获得设备 ID。
* @return 0操作成功负数操作失败。
*/
- (NSInteger)setCurrentDevice:(TUIMediaDeviceType)type
deviceId:(NSString *)deviceId NS_SWIFT_NAME(setCurrentDevice(type:deviceId:))
__attribute__((deprecated("Deprecated from v2.0")));
#endif
/**
* 调用实验性接口
*
* @deprecated v3.0 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* @param jsonStr 接口信息。
* @return 返回结果
*/
+ (id)callExperimentalAPI:(NSString *)jsonStr NS_SWIFT_NAME(callExperimentalAPI(jsonStr:))
__attribute__((deprecated("Deprecated from v3.0")));
/**
* 上麦(上麦发言模式下,需要申请)
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 上麦成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link onSeatListChanged}
* 通知房间内用户。
* @note 开启上麦发言模式时,需要向主持人或管理员发起申请才允许上麦。
* 开启自由发言模式,直播场景可以自由上麦,上麦后开麦发言,会议场景无需调用该接口,即可开麦发言。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param timeout 超时时间,单位秒,如果设置为 0SDK 不会做超时检测,也不会触发超时回调。
* @param onAccepted 邀请被接受的回调。
* @param onRejected 邀请被拒绝的回调。
* @param onCancelled 邀请被取消的回调。
* @param onTimeout 邀请超时未处理的回调。
* @param onError 邀请发生错误的回调。
* @return TUIRequest 请求体。
*/
- (TUIRequest *)takeSeat:(NSInteger)seatIndex
timeout:(NSTimeInterval)timeout
onAccepted:(TUIRequestAcceptedBlock)onAccepted
onRejected:(TUIRequestRejectedBlock)onRejected
onCancelled:(TUIRequestCancelledBlock)onCancelled
onTimeout:(TUIRequestTimeoutBlock)onTimeout
onError:(TUIRequestErrorBlock)onError
NS_SWIFT_NAME(takeSeat(_:timeout:onAccepted:onRejected:onCancelled:onTimeout:onError:));
/**
* 主持人/管理员 邀请用户上麦
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 接口调用成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onRequestReceived} 通知被邀请用户。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param userId 用户ID。
* @param timeout 超时时间,单位秒,如果设置为 0SDK 不会做超时检测,也不会触发超时回调。
* @param onAccepted 邀请被接受的回调。
* @param onRejected 邀请被拒绝的回调。
* @param onCancelled 邀请被取消的回调。
* @param onTimeout 邀请超时未处理的回调。
* @param onError 邀请发生错误的回调。
* @return TUIRequest 请求体。
*/
- (TUIRequest *)takeUserOnSeatByAdmin:(NSInteger)seatIndex
userId:(NSString *)userId
timeout:(NSTimeInterval)timeout
onAccepted:(TUIRequestAcceptedBlock)onAccepted
onRejected:(TUIRequestRejectedBlock)onRejected
onCancelled:(TUIRequestCancelledBlock)onCancelled
onTimeout:(TUIRequestTimeoutBlock)onTimeout
onError:(TUIRequestErrorBlock)onError
NS_SWIFT_NAME(takeUserOnSeatByAdmin(_:userId:timeout:onAccepted:onRejected:onCancelled:onTimeout:onError:));
/**
* 主持人/管理员 将用户踢下麦
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 接口调用成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onSeatListChanged} 通知房间内用户。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param userId 用户ID。
* @param onSuccess 成功回调。
* @param onError 失败回调。
*/
- (void)kickUserOffSeatByAdmin:(NSInteger)seatIndex
userId:(NSString *)userId
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(kickUserOffSeatByAdmin(_:userId:onSuccess:onError:));
/**
* 回复请求
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* @note 在收到信令请求时,可以使用此接口来回复接收到的请求。
* @param requestId 请求ID(发送请求的接口返回或者OnRequestReceived事件通知)。
* @param agree 是否同意 YES: 同意请求, NO: 拒绝请求。
* @param onSuccess 成功回调。
* @param onError 失败回调。
*/
- (void)responseRemoteRequest:(NSString *)requestId
agree:(BOOL)agree
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(responseRemoteRequest(_:agree:onSuccess:onError:));
NS_ASSUME_NONNULL_END
@end

View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2025 Tencent. All Rights Reserved.
*
*/
#import <RTCRoomEngine/TUICommonDefine.h>
#import <RTCRoomEngine/TUIEngineSymbolExport.h>
#import <RTCRoomEngine/TUIRoomDeviceManager.h>
#import <RTCRoomEngine/TUILiveListManager.h>
#import <RTCRoomEngine/TUILiveConnectionManager.h>
#import <RTCRoomEngine/TUILiveBattleManager.h>
#import <RTCRoomEngine/TUILiveLayoutManager.h>
#import <RTCRoomEngine/TUILiveGiftManager.h>
#import <RTCRoomEngine/TUIConferenceListManager.h>
#import <RTCRoomEngine/TUIConferenceInvitationManager.h>
#import <RTCRoomEngine/DeprecatedRoomEngineAPI.h>
#import <RTCRoomEngine/TUIRoomEngine.h>
#import <RTCRoomEngine/TUIRoomDefine.h>
#import <RTCRoomEngine/TUIRoomObserver.h>
#import <RTCRoomEngine/TUICallEngine.h>
#import <RTCRoomEngine/TUICallDefine.h>
#import <RTCRoomEngine/TUICallObserver.h>

View File

@@ -0,0 +1,217 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallDefine 关键类型定义
* Description: 定义枚举或常量,例如:通话类型,角色等。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
@class TUIOfflinePushInfo;
typedef void (^TUICallSucc)(void);
typedef void (^TUICallFail)(int code, NSString *_Nullable errMsg);
/// TUICallEngine 版本号
static const NSString *_Nullable TUICALL_VERSION = @"0.0.0.0";
/// 您当前未购买音视频通话能力套餐请前往控制台开通免费体验https://console.cloud.tencent.com/im/detail或加购正式版https://buy.cloud.tencent.com/avc
static const int ERROR_PACKAGE_NOT_PURCHASED = -1001;
/// 您当前购买的套餐不支持该能力请先购买https://buy.cloud.tencent.com/avc
static const int ERROR_PACKAGE_NOT_SUPPORTED = -1002;
/// TIM SDK 版本过低,请升级 TIM SDK 版本 >= 6.6
static const int ERROR_TIM_VERSION_OUTDATED = -1003;
/// 获取权限失败,当前未授权音 / 视频权限,请查看是否开启设备权限
static const int ERROR_PERMISSION_DENIED = -1101;
/// 未调用 initTUICallEngine API 使用需在 init 之后
static const int ERROR_INIT_FAIL = -1201;
/// 参数错误
static const int ERROR_PARAM_INVALID = -1202;
/// 当前状态不支持调用
static const int ERROR_REQUEST_REFUSED = -1203;
/// 当前方法正在执行中,请勿重复调用
static const int ERROR_REQUEST_REPEATED = -1204;
/// 当前通话场景,不支持该功能
static const int ERROR_SCENE_NOT_SUPPORTED = -1205;
/// 信令发送失败
static const int ERROR_SIGNALING_SEND_FAIL = -1401;
/// 通话类型:未知、音频、视频
typedef NS_ENUM(NSUInteger, TUICallMediaType) {
TUICallMediaTypeUnknown,
TUICallMediaTypeAudio,
TUICallMediaTypeVideo,
};
/// 通话角色:未知、主叫、被叫
typedef NS_ENUM(NSUInteger, TUICallRole) {
TUICallRoleNone,
TUICallRoleCall,
TUICallRoleCalled,
};
/// 通话状态:空闲、等待中、接听中
typedef NS_ENUM(NSUInteger, TUICallStatus) {
TUICallStatusNone,
TUICallStatusWaiting,
TUICallStatusAccept,
};
typedef NS_ENUM(NSUInteger, TUICallScene) {
TUICallSceneNone = 0,
TUICallSceneGroup = 1,
TUICallSceneMulti = 2,
TUICallSceneSingle = 3,
};
typedef NS_ENUM(NSUInteger, TUICallIOSOfflinePushType) {
TUICallIOSOfflinePushTypeAPNs = 0,
TUICallIOSOfflinePushTypeVoIP = 1,
};
typedef NS_ENUM(NSUInteger, TUICallEndReason) {
TUICallEndReasonUnknown = 0,
TUICallEndReasonHangup = 1,
TUICallEndReasonReject = 2,
TUICallEndReasonNoResponse = 3,
TUICallEndReasonOffline = 4,
TUICallEndReasonLineBusy = 5,
TUICallEndReasonCanceled = 6,
TUICallEndReasonOtherDeviceAccepted = 7,
TUICallEndReasonOtherDeviceReject = 8,
TUICallEndReasonEndByServer = 9,
};
// 通话结果
typedef NS_ENUM(NSUInteger, TUICallResultType) {
TUICallResultTypeUnknown,
TUICallResultTypeMissed,
TUICallResultTypeIncoming,
TUICallResultTypeOutgoing,
};
/**
* 扩展参数
*/
NS_ASSUME_NONNULL_BEGIN
TUIENGINE_EXPORT @interface TUICallParams : NSObject
@property(nonatomic, strong) TUIRoomId *roomId;
@property(nonatomic, strong) TUIOfflinePushInfo *offlinePushInfo;
@property(nonatomic, assign) int timeout;
@property(nonatomic, copy) NSString *userData;
@property(nonatomic, copy) NSString *chatGroupId;
@property(nonatomic, assign) BOOL isEphemeralCall;
@end
/**
* 扩展信息
*/
TUIENGINE_EXPORT @interface TUICallObserverExtraInfo : NSObject
@property(nonatomic, strong) TUIRoomId *roomId;
@property(nonatomic, assign) TUICallRole role;
@property(nonatomic, copy) NSString *userData;
@property(nonatomic, copy) NSString *chatGroupId;
@property(nonatomic, assign) BOOL isEphemeralCall;
@end
/**
* 离线推送自定义类
*/
TUIENGINE_EXPORT @interface TUIOfflinePushInfo : NSObject
@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSString *desc;
@property(nonatomic, assign) BOOL ignoreIOSBadge;
@property(nonatomic, assign) BOOL enableIOSBackgroundNotification;
@property(nonatomic, copy) NSString *iOSInterruptionLevel;
@property(nonatomic, copy) NSString *iOSImage;
@property(nonatomic, copy) NSString *iOSSound;
@property(nonatomic, copy) NSString *AndroidSound;
@property(nonatomic, copy) NSString *AndroidOPPOChannelID;
@property(nonatomic, copy) NSString *OPPOCategory;
@property(nonatomic, assign) NSInteger OPPONotifyLevel;
@property(nonatomic, copy) NSString *AndroidFCMChannelID;
@property(nonatomic, copy) NSString *fcmImage;
@property(nonatomic, assign) NSInteger AndroidVIVOClassification;
@property(nonatomic, copy) NSString *VIVOCategory;
@property(nonatomic, copy) NSString *AndroidXiaoMiChannelID;
@property(nonatomic, copy) NSString *AndroidHuaWeiCategory;
@property(nonatomic, copy) NSString *huaweiImage;
@property(nonatomic, copy) NSString *honorImportance;
@property(nonatomic, copy) NSString *honorImage;
@property(nonatomic, assign) BOOL isDisablePush;
@property(nonatomic, assign) TUICallIOSOfflinePushType iOSPushType;
@property(nonatomic, copy) NSString *extraInfo;
@end
/**
* 通话记录
*/
TUIENGINE_EXPORT @interface TUICallRecords : NSObject
@property(nonatomic, copy) NSString *callId;
@property(nonatomic, copy) NSString *inviter;
@property(nonatomic, strong) NSArray *inviteList;
@property(nonatomic, copy) NSString *groupId;
@property(nonatomic, assign) TUICallScene scene;
@property(nonatomic, assign) TUICallMediaType mediaType;
@property(nonatomic, assign) TUICallRole role;
@property(nonatomic, assign) TUICallResultType result;
@property(nonatomic, assign) NSTimeInterval beginTime;
@property(nonatomic, assign) NSTimeInterval totalTime;
@end
/// 通话扩展参数
@interface TUICallRecentCallsFilter : NSObject
@property(nonatomic, assign) TUICallResultType result;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,282 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallEngine
* Function: TUICallEngine's main feature API
* Version: <:Version:>
*/
#import <Foundation/Foundation.h>
#import "TUICallObserver.h"
#import "TUICallDefine.h"
#import "TUICommonDefine.h"
@class TRTCCloud;
NS_ASSUME_NONNULL_BEGIN
TUIENGINE_EXPORT @interface TUICallEngine : NSObject
/**
* 创建 TUICallEngine 实例(单例模式)
*/
+ (TUICallEngine *)createInstance NS_SWIFT_NAME(createInstance());
/**
* 销毁 TUICallEngine 实例(单例模式)
*/
+ (void)destroyInstance NS_SWIFT_NAME(destroyInstance());
/**
* 初始化函数,请在使用所有功能之前先调用该函数,以便完成包含通话服务鉴权在内初始化动作。
*
* @param sdkAppId 应用ID
* @param userId 当前用户的 ID
* @param userSig 安全保护签名
*/
- (void)init:(int)sdkAppId userId:(NSString *)userId userSig:(NSString *)userSig succ:(TUICallSucc)succ fail:(TUICallFail)fail;
/**
* 添加回调接口您可以通过这个接口监听TUICallObserver相关的事件回调。
*/
- (void)addObserver:(id<TUICallObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*/
- (void)removeObserver:(id<TUICallObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起 1VN 通话
*
* @param userIdList 目标用户的 userId 列表
* @param callMediaType 通话的媒体类型,例如:视频通话、语音通话
* @param params 通话参数扩展字段,例如:离线推送自定义内容
*/
- (void)calls:(NSArray<NSString *> *)userIdList callMediaType:(TUICallMediaType)callMediaType params:(TUICallParams *_Nullable)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(calls(userIdList:callMediaType:params:succ:fail:));
/**
* 接受当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数接听来电。
*/
- (void)accept:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(accept(succ:fail:));
/**
* 拒绝当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数拒绝来电。
*/
- (void)reject:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(reject(succ:fail:));
/**
* 挂断当前通话,当您处于通话中,可以调用该函数结束通话。
*/
- (void)hangup:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(hangup(succ:fail:));
/**
* 忽略当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数忽略来电,此时主叫会收到 onUserLineBusy 的回调。
* 备注:如果您的业务中存在直播、会议等场景,在直播/会议中的情况时,也可以调用这个函数来忽略此次来电。
*/
- (void)ignore:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(ignore(succ:fail:));
/**
* 主动加入此次多人通话。
*
* @param callId 此次通话的唯一ID
*/
- (void)join:(NSString *)callId succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(join(callId:succ:fail:));
/**
* 邀请用户加入此次群组通话。
* 使用场景:一个群组通话中的用户主动邀请其他人时使用。
*
* @param userIdList 目标用户的 userId 列表
* @param params 通话参数扩展字段,例如:离线推送自定义内容
*/
- (void)inviteUser:(NSArray<NSString *> *)userIdList params:(TUICallParams *)params succ:(void (^)(NSArray<NSString *> *userIdList))succ fail:(TUICallFail)fail NS_SWIFT_NAME(inviteUser(userIdList:params:succ:fail:));
/**
* 切换通话媒体类型,比如视频通话切音频通话
*
* @param callMediaType 通话的媒体类型,例如:视频通话、语音通话
*/
- (void)switchCallMediaType:(TUICallMediaType)callMediaType NS_SWIFT_NAME(switchCallMediaType(_:));
/**
* 开始订阅远端用户视频流
*
* @param userId 目标用户的 userId
* @param videoView 待渲染的视图
*/
- (void)startRemoteView:(NSString *)userId
videoView:(TUIVideoView *)videoView
onPlaying:(void (^)(NSString *userId))onPlaying
onLoading:(void (^)(NSString *userId))onLoading
onError:(void (^)(NSString *userId, int code, NSString *errMsg))onError NS_SWIFT_NAME(startRemoteView(userId:videoView:onPlaying:onLoading:onError:));
/**
* 停止订阅远端用户视频流
*
* @param userId 目标用户的 userId
*/
- (void)stopRemoteView:(NSString *)userId NS_SWIFT_NAME(stopRemoteView(userId:));
/**
* 开启摄像头
*
* @param camera 前置/后置 摄像头
* @param videoView 待渲染的视图
*/
- (void)openCamera:(TUICamera)camera videoView:(TUIVideoView *)videoView succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(openCamera(_:videoView:succ:fail:));
/**
* 关闭摄像头
*/
- (void)closeCamera NS_SWIFT_NAME(closeCamera());
/**
* 切换前后摄像头
*
* @param camera 前置/后置 摄像头
*/
- (void)switchCamera:(TUICamera)camera NS_SWIFT_NAME(switchCamera(_:));
/**
* 打开麦克风
*/
- (void)openMicrophone:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(openMicrophone(succ:fail:));
/**
* 关闭麦克风
*/
- (void)closeMicrophone NS_SWIFT_NAME(closeMicrophone());
/**
* 选择音频播放设备(听筒/扬声器)
*
* @param device 听筒/扬声器
*/
- (void)selectAudioPlaybackDevice:(TUIAudioPlaybackDevice)device NS_SWIFT_NAME(selectAudioPlaybackDevice(_:));
/**
* 设置用户的昵称、头像
*
* @param nickname 用户昵称
* @param avatar 用户头像(格式为 URL
*/
- (void)setSelfInfo:(NSString *_Nullable)nickname avatar:(NSString *_Nullable)avatar succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setSelfInfo(nickname:avatar:succ:fail:));
/**
* 开启/关闭 TUICallEngine 的多设备登录模式 (尊享版套餐支持)
*
* @param enable 开启:true; 关闭:false
*/
- (void)enableMultiDeviceAbility:(BOOL)enable succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(enableMultiDeviceAbility(enable:succ:fail:));
/**
* 设置用户画面的渲染模式
*
* @param userId 指定用户的 ID
* @param params 画面渲染参数:画面的旋转角度、填充模式,详见 {@link TUICommonDefine.VideoRenderParams}.
*/
- (void)setVideoRenderParams:(NSString *)userId params:(TUIVideoRenderParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setVideoRenderParams(userId:params:succ:fail:));
/**
* 设置视频编码器的编码参数
* 该设置能够决定远端用户看到的画面质量,同时也能决定云端录制出的视频文件的画面质量。
*
* @param params 编码参数:画面的分辨率、视频宽高比模式,详见 {@link TUICommonDefine.VideoEncoderParams}.
*/
- (void)setVideoEncoderParams:(TUIVideoEncoderParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setVideoEncoderParams(_:succ:fail:));
/**
* 设置美颜
*/
- (void)setBeautyLevel:(CGFloat)level succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setBeautyLevel(_:succ:fail:));
/**
* 高级接口,获得当前通话业务中的 TRTCCloud 实例
*
* @return TRTCCloud 实例
*/
- (TRTCCloud *)getTRTCCloudInstance NS_SWIFT_NAME(getTRTCCloudInstance());
/**
* 调用实验性接口
*
* @param jsonObject json 数据
*/
- (void)callExperimentalAPI:(NSString *)jsonObject NS_SWIFT_NAME(callExperimentalAPI(jsonObject:));
/**
* 查询通话记录
*
* @param filter 查询过滤条件
*/
- (void)queryRecentCalls:(TUICallRecentCallsFilter *)filter succ:(void (^)(NSArray<TUICallRecords *> *callRecords))succ fail:(void (^)(void))fail NS_SWIFT_NAME(queryRecentCalls(filter:succ:fail:));
/**
* 删除通话记录
*
* @param callIdList 待删除记录的callId列表
*/
- (void)deleteRecordCalls:(NSArray<NSString *> *)callIdList succ:(void (^)(NSArray<NSString *> *succList))succ fail:(void (^)(void))fail NS_SWIFT_NAME(deleteRecordCalls(_:succ:fail:));
/**
* 设置视频通话虚化效果
*
* @param level 虚化等级: 0-关闭虚化效果; 1-low; 2-middle; 3-high
*/
- (void)setBlurBackground:(NSInteger)level fail:(TUICallFail)fail NS_SWIFT_NAME(setBlurBackground(_:fail:));
/**
* 设置视频通话图片背景
*
* @param imagePath 图片本地路径,为空则关闭背景图片效果; 不为空则开启图片背景效果
*/
- (void)setVirtualBackground:(NSString *)imagePath fail:(TUICallFail)fail NS_SWIFT_NAME(setVirtualBackground(_:fail:));
/**
* 此接口已于2023年9月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)call:(TUIRoomId *)roomId
userId:(NSString *)userId
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(call(roomId:userId:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2025年1月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)call:(NSString *)userId callMediaType:(TUICallMediaType)callMediaType params:(TUICallParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(call(userId:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2023年9月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)groupCall:(TUIRoomId *)roomId
groupId:(NSString *)groupId
userIdList:(NSArray<NSString *> *)userIdList
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(groupCall(roomId:groupId:userIdList:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2025年1月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)groupCall:(NSString *)groupId
userIdList:(NSArray<NSString *> *)userIdList
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(groupCall(groupId:userIdList:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2015年1月废弃。若您刚刚开始接入TUICallEngine请优先使用join。
*/
- (void)joinInGroupCall:(TUIRoomId *)roomId
groupId:(NSString *)groupId
callMediaType:(TUICallMediaType)callMediaType
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(joinInGroupCall(roomId:groupId:callMediaType:succ:fail:)) __attribute__((deprecated));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,210 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallObserver
* Function: TUICallObserver 主功能接口
* Version: <:Version:>
*/
#import <Foundation/Foundation.h>
#import "TUICallDefine.h"
@class TUIRoomId, TUINetworkQualityInfo;
NS_ASSUME_NONNULL_BEGIN
@protocol TUICallObserver <NSObject>
@optional
/**
* 通话过程中错误回调
*
* @param code 错误码
* @param message 错误信息
*/
- (void)onError:(int)code message:(NSString *_Nullable)message NS_SWIFT_NAME(onError(code:message:));
/**
* 收到通话请求的回调(仅被叫收到)
*
* @param callId 此次通话的唯一 ID
* @param callerId 主叫 ID邀请方
* @param calleeIdList 被叫 ID 列表(被邀请方)
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param info 扩展信息
*/
- (void)onCallReceived:(NSString *)callId
callerId:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
mediaType:(TUICallMediaType)mediaType
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:mediaType:info:));
/**
* 通话接通的回调(主叫和被叫都可以收到)
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param info 扩展信息
*/
- (void)onCallBegin:(NSString *)callId mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallBegin(callId:mediaType:info:));
/**
* 通话结束的回调(主叫和被叫都可以收到)
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param reason 通话结束原因
* @param userId 结束通话的用户 ID
* @param totalTime 此次通话的时长
* @param info 扩展信息
*/
- (void)onCallEnd:(NSString *)callId
mediaType:(TUICallMediaType)mediaType
reason:(TUICallEndReason)reason
userId:(NSString *)userId
totalTime:(float)totalTime
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallEnd(callId:mediaType:reason:userId:totalTime:info:));
/**
* 通话取消的回调
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param reason 通话结束原因
* @param userId 结束通话的用户 ID
* @param info 扩展信息
*/
- (void)onCallNotConnected:(NSString *)callId
mediaType:(TUICallMediaType)mediaType
reason:(TUICallEndReason)reason
userId:(NSString *)userId
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallNotConnected(callId:mediaType:reason:userId:info:));
/**
* 通话媒体类型发生改变的回调
*
* @param oldCallMediaType 旧的通话类型
* @param newCallMediaType 新的通话类型
*/
- (void)onCallMediaTypeChanged:(TUICallMediaType)oldCallMediaType newCallMediaType:(TUICallMediaType)newCallMediaType NS_SWIFT_NAME(onCallMediaTypeChanged(oldCallMediaType:newCallMediaType:));
/**
* xxxx 用户拒绝通话的回调
*
* @param userId 拒绝用户的 ID
*/
- (void)onUserReject:(NSString *)userId NS_SWIFT_NAME(onUserReject(userId:));
/**
* xxxx 用户不响应的回调
*
* @param userId 无响应用户的 ID
*/
- (void)onUserNoResponse:(NSString *)userId NS_SWIFT_NAME(onUserNoResponse(userId:));
/**
* xxxx 用户忙线的回调
*
* @param userId 忙线用户的 ID
*/
- (void)onUserLineBusy:(NSString *)userId NS_SWIFT_NAME(onUserLineBusy(userId:));
/**
* 当用户被邀请加入通话时的回调
*
* @param userId 被邀请的用户 ID
*/
- (void)onUserInviting:(NSString *)userId NS_SWIFT_NAME(onUserInviting(userId:));
/**
* xxxx 用户加入通话的回调
*
* @param userId 加入当前通话的用户 ID
*/
- (void)onUserJoin:(NSString *)userId NS_SWIFT_NAME(onUserJoin(userId:));
/**
* xxxx 用户离开通话的回调
*
* @param userId 离开当前通话的用户 ID
*/
- (void)onUserLeave:(NSString *)userId NS_SWIFT_NAME(onUserLeave(userId:));
/**
* xxxx 远端用户是否有视频流的回调
*
* @param userId 通话用户 ID
* @param isVideoAvailable 用户视频是否可用
*/
- (void)onUserVideoAvailable:(NSString *)userId isVideoAvailable:(BOOL)isVideoAvailable NS_SWIFT_NAME(onUserVideoAvailable(userId:isVideoAvailable:));
/**
* xxxx 远端用户是否有音频流的回调
*
* @param userId 通话用户 ID
* @param isAudioAvailable 用户音频是否可用
*/
- (void)onUserAudioAvailable:(NSString *)userId isAudioAvailable:(BOOL)isAudioAvailable NS_SWIFT_NAME(onUserAudioAvailable(userId:isAudioAvailable:));
/**
* 所有用户音量大小的反馈回调
*
* @param volumeMap 音量表,根据每个 userId 可以获取对应用户的音量大小音量范围0-100
*/
- (void)onUserVoiceVolumeChanged:(NSDictionary<NSString *, NSNumber *> *)volumeMap NS_SWIFT_NAME(onUserVoiceVolumeChanged(volumeMap:));
/**
* 所有用户网络质量的反馈回调
*
* @param networkQualityList 网络状态,根据每个 userId 可以获取对应用户当前的网络质量
*/
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkQualityInfo *> *)networkQualityList NS_SWIFT_NAME(onUserNetworkQualityChanged(networkQualityList:));
/**
* 当前用户被踢下线:此时可以 UI 提示用户,并再次重新调用初始化
*/
- (void)onKickedOffline NS_SWIFT_NAME(onKickedOffline());
/**
* 在线时票据过期:此时您需要生成新的 userSig,并再次重新调用初始化
*/
- (void)onUserSigExpired NS_SWIFT_NAME(onUserSigExpired());
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallReceived 回调,功能更强,信息更全面;
*/
- (void)onCallReceived:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
groupId:(NSString *_Nullable)groupId
callMediaType:(TUICallMediaType)callMediaType NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:groupId:callMediaType:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallReceived 回调,功能更强,信息更全面;
*/
- (void)onCallReceived:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
groupId:(NSString *_Nullable)groupId
callMediaType:(TUICallMediaType)callMediaType
userData:(NSString *_Nullable)userData NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:groupId:callMediaType:userData:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃, 推荐使用 onCallNotConnected 回调,功能更强,信息更全面;
*/
- (void)onCallCancelled:(NSString *)callerId NS_SWIFT_NAME(onCallCancelled(callerId:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallBegin 回调,功能更强,信息更全面;
*/
- (void)onCallBegin:(TUIRoomId *)roomId callMediaType:(TUICallMediaType)callMediaType callRole:(TUICallRole)callRole NS_SWIFT_NAME(onCallBegin(roomId:callMediaType:callRole:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallEnd 回调,功能更强,信息更全面;
*/
- (void)onCallEnd:(TUIRoomId *)roomId
callMediaType:(TUICallMediaType)callMediaType
callRole:(TUICallRole)callRole
totalTime:(float)totalTime NS_SWIFT_NAME(onCallEnd(roomId:callMediaType:callRole:totalTime:)) __attribute__((deprecated("Deprecated from v3.0")));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,508 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUICommonDefine @ TUIKitEngine
* Function: TUIKitEngine 复用型定义
*/
#import <Foundation/Foundation.h>
#import "TUIEngineSymbolExport.h"
#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
#import <UIKit/UIKit.h>
typedef UIView TUIVideoView;
typedef UIImage TUIImage;
typedef UIEdgeInsets TUIEdgeInsets;
#elif TARGET_OS_MAC
#import <AppKit/AppKit.h>
typedef NSView TUIVideoView;
typedef NSImage TUIImage;
typedef NSEdgeInsets TUIEdgeInsets;
#endif
/**
* 1.1 错误码枚举定义。
*/
typedef NS_ENUM(NSInteger, TUIError) {
/// 操作成功。
TUIErrorSuccess = 0,
/// 暂未归类的通用错误。
TUIErrorFailed = -1,
/// 请求被限频,请稍后重试。
TUIErrorFreqLimit = -2,
/// 重复操作。
TUIErrorRepeatOperation = -3,
/// 房间 ID 不匹配,请检查是否退房或者切换了房间。
TUIErrorRoomMismatch = -4,
/// 未找到SDKAppID请在腾讯云视立方SDK[控制台](https://console.cloud.tencent.com/vcube/project/manage)确认应用信息。
TUIErrorSDKAppIDNotFound = -1000,
/// 调用 API 时,传入的参数不合法,检查入参是否合法。
TUIErrorInvalidParameter = -1001,
/// 未登录,请调用Login接口。
TUIErrorSdkNotInitialized = -1002,
/// 获取权限失败,当前未授权音/视频权限请查看是否开启设备权限。Room场景下请使用以下错误码来处理:
/// 摄像头没有系统授权: ERR_CAMERA_NOT_AUTHORIZED。
/// 麦克风没有系统授权: ERR_MICROPHONE_NOT_AUTHORIZED。
TUIErrorPermissionDenied = -1003,
/// 该功能需要开通额外的套餐请在腾讯云视立方SDK [控制台](https://console.cloud.tencent.com/vcube/project/manage) 按需开通对应套餐。
TUIErrorRequirePayment = -1004,
/// 错误描述:
/// SDK检测到当前使用的License无效或已过期导致播放功能受限无法正常播放
/// 错误原因:
/// 1. License非法或已过期
/// 2. License未包含所需功能权限
/// 3. License签名验证失败
/// 处理建议:
/// 1. 在腾讯云视立方控制台确认License有效期
/// 2. 联系腾讯云技术支持更新或重新获取License
TUIErrorInvalidLicense = -1005,
/// 系统问题,打开摄像头失败。检查摄像头设备是否正常。
TUIErrorCameraStartFail = -1100,
/// 摄像头没有系统授权, 检查系统授权。
TUIErrorCameraNotAuthorized = -1101,
/// 摄像头被占用,检查是否有其他进程使用摄像头。
TUIErrorCameraOccupied = -1102,
/// 当前无摄像头设备,请插入摄像头设备解决该问题。
TUIErrorCameraDeviceEmpty = -1103,
/// 系统问题,打开麦克风失败。检查麦克风设备是否正常。
TUIErrorMicrophoneStartFail = -1104,
/// 麦克风没有系统授权,检查系统授权。
TUIErrorMicrophoneNotAuthorized = -1105,
/// 麦克风被占用。
TUIErrorMicrophoneOccupied = -1106,
/// 当前无麦克风设备。
TUIErrorMicrophoneDeviceEmpty = -1107,
/// 获取屏幕分享源(屏幕和窗口)失败,检查屏幕录制权限。
TUIErrorGetScreenSharingTargetFailed = -1108,
/// 开启屏幕分享失败,检查房间内是否有人正在屏幕分享。
TUIErrorStartScreenSharingFailed = -1109,
/// 音频采集设备不可用(例如被系统电话或微信语音电话占用)。
TUIErrorAudioCaptureDeviceUnavailable = -1110,
/// 需要进房后才可使用此功能。
TUIErrorOperationInvalidBeforeEnterRoom = -2101,
/// 房主不支持退房操作Conference(会议)房间类型: 可以先转让房主再退房。LivingRoom(直播)房间类型: 房主只能解散房间。
TUIErrorExitNotSupportedForRoomOwner = -2102,
/// 当前房间类型下不支持该操作。
TUIErrorOperationNotSupportedInCurrentRoomType = -2103,
/// 创建房间ID 非法,自定义 ID 必须为可打印 ASCII 字符0x20-0x7e最长48个字节。
TUIErrorRoomIdInvalid = -2105,
/// 房间名称非法名称最长30字节如果包含中文字符编码必须是 UTF-8。
TUIErrorRoomNameInvalid = -2107,
/// 当前用户已在别的房间内,需要先退房才能加入新的房间:
/// 单个roomEngine实例只支持用户进入一个房间如果要进入不同的房间请先退房或者使用新的roomEngine实例。
TUIErrorAlreadyInOtherRoom = -2108,
/// 用户不存在。
TUIErrorUserNotExist = -2200,
/// 需要房主权限才能操作。
TUIErrorUserNeedOwnerPermission = -2300,
/// 需要房主或者管理员权限才能操作。
TUIErrorUserNeedAdminPermission = -2301,
/// 信令请求无权限,例如取消非自己发起的邀请。
TUIErrorRequestNoPermission = -2310,
/// 信令请求ID 无效或已经被处理过。
TUIErrorRequestIdInvalid = -2311,
/// 信令请求重复。
TUIErrorRequestIdRepeat = -2312,
/// 最大麦位超出套餐包数量限制。
TUIErrorMaxSeatCountLimit = -2340,
/// 麦位编号不存在。
TUIErrorSeatIndexNotExist = -2344,
/// 当前麦位音频被锁。
TUIErrorOpenMicrophoneNeedSeatUnlock = -2360,
/// 需要向房主或管理员申请后打开麦克风。
TUIErrorOpenMicrophoneNeedPermissionFromAdmin = -2361,
/// 当前麦位视频被锁, 需要由房主解锁麦位后,才能打开摄像头。
TUIErrorOpenCameraNeedSeatUnlock = -2370,
/// 需要向房主或管理员申请后打开摄像头。
TUIErrorOpenCameraNeedPermissionFromAdmin = -2371,
/// 当前麦位视频被锁, 需要由房主解锁麦位后,才能打开屏幕分享。
TUIErrorOpenScreenShareNeedSeatUnlock = -2372,
/// 需要向房主或管理员申请后打开屏幕分享。
TUIErrorOpenScreenShareNeedPermissionFromAdmin = -2373,
/// 当前房间已开启全员禁言。
TUIErrorSendMessageDisabledForAll = -2380,
/// 当前房间内,您已被已禁言。
TUIErrorSendMessageDisabledForCurrent = -2381,
/// 当前房间不支持预加载。
TUIErrorRoomNotSupportPreloading = -4001,
/// 错误描述:正在通话中,不允许操作设备/流相关接口。
/// 错误原因:
/// 当您在使用 TUIRoomEngine 直播过程中接听来自 TUICallEngine 的通话时为了避免通话的音视频数据被直播间观众拉取到TUIRoomEngine 会做如下处理:
/// 1. 暂停视频流上行,如果您在直播时有调用 `setLocalVideoMuteImage` 接口设置过垫片图片直播间观众会看到您设置的垫片图片TUICallEngine 通话结束后会自动恢复摄像头画面的上行;
/// 2. 暂停音频流上行TUICallEngine 通话结束后会自动恢复麦克风音频的上行。
/// 在 TUICallEngine 通话未结束期间,您在直播间内调用设备和流相关的 API 时均会出现此错误码。
/// 处理建议:您可以在页面上弹框提醒用户 “您正在通话中,请挂断后再试”。
TUIErrorCallInProgress = -6001,
/// 错误描述:
/// 服务器内部发生未知错误,导致请求无法正常处理
/// 错误原因:
/// 1. 服务器端服务异常或崩溃
/// 2. 服务器资源不足或过载
/// 3. 服务器配置错误
/// 处理建议:
/// 1. 提示用户"服务器繁忙,请稍后重试"
/// 2. 检查服务器日志定位具体问题
/// 3. 联系腾讯云技术支持排查后台服务问题
TUIErrorServerSystemError = 100001,
/// 错误描述:
/// 服务器接收到非法或不完整的请求参数,导致请求无法处理
/// 产生原因:
/// 1. 必填参数缺失或为空
/// 2. 参数格式不符合要求
/// 3. 参数值超出允许范围
/// 4. 参数类型不匹配
/// 处理建议:
/// 1. 检查请求参数是否完整
/// 2. 验证参数格式和类型是否符合API文档要求
/// 3. 确保参数值在有效范围内
/// 4. 查阅相关API文档确认参数规范
TUIErrorServerInvalidParameter = 100002,
/// 房间ID 已被使用请选择别的房间ID。
TUIErrorRoomIdOccupied = 100003,
/// 进房时房间不存在,或许已被解散。
TUIErrorRoomIdNotExist = 100004,
/// 用户不在当前房间内。
TUIErrorUserNotEntered = 100005,
/// 房间成员已满。
TUIErrorRoomUserFull = 100008,
/// 当前房间需要密码才能进入。
TUIErrorNeedPassword = 100018,
/// 进房密码错误。
TUIErrorWrongPassword = 100019,
/// 信令请求冲突。
TUIErrorRequestIdConflict = 100102,
/// 当前麦位被锁。
TUIErrorSeatLocked = 100200,
/// 当前麦位已经有人了。
TUIErrorSeatOccupied = 100210,
/// 当前用户已经在麦位上。
TUIErrorAlreadyInSeat = 100203,
/// 上麦人数已满。
TUIErrorAllSeatOccupied = 100205,
/// 当前用户没有在麦上。
TUIErrorUserNotInSeat = 100206,
/// 不支持连麦。
TUIErrorSeatNotSupportLinkMic = 100211,
/// 当前房间已连线。
TUIErrorRoomAlreadyConnected = 100401,
/// 当前房间与其他房间连线中。
TUIErrorRoomConnectedInOther = 100403,
/// 当前房间连线超出最大数量限制。
TUIErrorMaxConnectedCountLimit = 100404,
/// 房间自定义信息 key 数量超过上限
TUIErrorRoomMetadataExceedKeyCountLimit = 100500,
/// 房间自定义信息 value 字节大小超过上限
TUIErrorRoomMetadataExceedValueSizeLimit = 100501,
/// 礼物能力未开启
TUIErrorGiftAbilityNotEnabled = 102001,
/// 礼物ID不存在
TUIErrorGiftNotExist = 102002,
/// 错误描述:
/// 礼物服务器预验证失败, 礼物系统在发送礼物之前,会向您在控制台上配置的回调服务器地址发送“礼物发送确认请求”,如果从您的服务器获得确认码为 0礼物系统才会真正发出礼物。
/// 错误原因:
/// 1. 礼物系统向您的服务器请求超时了(超时时间为两秒),比如您的服务器没有打开相应的端口,或者防火墙策略限制了外网的 http 协议访问。
/// 2. 您的服务器没有成功解析“礼物发送确认请求”的数据包,导致您的服务器返回了数值不为 0 的确认码。
/// 处理建议:
/// 1. 检查服务器端口开放状态和防火墙设置。
/// 2. 确保服务器能正确处理JSON格式的验证请求。
TUIErrorGiftServerPreVerificationFailed = 102004,
};
/**
* 1.2 网络质量。
*/
typedef NS_ENUM(NSUInteger, TUINetworkQuality) {
/// 未定义。
TUINetworkQualityUnknown = 0,
/// 当前网络非常好。
TUINetworkQualityExcellent = 1,
/// 当前网络比较好。
TUINetworkQualityGood = 2,
/// 当前网络一般。
TUINetworkQualityPoor = 3,
/// 当前网络较差。
TUINetworkQualityBad = 4,
/// 当前网络很差。
TUINetworkQualityVeryBad = 5,
/// 当前网络不满足 TRTC 的最低要求。
TUINetworkQualityDown = 6,
};
/**
* 1.3 插件类型。
*/
typedef NS_ENUM(NSUInteger, TUIExtensionType) {
/// 设备管理插件。
TUIExtensionTypeDeviceManager = 1,
/// 直播管理插件。
TUIExtensionTypeLiveListManager = 2,
/// 会议列表插件。
TUIExtensionTypeConferenceListManager = 3,
/// 会中呼叫插件。
TUIExtensionTypeConferenceInvitationManager = 4,
/// 直播布局插件。
TUIExtensionTypeLiveLayoutManager = 5,
/// 直播礼物插件
TUIExtensionTypeLiveGiftManager = 6,
};
/**
* 1.4 音频设备。
*/
typedef NS_ENUM(NSUInteger, TUIAudioPlaybackDevice) {
/// 扬声器。
TUIAudioPlaybackDeviceSpeakerphone = 0,
/// 听筒。
TUIAudioPlaybackDeviceEarpiece = 1,
};
/**
* 1.5 前置/后置摄像头。
*/
typedef NS_ENUM(NSUInteger, TUICamera) {
/// 前置摄像头。
TUICameraFront = 0,
/// 后置摄像头。
TUICameraBack = 1,
};
/**
* 1.6 网络质量信息。
*/
TUIENGINE_EXPORT @interface TUINetworkInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 网络质量。
@property(nonatomic, assign) TUINetworkQuality quality;
/// 上行丢包率,单位 (%) 该数值越小越好。
/// 如果 upLoss 为 0%,则意味着上行链路的网络质量很好,上传到云端的数据包基本不发生丢失。
/// 如果 upLoss 为 30%,则意味着 SDK 向云端发送的音视频数据包中,会有 30%丢失在传输链路中。
@property(nonatomic, assign) uint32_t upLoss;
/// 下行丢包率,单位 (%) 该数值越小越好。
/// 如果 downLoss 为 0%,则意味着下行链路的网络质量很好,从云端接收的数据包基本不发生丢失。
/// 如果 downLoss 为 30%,则意味着云端向 SDK 传输的音视频数据包中,会有 30%丢失在传输链路中。
@property(nonatomic, assign) uint32_t downLoss;
/// 网络延迟,单位 ms。
@property(nonatomic, assign) uint32_t delay;
@end
/**
* 1.8 网络质量信息废弃推荐使用1.6 {@link TUINetworkInfo})。
*/
TUIENGINE_EXPORT @interface TUINetworkQualityInfo : NSObject
/// 用户 ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 网络质量。
@property(nonatomic, assign) TUINetworkQuality quality;
@end
/**
* 1.9 视频画面填充模式。
*/
typedef NS_ENUM(NSInteger, TUIVideoRenderParamsFillMode) {
/// 填充模式:即将画面内容居中等比缩放以充满整个显示区域,超出显示区域的部分将会被裁剪掉,此模式下画面可能不完整。
TUIVideoRenderParamsFillModeFill = 0,
/// 适应模式:即按画面长边进行缩放以适应显示区域,短边部分会被填充为黑色,此模式下图像完整但可能留有黑边。
TUIVideoRenderParamsFillModeFit = 1,
};
/**
* 1.10 视频画面旋转方向。
*/
typedef NS_ENUM(NSInteger, TUIVideoRenderParamsRotation) {
/// 不旋转。
TUIVideoRenderParamsRotation_0 = 0,
/// 顺时针旋转90度。
TUIVideoRenderParamsRotation_90 = 1,
/// 顺时针旋转180度。
TUIVideoRenderParamsRotation_180 = 2,
/// 顺时针旋转270度。
TUIVideoRenderParamsRotation_270 = 3,
};
/**
* 1.11 视频宽高比模式。
*/
typedef NS_ENUM(NSInteger, TUIVideoEncoderParamsResolutionMode) {
/// 横屏分辨率例如Resolution_640_360 + Landscape = 640x360。
TUIVideoEncoderParamsResolutionModeLandscape = 0,
/// 竖屏分辨率,例如Resolution_640_360 + Portrait = 360x640。
TUIVideoEncoderParamsResolutionModePortrait = 1,
};
/**
* 1.12 视频分辨率。
*/
typedef NS_ENUM(NSInteger, TUIVideoEncoderParamsResolution) {
/// 宽高比 16:9分辨率 640x360建议码率VideoCall500kbps。
TUIVideoEncoderParamsResolution_640_360 = 1,
/// 宽高比 16:9分辨率 960x540建议码率VideoCall850kbps。
TUIVideoEncoderParamsResolution_960_540 = 2,
/// 宽高比 16:9分辨率 1280x720建议码率VideoCall1200kbps
TUIVideoEncoderParamsResolution_1280_720 = 3,
/// 宽高比 16:9分辨率 1920x1080建议码率VideoCall2000kbps。
TUIVideoEncoderParamsResolution_1920_1080 = 4,
};
/**
* 1.13 通话中音视频房间ID。
*
* - intRoomId 与 strRoomId 是互斥的,若您选用 strRoomId则 intRoomId 需要填写为 0。若两者都填SDK 将优先选用 intRoomId。
* - 不要混用 intRoomId 和 strRoomId因为它们之间是不互通的比如数字 123 和字符串 123 两个完全不同的房间。
*/
TUIENGINE_EXPORT @interface TUIRoomId : NSObject
/// 数字房间号,取值范围 1 - 2147483647(2^31-1)。
@property(nonatomic, assign) UInt32 intRoomId;
/// 字符串房间号,推荐取值:
/// 限制长度为 64 字节。以下为支持的字符集范围(共 89 个字符):
/// 大小写英文字母a-zA-Z
/// 数字0-9
/// 空格、!、#、$、%、&、(、)、+、-、:、;、<、=、.、>、?、@、[、]、^、_、{、}、|、~、,。
@property(nonatomic, copy) NSString* _Nullable strRoomId;
@end
/**
* 1.14 视频画面的渲染参数。
*/
TUIENGINE_EXPORT @interface TUIVideoRenderParams : NSObject
/// 视频画面填充模式。
@property(nonatomic, assign) TUIVideoRenderParamsFillMode fillMode;
/// 视频画面旋转方向。
@property(nonatomic, assign) TUIVideoRenderParamsRotation rotation;
@end
/**
* 1.15 视频编码参数。
*/
TUIENGINE_EXPORT @interface TUIVideoEncoderParams : NSObject
/// 视频分辨率。
@property(nonatomic, assign) TUIVideoEncoderParamsResolution resolution;
/// 视频宽高比。
@property(nonatomic, assign) TUIVideoEncoderParamsResolutionMode resolutionMode;
@end
typedef void (^TUISuccessBlock)(void);
typedef void (^TUIErrorBlock)(TUIError code, NSString* _Nonnull message);

View File

@@ -0,0 +1,235 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIConferenceInvitationManager @ TUIKitEngine
* Function: 会中邀请相关接口,此页面中的函数仅支持会议房间类型({@link TUIRoomTypeConference})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 邀请状态
*/
typedef NS_ENUM(NSUInteger, TUIInvitationStatus) {
/// 未知状态。
TUIInvitationStatusNone = 0,
/// 待处理状态。
TUIInvitationStatusPending = 1,
/// 超时状态。
TUIInvitationStatusTimeout = 2,
/// 已接受状态。
TUIInvitationStatusAccepted = 3,
/// 被拒绝状态。
TUIInvitationStatusRejected = 4,
};
/**
* 邀请错误码枚举
*/
typedef NS_ENUM(NSInteger, TUIInvitationCode) {
/// 邀请成功。
TUIInvitationCodeSuccess = 0,
/// 当前用户已在邀请列表。
TUIInvitationCodeAlreadyInInvitationList = 1,
/// 当前用户已在房间内。
TUIInvitationCodeAlreadyInConference = 2,
};
/**
* 邀请拒绝原因枚举
*/
typedef NS_ENUM(NSInteger, TUIInvitationRejectedReason) {
/// 拒绝进入。
TUIInvitationRejectedReasonRejectToEnter = 0,
/// 在其他会议中。
TUIInvitationRejectedReasonInOtherConference = 1,
};
/**
* 邀请信息结构体
*/
TUIENGINE_EXPORT @interface TUIInvitation : NSObject
/// 邀请状态。
@property(nonatomic, assign, readonly) TUIInvitationStatus status;
/// 被邀请者信息。
@property(nonatomic, strong, readwrite) TUIUserInfo *invitee;
/// 邀请者信息。
@property(nonatomic, strong, readwrite) TUIUserInfo *inviter;
@end
typedef void (^TUIInvitationListResponseBlock)(NSArray<TUIInvitation *> *_Nonnull list, NSString *cursor);
typedef void (^TUIInviteUsersResponseBlock)(NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUIConferenceInvitationObserver <NSObject>
/**
* 收到邀请回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param extensionInfo 扩展信息。
*/
- (void)onReceiveInvitation:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation extensionInfo:(NSString *)extensionInfo NS_SWIFT_NAME(onReceiveInvitation(roomInfo:invitation:extensionInfo:));
/**
* 邀请已在其他设备被处理回调
*
* @param roomInfo 房间信息。
* @param accepted 邀请是否被接受。
*/
- (void)onInvitationHandledByOtherDevice:(TUIRoomInfo *)roomInfo accepted:(BOOL)accepted NS_SWIFT_NAME(onInvitationHandledByOtherDevice(roomInfo:accepted:));
/**
* 邀请被取消回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationCancelled:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationCancelled(roomInfo:invitation:));
/**
* 邀请被接受回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationAccepted:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationAccepted(roomInfo:invitation:));
/**
* 邀请被拒绝回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param reason 拒绝原因。
*/
- (void)onInvitationRejected:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation reason:(TUIInvitationRejectedReason)reason NS_SWIFT_NAME(onInvitationRejected(roomInfo:invitation:reason:));
/**
* 邀请超时回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationTimeout:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationTimeout(roomInfo:invitation:));
/**
* 邀请被管理员/房主撤销回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param admin 管理员/房主信息。
*/
- (void)onInvitationRevokedByAdmin:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation admin:(TUIUserInfo *)admin NS_SWIFT_NAME(onInvitationRevokedByAdmin(roomInfo:invitation:admin:));
/**
* 新增邀请回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationAdded:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationAdded(roomId:invitation:));
/**
* 邀请被移除回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationRemoved:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationRemoved(roomId:invitation:));
/**
* 邀请状态变更回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationStatusChanged:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationStatusChanged(roomId:invitation:));
@end
TUIENGINE_EXPORT @interface TUIConferenceInvitationManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUIConferenceInvitationObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUIConferenceInvitationObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 邀请成员
*
* @param roomId 房间Id。
* @param userIdList 成员userId列表。
* @param timeout 超时时间。
* @param extensionInfo 扩展信息。
*/
- (void)inviteUsers:(NSString *)roomId
userIdList:(NSArray<NSString *> *)userIdList
timeout:(NSTimeInterval)timeout
extensionInfo:(NSString *)extensionInfo
onSuccess:(TUIInviteUsersResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(inviteUsers(_:userIdList:timeout:extensionInfo:onSuccess:onError:));
/**
* 取消邀请
*
* @param roomId 房间Id。
* @param userIdList 成员userId列表。
*/
- (void)cancelInvitation:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelInvitation(_:userIdList:onSuccess:onError:));
/**
* 接受邀请
*
* @param roomId 房间Id。
*/
- (void)accept:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(accept(_:onSuccess:onError:));
/**
* 拒绝邀请
*
* @param roomId 房间Id。
* @param reason 拒绝原因。
*/
- (void)reject:(NSString *)roomId reason:(TUIInvitationRejectedReason)reason onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(reject(_:reason:onSuccess:onError:));
/**
* 拉取邀请列表
*
* @param roomId 房间Id。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)getInvitationList:(NSString *)roomId cursor:(NSString *)cursor count:(NSInteger)count onSuccess:(TUIInvitationListResponseBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getInvitationList(_:cursor:count:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,225 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIConferenceListManager @ TUIKitEngine
* Function: 会议列表相关接口,此页面中的函数仅支持会议房间类型({@link TUIRoomTypeConference})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 会议状态
*/
typedef NS_OPTIONS(NSUInteger, TUIConferenceStatus) {
/// 未知状态
TUIConferenceStatusNone = 0,
/// 会议未开始
TUIConferenceStatusNotStarted = 1,
/// 会议进行中(当前时间 - 预约开始时间 < 1 分钟时,会议状态从未开始转到进行中)
TUIConferenceStatusRunning = 2,
};
/**
* 会议取消原因
*/
typedef NS_ENUM(NSUInteger, TUIConferenceCancelReason) {
/// 房主取消
TUIConferenceCancelReasonCancelledByAdmin = 0,
/// 当前用户被移出参会人员列表
TUIConferenceCancelReasonRemovedFromAttendees = 1,
};
/**
* 预定会议信息修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUIConferenceModifyFlag) {
/// 未定义
TUIConferenceModifyFlagNone = 0x00,
/// 会议名称
TUIConferenceModifyFlagRoomName = 0x01 << 0,
/// 预定开始时间,不填写则默认为当前时间
TUIConferenceModifyFlagScheduleStartTime = 0x01 << 16,
/// 预定结束时间,不填写,则默认为预定开始时间后 1 小时(即默认的会议时长为 1 小时),会议最小持续时间不能小于 5 分钟,最长时间不能超过 24 小时
TUIConferenceModifyFlagScheduleEndTime = 0x01 << 17,
};
/**
* 会议信息
*/
TUIENGINE_EXPORT @interface TUIConferenceInfo : NSObject
/// 预定会议开始时间
@property(nonatomic, assign) NSUInteger scheduleStartTime;
/// 预定会议结束时间
@property(nonatomic, assign) NSUInteger scheduleEndTime;
/// 邀请参会成员列表,可在预定会议时设置,拉取成员请使用 {@link fetchAttendeeList} 接口
@property(nonatomic, strong, readwrite) NSArray<NSString *> *scheduleAttendees;
/// 会议开始前提醒时间(秒)
@property(nonatomic, assign) NSInteger reminderSecondsBeforeStart;
/// 房间状态(只读)
@property(nonatomic, assign, readonly) TUIConferenceStatus status;
/// 会议基础信息
@property(nonatomic, strong, readwrite) TUIRoomInfo *basicRoomInfo;
@end
typedef void (^TUIScheduledAttendeesResponseBlock)(NSArray<TUIUserInfo *> *_Nonnull list, NSString *cursor, NSUInteger totalAttendeeCount);
typedef void (^TUIScheduledConferenceListResponseBlock)(NSArray<TUIConferenceInfo *> *_Nonnull list, NSString *cursor);
@protocol TUIConferenceListManagerObserver <NSObject>
/**
* 会议预定回调
*
* @param conferenceInfo 会议信息
*/
- (void)onConferenceScheduled:(TUIConferenceInfo *)conferenceInfo NS_SWIFT_NAME(onConferenceScheduled(conferenceInfo:));
/**
* 会议即将开始回调
*
* @param conferenceInfo 会议信息。
*/
- (void)onConferenceWillStart:(TUIConferenceInfo *)conferenceInfo NS_SWIFT_NAME(onConferenceWillStart(conferenceInfo:));
/**
* 会议取消回调
*
* @param roomId 会议Id即房间roomId。
* @param reason 会议取消原因。
* @param operateUser 取消会议操作者信息。
*/
- (void)onConferenceCancelled:(NSString *)roomId reason:(TUIConferenceCancelReason)reason operateUser:(TUIUserInfo *)operateUser NS_SWIFT_NAME(onConferenceCancelled(roomId:reason:operateUser:));
/**
* 会议信息变更回调
*
* @param conferenceInfo 会议信息。
* @param modifyFlag 会议信息变更标志位。
*/
- (void)onConferenceInfoChanged:(TUIConferenceInfo *)conferenceInfo modifyFlag:(TUIConferenceModifyFlag)modifyFlag NS_SWIFT_NAME(onConferenceInfoChanged(conferenceInfo:modifyFlag:));
/**
* 参会人员变更回调
*
* @param roomId 会议Id即房间roomId。
* @param leftUsers 离开成员列表。
* @param joinedUsers 新加入成员列表。
*/
- (void)onScheduleAttendeesChanged:(NSString *)roomId leftUsers:(NSArray<TUIUserInfo *> *)leftUsers joinedUsers:(NSArray<TUIUserInfo *> *)joinedUsers NS_SWIFT_NAME(onScheduleAttendeesChanged(roomId:leftUsers:joinedUsers:));
/**
* 会议状态变更回调
*
* @param roomId 会议Id即房间roomId。
* @param status 会议状态枚举,详情参见:{@link TUIConferenceStatus}。
*/
- (void)onConferenceStatusChanged:(NSString *)roomId status:(TUIConferenceStatus)status NS_SWIFT_NAME(onConferenceStatusChanged(roomId:status:));
@end
TUIENGINE_EXPORT @interface TUIConferenceListManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUIConferenceListManagerObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUIConferenceListManagerObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 预定会议
*
* @param conferenceInfo 预定会议信息。
*/
- (void)scheduleConference:(TUIConferenceInfo *)conferenceInfo onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(scheduleConference(_:onSuccess:onError:));
/**
* 取消预定会议
*
* @param roomId 要取消会议的会议Id即房间roomId。
*/
- (void)cancelConference:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelConference(_:onSuccess:onError:));
/**
* 更新预定会议信息
*
* @param conferenceInfo 预定会议信息。
* @param modifyFlag 更新会议信息标记位。
*/
- (void)updateConferenceInfo:(TUIConferenceInfo *)conferenceInfo
modifyFlag:(TUIConferenceModifyFlag)modifyFlag
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(updateConferenceInfo(conferenceInfo:modifyFlag:onSuccess:onError:));
/**
* 获取预定会议列表
*
* @param status 会议状态。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)fetchScheduledConferenceList:(TUIConferenceStatus)status
cursor:(NSString *)cursor
count:(NSInteger)count
onSuccess:(TUIScheduledConferenceListResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchScheduledConferenceList(status:cursor:count:onSuccess:onError:));
/**
* 获取预定会议邀请成员列表
*
* @param roomId 预定会议会议Id即房间roomId。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)fetchAttendeeList:(NSString *)roomId
cursor:(NSString *)cursor
count:(NSInteger)count
onSuccess:(TUIScheduledAttendeesResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchAttendeeList(roomId:cursor:count:onSuccess:onError:));
/**
* 添加成员至邀请列表
*
* @param roomId 预定会议Id即房间roomId。
* @param userIdList 成员userId列表。
*/
- (void)addAttendeesByAdmin:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(addAttendeesByAdmin(roomId:userIdList:onSuccess:onError:));
/**
* 从邀请列表移除成员
*
* @param roomId 预定会议Id即房间roomId。
* @param userIdList 成员userId列表。
*/
- (void)removeAttendeesByAdmin:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(removeAttendeesByAdmin(roomId:userIdList:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,12 @@
// Copyright (c) 2022 Tencent. All rights reserved.
#ifndef TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_
#define TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_
#if defined(BUILD_TUIENGINE)
#define TUIENGINE_EXPORT __attribute__((visibility("default")))
#else
#define TUIENGINE_EXPORT
#endif
#endif // TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_

View File

@@ -0,0 +1,266 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveBattleManager @ TUIKitEngine
* Function: 直播 Battle 相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Battle 用户信息
*/
TUIENGINE_EXPORT @interface TUIBattleUser : NSObject
/// Battle 房间 id。
@property(nonatomic, copy, nonnull) NSString *roomId;
/// Battle 用户id。
@property(nonatomic, copy, nonnull) NSString *userId;
/// Battle 用户昵称。
@property(nonatomic, copy, nonnull) NSString *userName;
/// Battle 用户头像地址。
@property(nonatomic, copy, nonnull) NSString *avatarUrl;
/// Battle 分数。
@property(nonatomic, assign) NSUInteger score;
@end
/**
* Battle 配置
*/
TUIENGINE_EXPORT @interface TUIBattleConfig : NSObject
/// Battle 最大时长(单位:秒)。
@property(nonatomic, assign) NSTimeInterval duration;
/// 被邀请用户是否需要回复同意/拒绝。
@property(nonatomic, assign) BOOL needResponse;
/// Battle 扩展信息。
@property(nonatomic, copy, nonnull) NSString *extensionInfo;
@end
/**
* Battle 信息
*/
TUIENGINE_EXPORT @interface TUIBattleInfo : NSObject
/// Battle ID。
@property(nonatomic, copy, readonly, nonnull) NSString *battleId;
/// Battle 配置。
@property(nonatomic, strong, readonly, nonnull) TUIBattleConfig *config;
/// Battle 发起人。
@property(nonatomic, strong, readonly, nonnull) TUIBattleUser *inviter;
/// Battle 邀请成员。
@property(nonatomic, strong, readonly, nonnull) NSArray<TUIBattleUser *> *inviteeList;
/// Battle 开始标记时间戳(单位:秒)。
@property(nonatomic, assign, readonly) NSUInteger startTime;
/// Battle 结束标记时间戳(单位:秒)。
@property(nonatomic, assign, readonly) NSUInteger endTime;
@end
/**
* Battle 邀请状态
*/
typedef NS_ENUM(NSInteger, TUIBattleCode) {
/// 默认状态。
TUIBattleCodeUnknown = -1,
/// Battle 请求发送成功。
TUIBattleCodeSuccess = 0,
/// 被邀请的房间不存在。
TUIBattleCodeRoomNotExist = 1,
/// 被邀请的房间已在 Battle 中。
TUIBattleCodeBattling = 2,
/// 被邀请的房间已与其他房间 Battle 中。
TUIBattleCodeBattlingOtherRoom = 3,
/// 房间已退出。
TUIBattleCodeRoomExit = 4,
/// 内部错误,推荐重试一次。
TUIBattleCodeRetry = 5,
};
/**
* Battle 结束的原因
*/
typedef NS_ENUM(NSInteger, TUIBattleStoppedReason) {
/// Battle 到达最大时长而超时结束
TUIBattleStoppedReasonTimeOver = 0,
/// Battle 其余人员都已退出
TUIBattleStoppedReasonOtherExit = 1,
};
typedef void (^TUIBattleRequestBlock)(TUIBattleInfo *battleInfo, NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUILiveBattleObserver <NSObject>
/**
* 收到 Battle 开始的通知
*
* @param battleInfo Battle 信息。
*/
- (void)onBattleStarted:(TUIBattleInfo *)battleInfo NS_SWIFT_NAME(onBattleStarted(battleInfo:));
/**
* 收到 Battle 结束的通知
*
* @param battleInfo Battle 信息。
* @param reason Battle 结束的原因。
*/
- (void)onBattleEnded:(TUIBattleInfo *)battleInfo reason:(TUIBattleStoppedReason)reason NS_SWIFT_NAME(onBattleEnded(battleInfo:reason:));
/**
* 收到用户加入 Battle 的通知
*
* @param battleId Battle ID。
* @param battleUser Battle 用户信息。
*/
- (void)onUserJoinBattle:(NSString *)battleId battleUser:(TUIBattleUser *)battleUser NS_SWIFT_NAME(onUserJoinBattle(battleId:battleUser:));
/**
* 收到用户退出 Battle 的通知
*
* @param battleId Battle ID。
* @param battleUser Battle 用户信息。
*/
- (void)onUserExitBattle:(NSString *)battleId battleUser:(TUIBattleUser *)battleUser NS_SWIFT_NAME(onUserExitBattle(battleId:battleUser:));
/**
* 收到用户 Battle 分数更新的通知
*
* @param battleId Battle ID。
* @param battleUserList Battle 所有用户信息。
*/
- (void)onBattleScoreChanged:(NSString *)battleId battleUserList:(NSArray<TUIBattleUser *> *)battleUserList NS_SWIFT_NAME(onBattleScoreChanged(battleId:battleUserList:));
/**
* 被叫收到 Battle 邀请的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestReceived:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestReceived(battleInfo:inviter:invitee:));
/**
* 被叫收到 Battle 取消的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestCancelled:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestCancelled(battleInfo:inviter:invitee:));
/**
* 收到 Battle 处理超时的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestTimeout:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestTimeout(battleInfo:inviter:invitee:));
/**
* 主叫收到被叫同意的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestAccept:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestAccept(battleInfo:inviter:invitee:));
/**
* 主叫收到被叫拒绝的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestReject:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestReject(battleInfo:inviter:invitee:));
@end
TUIENGINE_EXPORT @interface TUILiveBattleManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveBattleObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveBattleObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起 Battle 请求
*
* @param config Battle 配置信息。
* @param userIdList 待邀请的用户ID列表。
* @param timeout 超时时间。
*/
- (void)requestBattle:(TUIBattleConfig *)config
userIdList:(NSArray<NSString *> *)userIdList
timeout:(NSTimeInterval)timeout
onSuccess:(TUIBattleRequestBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(requestBattle(config:userIdList:timeout:onSuccess:onError:));
/**
* 取消 Battle 请求
*
* @param battleId Battle ID。
* @param userIdList 待取消的用户ID列表。
*/
- (void)cancelBattleRequest:(NSString *)battleId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelBattleRequest(battleId:userIdList:onSuccess:onError:));
/**
* 接受 Battle 请求
*
* @param battleId Battle ID。
*/
- (void)acceptBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(acceptBattle(battleId:onSuccess:onError:));
/**
* 拒绝 Battle 请求
*
* @param battleId Battle ID。
*/
- (void)rejectBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(rejectBattle(battleId:onSuccess:onError:));
/**
* 退出 Battle
*
* @param battleId Battle ID。
*/
- (void)exitBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(exitBattle(battleId:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,176 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveConnectionManager @ TUIKitEngine
* Function: 直播连线相关接口,此页面中的函数仅支持直播房间类型({@link TUIRoomTypeLive})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 连线用户信息
*/
TUIENGINE_EXPORT @interface TUIConnectionUser : NSObject
/// 连线的房间id。
@property(nonatomic, copy, nonnull) NSString *roomId;
/// 连线的用户id。
@property(nonatomic, copy, nonnull) NSString *userId;
/// 连线的用户昵称。
@property(nonatomic, copy, nonnull) NSString *userName;
/// 连线的用户头像地址。
@property(nonatomic, copy, nonnull) NSString *avatarUrl;
/// 连线开始标记时间戳。
@property(nonatomic, assign) NSUInteger joinConnectionTime;
@end
/**
* 连线邀请状态
*/
typedef NS_ENUM(NSInteger, TUIConnectionCode) {
/// 默认状态。
TUIConnectionCodeUnknown = -1,
/// 连线请求发送成功。
TUIConnectionCodeSuccess = 0,
/// 邀请连线的房间不存在。
TUIConnectionCodeRoomNotExist = 1,
/// 被邀请连线的房间已在邀请列表或者已连线。
TUIConnectionCodeConnecting = 2,
/// 被邀请连线的房间与其他房间连线中。
TUIConnectionCodeConnectingOtherRoom = 3,
/// 当前连线人数已达最大限制。
TUIConnectionCodeFull = 4,
/// 内部错误,推荐重试一次。
TUIConnectionCodeRetry = 5,
};
typedef void (^TUIConnectionRequestBlock)(NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUILiveConnectionObserver <NSObject>
/**
* 收到连线用户列表发生变化
*
* @param connectedList 已连线的用户列表。
* @param joinedList 新加入连线的用户列表。
* @param leavedList 退出连线的用户列表。
*/
- (void)onConnectionUserListChanged:(NSArray<TUIConnectionUser *> *)connectedList
joinedList:(NSArray<TUIConnectionUser *> *)joinedList
leavedList:(NSArray<TUIConnectionUser *> *)leavedList NS_SWIFT_NAME(onConnectionUserListChanged(connectedList:joinedList:leavedList:));
/**
* 接收端收到连线邀请的回调
*
* @param inviter 邀请者信息。
* @param inviteeList 被邀请连线的用户列表。
* @param extensionInfo 透传信息。
*/
- (void)onConnectionRequestReceived:(TUIConnectionUser *)inviter inviteeList:(NSArray<TUIConnectionUser *> *)inviteeList extensionInfo:(NSString *)extensionInfo NS_SWIFT_NAME(onConnectionRequestReceived(inviter:inviteeList:extensionInfo:));
/**
* 邀请取消回调
*
* @param inviter 邀请者信息。
*/
- (void)onConnectionRequestCancelled:(TUIConnectionUser *)inviter NS_SWIFT_NAME(onConnectionRequestCancelled(inviter:));
/**
* 邀请被接受回调
*
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestAccept:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestAccept(invitee:));
/**
* 邀请被拒绝回调
*
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestReject:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestReject(invitee:));
/**
* 邀请超时回调
*
* @param inviter 邀请者信息。
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestTimeout:(TUIConnectionUser *)inviter invitee:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestTimeout(inviter:invitee:));
@end
TUIENGINE_EXPORT @interface TUILiveConnectionManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveConnectionObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveConnectionObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起连线请求
*
* @param roomIdList 待邀请的连线房间ID列表。
* @param timeout 超时时间。
* @param extensionInfo 扩展信息。
*/
- (void)requestConnection:(NSArray<NSString *> *)roomIdList
timeout:(NSTimeInterval)timeout
extensionInfo:(NSString *)extensionInfo
onSuccess:(TUIConnectionRequestBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(requestConnection(roomIdList:timeout:extensionInfo:onSuccess:onError:));
/**
* 取消连线请求
*
* @param roomIdList 被取消连线请求的房间Id列表。
*/
- (void)cancelConnectionRequest:(NSArray<NSString *> *)roomIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelConnectionRequest(roomIdList:onSuccess:onError:));
/**
* 接受连线邀请
*
* @param roomId 房间Id。
*/
- (void)acceptConnection:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(acceptConnection(_:onSuccess:onError:));
/**
* 拒绝连线邀请
*
* @param roomId 房间Id。
*/
- (void)rejectConnection:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(rejectConnection(_:onSuccess:onError:));
/**
* 退出房间连线
*
* 调用该接口会退出房间连线状态,仅限已连线的状态下调用。
*/
- (void)disconnect:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(disconnect(_onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,161 @@
/**
* Copyright (c) 2025 Tencent. All rights reserved.
* Module: TUILiveGiftManager @ TUIKitEngine
* Function: 直播 礼物 相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Gift 礼物信息
*/
TUIENGINE_EXPORT @interface TUIGiftInfo : NSObject
/// Gift 礼物ID
@property(nonatomic, copy) NSString *giftId;
/// Gift 礼物名称
@property(nonatomic, copy) NSString *name;
/// Gift 礼物描述
@property(nonatomic, copy) NSString *desc;
/// Gift 礼物图标URL
@property(nonatomic, copy) NSString *iconUrl;
/// Gift 礼物资源URL
@property(nonatomic, copy) NSString *resourceUrl;
/// Gift 礼物等级
@property(nonatomic, assign) NSUInteger level;
/// Gift 礼物价格
@property(nonatomic, assign) NSUInteger coins;
/// Gift 礼物扩展自定义信息
@property(nonatomic, strong) NSDictionary<NSString *, NSString *> *extensionInfo;
@end
/**
* Gift 分类信息
*/
TUIENGINE_EXPORT @interface TUIGiftCategory : NSObject
/// Gift 分类ID
@property(nonatomic, copy) NSString *categoryId;
/// Gift 分类名称
@property(nonatomic, copy) NSString *name;
/// Gift 分类描述
@property(nonatomic, copy) NSString *desc;
/// Gift 分类扩展自定义信息
@property(nonatomic, strong) NSDictionary<NSString *, NSString *> *extensionInfo;
/// Gift 分类礼物列表
@property(nonatomic, copy) NSArray<TUIGiftInfo *> *giftList;
@end
typedef void (^TUIGetGiftListBlock)(NSArray<TUIGiftCategory *> *_Nonnull giftCategoryList);
typedef void (^TUIGetGiftCountBlock)(NSUInteger totalGiftsSent, NSUInteger totalGiftCoins, NSUInteger totalUniqueGiftSenders);
typedef void (^TUIGetLikesCountBlock)(NSUInteger totalLikesReceived);
@protocol TUILiveGiftObserver <NSObject>
/**
* 收到礼物数量变化的通知
*
* @param roomId 直播间ID
* @param totalGiftsSent 礼物数量
* @param totalGiftCoins 礼物价值
* @param totalUniqueGiftSenders 礼物发送者数量
*/
- (void)onGiftCountChanged:(NSString *)roomId
totalGiftsSent:(NSUInteger)totalGiftsSent
totalGiftCoins:(NSUInteger)totalGiftCoins
totalUniqueGiftSenders:(NSUInteger)totalUniqueGiftSenders NS_SWIFT_NAME(onGiftCountChanged(roomId:totalGiftsSent:totalGiftCoins:totalUniqueGiftSenders:));
/**
* 收到礼物消息的通知
*
* @param roomId 直播间ID
* @param giftInfo 礼物信息
* @param giftCount 礼物数量
* @param sender 礼物发送者信息
*/
- (void)onReceiveGiftMessage:(NSString *)roomId giftInfo:(TUIGiftInfo *)giftInfo giftCount:(NSUInteger)giftCount sender:(TUIUserInfo *)sender NS_SWIFT_NAME(onReceiveGiftMessage(roomId:giftInfo:giftCount:sender:));
/**
* 收到点赞消息的通知
*
* @param roomId 直播间ID
* @param totalLikesReceived 点赞数量
* @param sender 点赞发送者信息
*/
- (void)onReceiveLikesMessage:(NSString *)roomId totalLikesReceived:(NSUInteger)totalLikesReceived sender:(TUIUserInfo *)sender NS_SWIFT_NAME(onReceiveLikesMessage(roomId:totalLikesReceived:sender:));
@end
TUIENGINE_EXPORT @interface TUILiveGiftManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveGiftObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveGiftObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 请求获取礼物列表。
*
* @param roomId 直播间ID
*/
- (void)getGiftList:(NSString *)roomId onSuccess:(TUIGetGiftListBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getGiftList(roomId:onSuccess:onError:));
/**
* 发送礼物
*
* @param roomId 直播间ID
* @param giftId 礼物ID
* @param count 礼物数量
*/
- (void)sendGift:(NSString *)roomId giftId:(NSString *)giftId count:(NSUInteger)count onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(sendGift(roomId:giftId:count:onSuccess:onError:));
/**
* 发送点赞
*
* @param roomId 直播间ID
* @param count 点赞数量
*/
- (void)sendLike:(NSString *)roomId count:(NSUInteger)count onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(sendLike(roomId:count:onSuccess:onError:));
/**
* 房主获取礼物数量
*
* @param roomId 直播间ID
*/
- (void)getGiftCountByAnchor:(NSString *)roomId onSuccess:(TUIGetGiftCountBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getGiftCountByAnchor(roomId:onSuccess:onError:));
/**
* 获取点赞数量
*
* @param roomId 直播间ID
*/
- (void)getLikesCount:(NSString *)roomId onSuccess:(TUIGetLikesCountBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLikesCount(roomId:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,84 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveLayoutManager @ TUIKitEngine
* Function: 直播画面装饰相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 麦位的 UI 布局信息
*/
TUIENGINE_EXPORT @interface TUISeatLayout : NSObject
/// 当前使用的麦位布局模板的 ID
@property(nonatomic, assign, readonly) NSUInteger templateId;
/// 画布的宽度
@property(nonatomic, assign, readonly) NSUInteger canvasWidth;
/// 画布的高度
@property(nonatomic, assign, readonly) NSUInteger canvasHeight;
/// 麦位列表
@property(nonatomic, copy, readonly, nonnull) NSArray<TUISeatFullInfo *> *seatList;
@end
@protocol TUILiveLayoutObserver <NSObject>
@optional
/**
* 麦位布局发生变化的通知.(从 3.3 版本开始支持)
*
* @param roomId 房间 ID
* @param layout 最新的布局信息
*/
- (void)onSeatLayoutChanged:(NSString *)roomId layout:(TUISeatLayout *)layout NS_SWIFT_NAME(onSeatLayoutChanged(roomId:layout:));
/**
* 直播画面布局发生改变 (从 3.3 版本开始废弃,请使用 onSeatLayoutChanged 代替)
*
* @param roomId 房间ID
* @param layoutInfo 最新的画面布局信息
*/
- (void)onLiveVideoLayoutChanged:(NSString *)roomId
layoutInfo:(NSString *)layoutInfo NS_SWIFT_NAME(onLiveVideoLayoutChanged(roomId:layoutInfo:)) __attribute__((deprecated("Deprecated in version 3.3 and later, use onSeatLayoutChanged(roomId:layout:) instead.")));
@end
TUIENGINE_EXPORT @interface TUILiveLayoutManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveLayoutObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveLayoutObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 自定义设置视频流布局
*
* @param roomID 房间ID。
* @param layoutInfo 布局Json信息。
*/
- (void)setLiveStreamLayoutInfo:(NSString *)roomID
layoutInfo:(NSString *)layoutInfo
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(setLiveStreamLayoutInfo(roomID:layoutInfo:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,318 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveListManager @ TUIKitEngine
* Function: 直播房间列表相关接口,此页面中的函数仅支持直播房间类型({@link TUIRoomTypeLive})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 直播间修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUILiveModifyFlag) {
TUILiveModifyFlagNone = 0,
/// Name: 直播间名称
TUILiveModifyFlagName = 1 << 0,
/// Notice: 直播间公告
TUILiveModifyFlagNotice = 1 << 1,
/// DisableMessage: 房间内全员禁止消息
TUILiveModifyFlagDisableMessage = 1 << 2,
/// Publish: 直播间公开标记
TUILiveModifyFlagPublish = 1 << 5,
/// TakeSeatMode: 直播间内上麦模式
TUILiveModifyFlagTakeSeatMode = 1 << 6,
/// CoverUrl: 直播间封面
TUILiveModifyFlagCoverUrl = 1 << 7,
/// BackgroundUrl: 直播间背景.
TUILiveModifyFlagBackgroundUrl = 1 << 8,
/// Category: 直播间分类
TUILiveModifyFlagCategory = 1 << 9,
/// ActivityStatus: 直播间活跃状态,支持自定义设置
TUILiveModifyFlagActivityStatus = 1 << 10,
/// SeatLayoutTemplateId: 直播间麦位布局模板 ID
TUILiveModifyFlagSeatLayoutTemplateId = 1 << 11,
};
/**
* 直播统计数据修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUILiveStatisticsModifyFlag) {
TUILiveStatisticsModifyFlagNone = 0,
/// TotalViewers: 累计观看次数
TUILiveStatisticsModifyFlagTotalViewers = 1 << 0,
/// TotalGiftsSent: 送礼总个数
TUILiveStatisticsModifyFlagTotalGiftsSent = 1 << 1,
/// TotalGiftCoins: 送礼总金额
TUILiveStatisticsModifyFlagTotalGiftCoins = 1 << 2,
/// TotalUniqueGiftSenders: 送礼人数
TUILiveStatisticsModifyFlagTotalUniqueGiftSenders = 1 << 3,
/// TotalLikesReceived: 点赞总数
TUILiveStatisticsModifyFlagTotalLikesReceived = 1 << 4,
/// TotalMessageCount: 消息总数
TUILiveStatisticsModifyFlagTotalMessageCount = 1 << 5,
};
/**
* 直播信息
*/
TUIENGINE_EXPORT @interface TUILiveInfo : NSObject
/// 房间ID (创建房间必填参数最大支持48个字节)。
@property(nonatomic, copy, nonnull) NSString* roomId;
/// 房间名称创建房间可选参数默认房间ID最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* name;
/// 房间公告创建房间可选参数最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* notice;
/// 是否禁止发送消息(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisableForAllUser;
/// 直播间是否公开
@property(nonatomic, assign) BOOL isPublicVisible;
/// 是否开启麦位控制。
@property(nonatomic, assign) BOOL isSeatEnabled;
/// 房主开播后自动上麦
@property(nonatomic, assign) BOOL keepOwnerOnSeat;
/// 最大麦位数。
@property(nonatomic, assign) NSInteger maxSeatCount;
/// 上麦模式(只有开启麦位控制后生效)。
@property(nonatomic, assign) TUISeatMode seatMode;
/// 麦位布局模板 ID
/// 1.只有开启麦位控制后生效;
/// 2.seatLayoutTemplateId 和 maxSeatCount 同时设置时,优先以模板支持的麦位数为准。
@property(nonatomic, assign) NSUInteger seatLayoutTemplateId;
/// 直播间封面,最大支持 200 个字节
@property(nonatomic, copy, nonnull) NSString* coverUrl;
/// 直播间背景,最大支持 200 个字节
@property(nonatomic, copy, nonnull) NSString* backgroundUrl;
/// 直播间分类标签单个房间最大支持3个标记
@property(nonatomic, copy, nonnull) NSArray<NSNumber*>* categoryList;
/// 直播间活跃状态: 用户自定义标记
@property(nonatomic, assign) NSInteger activityStatus;
/// 房主ID: 默认为房间创建者ID只读
@property(nonatomic, readonly, nonnull) NSString* ownerId;
/// 房主昵称: 默认为房间创建者昵称(只读)。
@property(nonatomic, readonly, nonnull) NSString* ownerName;
/// 房主头像URL: 默认为房间创建者头像URL只读
@property(nonatomic, readonly, nonnull) NSString* ownerAvatarUrl;
/// 房间创建时间(只读)。
@property(nonatomic, readonly) NSUInteger createTime;
/// 累计观看次数
@property(nonatomic, assign) NSInteger viewCount;
/// 房间信息(废弃)
@property(nonatomic, strong, readonly) TUIRoomInfo* roomInfo;
@end
/**
* 直播统计数据
*/
TUIENGINE_EXPORT @interface TUILiveStatisticsData : NSObject
/// 累计观看次数
@property(nonatomic, assign) NSInteger totalViewers;
/// 送礼总个数
@property(nonatomic, assign) NSInteger totalGiftsSent;
/// 送礼总金额
@property(nonatomic, assign) NSInteger totalGiftCoins;
/// 送礼人数
@property(nonatomic, assign) NSInteger totalUniqueGiftSenders;
/// 点赞总数
@property(nonatomic, assign) NSInteger totalLikesReceived;
/// 消息总数
@property(nonatomic, assign) NSInteger totalMessageCount;
/// 直播时长
@property(nonatomic, assign) NSInteger liveDuration;
@end
typedef void (^TUILiveInfoBlock)(TUILiveInfo* _Nonnull liveInfo);
typedef void (^TUILiveInfoListBlock)(NSString* _Nonnull cursor, NSArray<TUILiveInfo*>* _Nonnull liveInfoList);
typedef void (^TUIStopLiveBlock)(TUILiveStatisticsData* _Nonnull statisticData);
typedef void (^TUILiveStatisticsBlock)(TUILiveStatisticsData* _Nonnull statisticData);
@protocol TUILiveListManagerObserver <NSObject>
@optional
/**
* 直播信息改变回调
*
* @param liveInfo 直播间信息
* @param modifyFlag 改变类型
*/
- (void)onLiveInfoChanged:(TUILiveInfo*)liveInfo modifyFlag:(TUILiveModifyFlag)modifyFlag NS_SWIFT_NAME(onLiveInfoChanged(liveInfo:modifyFlag:));
/**
* 直播统计数据改变回调
*
* @param roomId 房间ID
* @param statisticData 直播统计数据
* @param modifyFlag 改变类型
*/
- (void)onLiveStatisticsChanged:(NSString*)roomId statisticData:(TUILiveStatisticsData*)statisticData modifyFlag:(TUILiveStatisticsModifyFlag)modifyFlag NS_SWIFT_NAME(onLiveStatisticsChanged(roomId:statisticData:modifyFlag:));
@end
TUIENGINE_EXPORT @interface TUILiveListManager : NSObject
/**
* 设置事件回调
*
* 您可以通过 TUILiveListManagerObserver 获得直播间事件通知
* @param observer 监听的实例
*/
- (void)addObserver:(id<TUILiveListManagerObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveListManagerObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 主播开播
*
* @param liveInfo 直播信息
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)startLive:(TUILiveInfo*)liveInfo onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(startLive(liveInfo:onSuccess:onError:));
/**
* 主播关播
*
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)stopLive:(TUIStopLiveBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(stopLive(onSuccess:onError:));
/**
* 进入直播间
*
* @param roomId 房间 ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)joinLive:(NSString*)roomId onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(joinLive(roomId:onSuccess:onError:));
/**
* 离开直播间
*
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)leaveLive:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(leaveLive(onSuccess:onError:));
/**
* 修改直播信息
*
* @param liveInfo 直播信息
* @param modifyFlag 修改标记
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)setLiveInfo:(TUILiveInfo*)liveInfo modifyFlag:(TUILiveModifyFlag)modifyFlag onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(setLiveInfo(_:modifyFlag:onSuccess:onError:));
/**
* 获取直播信息
*
* @param roomId 房间ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)getLiveInfo:(NSString*)roomId onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLiveInfo(_:onSuccess:onError:));
/**
* 获取直播统计数据
*
* @param roomId 房间ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)getLiveStatistics:(NSString*)roomId onSuccess:(TUILiveStatisticsBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLiveStatistics(roomId:onSuccess:onError:));
/**
* 获取直播列表
*
* @note 获取直播间列表,单次拉取最大支持返回 50 个。
* @param cursor 列表下标
* @param count 每次拉取个数
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)fetchLiveList:(NSString*)cursor count:(NSInteger)count onSuccess:(TUILiveInfoListBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchLiveList(cursor:count:onSuccess:onError:));
/**
* 开始房间视频流预加载
*
* @param roomId 房间ID。
* @param isMuteAudio 是否静音播放。
* @param view 视频渲染视图。
* @param onPlaying 播放回调。
* @param onLoading 加载回调。
* @param onError 错误回调。
*/
- (void)startPreloadVideoStream:(NSString*)roomId
isMuteAudio:(BOOL)isMuteAudio
view:(TUIVideoView* __nullable)view
onPlaying:(TUIPlayOnPlayingBlock)onPlaying
onLoading:(TUIPlayOnLoadingBlock)onLoading
onError:(TUIPlayOnErrorBlock)onError NS_SWIFT_NAME(startPreloadVideoStream(roomId:isMuteAudio:view:onPlaying:onLoading:onError:));
/**
* 停止房间视频流预加载
*
* @param roomId 房间ID。
*/
- (void)stopPreloadVideoStream:(NSString*)roomId NS_SWIFT_NAME(stopPreloadVideoStream(_:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,791 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomDefine @ TUIKitEngine
* Function: TUIRoomEngine 关键类型定义
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
/////////////////////////////////////////////////////////////////////////////////
//
// 房间、角色相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 1.1 房间类型
*/
typedef NS_ENUM(NSUInteger, TUIRoomType) {
/// 会议类型房间,适用于会议,教育场景,该房间中可以开启自由发言,申请发言、上麦发言等不同模式。
TUIRoomTypeConference = 1,
/// 直播类型房间,适用于直播场景,该房间可以开启自由发言,上麦发言模式。
TUIRoomTypeLive = 2,
};
/**
* 1.2 上麦模式
*/
typedef NS_ENUM(NSUInteger, TUISeatMode) {
/// 自由上麦模式,台下观众可以自由上麦,无需申请。
TUISeatModeFreeToTake = 1,
/// 申请上麦模式,台下观众上麦需要房主或者管理员同意后才能上麦。
TUISeatModeApplyToTake = 2,
};
/**
* 1.3 房间内媒体设备类型
*/
typedef NS_ENUM(NSUInteger, TUIMediaDevice) {
/// 麦克风。
TUIMediaDeviceMicrophone = 1,
/// 摄像头。
TUIMediaDeviceCamera = 2,
/// 屏幕共享。
TUIMediaDeviceScreenSharing = 3,
};
/**
* 1.4 房间内角色类型
*/
typedef NS_ENUM(NSUInteger, TUIRole) {
/// 房主,一般指房间的创建者,房间内最高权限拥有者。
TUIRoleRoomOwner = 0,
/// 房间管理员。
TUIRoleAdministrator = 1,
/// 房间内普通成员。
TUIRoleGeneralUser = 2,
};
/**
* 1.5 房间解散原因
*/
typedef NS_ENUM(NSUInteger, TUIRoomDismissedReason) {
/// 被房主解散。
TUIRoomDismissedReasonByOwner = 1,
/// 被服务器解散。
TUIRoomDismissedReasonByServer = 2,
};
/**
* 1.6 用户的挂起状态
*/
typedef NS_ENUM(NSUInteger, TUISuspendStatus) {
/// 未挂起
TUISuspendStatusNone = 0,
/// 用户进入后台挂起
TUISuspendStatusInBackground = 1 << 0,
/// 用户正在接听电话
TUISuspendStatusInCalling = 1 << 1,
};
/**
* 1.7 用户的设备状态
*/
typedef NS_ENUM(NSUInteger, TUIDeviceStatus) {
/// 当前设备处于打开状态
TUIDeviceStatusOpened = 0,
/// 当前设备处于关闭状态,且是用户主动关闭
TUIDeviceStatusClosedBySelf = 1,
/// 当前设备处于关闭状态,且是被房主/管理员强制关闭
TUIDeviceStatusClosedByAdmin = 2,
};
/**
* 1.8 移动麦上用户的策略
*/
typedef NS_ENUM(NSUInteger, TUIMoveSeatPolicy) {
/// 目标麦位有人时放弃移动(默认策略)​​
TUIMoveSeatPolicyAbortWhenOccupied = 0,
/// 强制替换目标麦位上的用户​​,被替换的用户将会被踢下麦
TUIMoveSeatPolicyForceReplace = 1,
/// ​与目标麦位用户交换位置​​
TUIMoveSeatPolicySwapPosition = 2,
};
/**
* 1.9 锁定麦位标记位
*/
typedef NS_OPTIONS(NSUInteger, TUISeatLockFlag) {
TUISeatLockFlagNone = 0x00,
/// 锁定麦位
TUISeatLockFlagSeat = 0x01 << 0,
/// 锁定麦位摄像头
TUISeatLockFlagVideo = 0x01 << 1,
/// 锁定麦位麦克风
TUISeatLockFlagAudio = 0x01 << 2,
TUISeatLockFlagAll = TUISeatLockFlagSeat | TUISeatLockFlagVideo | TUISeatLockFlagAudio,
};
/////////////////////////////////////////////////////////////////////////////////
//
// 音视频相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 2.1 视频质量
*/
typedef NS_ENUM(NSUInteger, TUIVideoQuality) {
/// 低清360P。
TUIVideoQuality360P = 1,
/// 标清540P。
TUIVideoQuality540P = 2,
/// 高清720P。
TUIVideoQuality720P = 3,
/// 超清1080P。
TUIVideoQuality1080P = 4,
};
/**
* 2.2 音频质量
*/
typedef NS_ENUM(NSUInteger, TUIAudioQuality) {
/// 人声模式。
TUIAudioQualitySpeech = 0,
/// 默认模式。
TUIAudioQualityDefault = 1,
/// 音乐模式。
TUIAudioQualityMusic = 2,
};
/**
* 2.3 视频流类型
*/
typedef NS_ENUM(NSUInteger, TUIVideoStreamType) {
/// 高清摄像头视频流。
TUIVideoStreamTypeCameraStream = 0,
/// 屏幕分享视频流。
TUIVideoStreamTypeScreenStream = 1,
/// 低清摄像头视频流。
TUIVideoStreamTypeCameraStreamLow = 2,
};
/**
* 2.4 音视频状态更改原因(分类: 自己主动修改 或者 被房主、管理员修改)
*/
typedef NS_ENUM(NSUInteger, TUIChangeReason) {
/// 自己操作。
TUIChangeReasonBySelf = 0,
/// 房主或管理员操作。
TUIChangeReasonByAdmin = 1,
};
/**
* 2.5 用户被踢出房间原因(分类: 被主持人或管理员踢出、在其它设备进入房间被踢出 或者 被服务端踢出)
*/
typedef NS_ENUM(NSUInteger, TUIKickedOutOfRoomReason) {
/// 被主持人或管理员踢出。
TUIKickedOutOfRoomReasonByAdmin = 0,
/// 在其它设备进入房间被踢出。
TUIKickedOutOfRoomReasonByLoggedOnOtherDevice = 1,
/// 被服务端踢出。
TUIKickedOutOfRoomReasonByServer = 2,
/// 网络中断超时退房。
TUIKickedOutOfRoomReasonForNetworkDisconnected = 3,
/// 离线期间态进房状发生变化(被踢出房间或者房间已解散)。
TUIKickedOutOfRoomReasonForJoinRoomStatusInvalidDuringOffline = 4,
/// 超过了单设备最大可同时加入的房间个数,导致最早加入的房间自动退出
TUIKickedOutOfRoomReasonForCountOfJoinedRoomsExceedLimit = 5,
};
/**
* 2.6 分辨率模式(横屏 or 竖屏)
*/
typedef NS_ENUM(NSUInteger, TUIResolutionMode) {
/// 横屏。
TUIResolutionModeLandscape = 0,
/// 竖屏。
TUIResolutionModePortrait = 1,
};
/**
* 2.7 屏幕分享捕获源类型
*/
typedef NS_ENUM(NSInteger, TUICaptureSourceType) {
/// 未定义。
TUICaptureSourceTypeUnknown = -1,
/// 窗口。
TUICaptureSourceTypeWindow = 0,
/// 屏幕。
TUICaptureSourceTypeScreen = 1,
};
/////////////////////////////////////////////////////////////////////////////////
//
// 信令请求相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 4.1 请求类型
*/
typedef NS_ENUM(NSUInteger, TUIRequestAction) {
/// 无效请求。
TUIRequestActionInvalidAction = 0,
/// 请求远端用户打开摄像头。
TUIRequestActionOpenRemoteCamera = 1,
/// 请求远端用户打开麦克风。
TUIRequestActionOpenRemoteMicrophone = 2,
/// 请求上麦。
TUIRequestActionTakeSeat = 4,
/// 请求远端用户上麦。
TUIRequestActionRemoteUserOnSeat = 5,
/// 向管理员请求打开本地摄像头。
TUIRequestActionApplyToAdminToOpenLocalCamera = 6,
/// 向管理员请求打开本地麦克风。
TUIRequestActionApplyToAdminToOpenLocalMicrophone = 7,
/// 向管理员请求打开屏幕分享。
TUIRequestActionApplyToAdminToOpenLocalScreenShare = 8,
};
NS_ASSUME_NONNULL_BEGIN
/////////////////////////////////////////////////////////////////////////////////
//
// TUIRoomEngine 核心类型定义
//
/////////////////////////////////////////////////////////////////////////////////
///
/**
* 5.1 房间信息
*
* TUIRoomEngine 只支持字符串房间ID。
*/
TUIENGINE_EXPORT @interface TUIRoomInfo : NSObject
/// 房间ID (创建房间必填参数最大支持48个字节)。
@property(nonatomic, strong, nonnull) NSString* roomId;
/// 房主ID: 默认为房间创建者ID只读
@property(nonatomic, readonly, nonnull) NSString* ownerId;
/// 房主昵称: 默认为房间创建者昵称(只读)。
@property(nonatomic, readonly, nonnull) NSString* ownerName;
/// 房主头像URL: 默认为房间创建者头像URL只读
@property(nonatomic, readonly, nonnull) NSString* ownerAvatarUrl;
/// 房间类型(创建房间可选参数),请参见:{@link TUIRoomType}。
@property(nonatomic, assign) TUIRoomType roomType;
/// 房间名称创建房间可选参数默认房间ID最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* name;
/// 是否禁止打开摄像头(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isCameraDisableForAllUser;
/// 是否禁止打开麦克风(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMicrophoneDisableForAllUser;
/// 是否禁止打开屏幕分享(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isScreenShareDisableForAllUser;
/// 是否禁止发送消息(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisableForAllUser;
/// 是否开启麦位控制。
@property(nonatomic, assign) BOOL isSeatEnabled;
/// 上麦模式(只有开启麦位控制后生效)。
@property(nonatomic, assign) TUISeatMode seatMode;
/// 最大麦位数。
@property(nonatomic, assign) NSInteger maxSeatCount;
/// 房主上麦后常驻麦位。
@property(nonatomic, assign) BOOL keepOwnerOnSeat;
/// 房间创建时间(只读)。
@property(nonatomic, readonly) NSUInteger createTime;
/// 房间内成员数量(只读)。
@property(nonatomic, readonly) NSInteger memberCount;
/// 房间密码。
@property(nonatomic, copy, nonnull) NSString* password;
@end
/**
* 5.2 用户登录信息
*/
TUIENGINE_EXPORT @interface TUILoginUserInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户名称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 用户的等级。
@property(nonatomic, assign) NSUInteger level;
/// 自定义信息。
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSData*>* customInfo
__attribute__((deprecated("use customInfo in TUIUserInfo instead")));
@end
/**
* 5.3 房间内用户信息
*/
TUIENGINE_EXPORT @interface TUIUserInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户名称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 房间内用户昵称最大支持32个字节。
@property(nonatomic, copy, nonnull) NSString* nameCard;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 用户角色类型,会议类型的房间角色仅存在于房间内,退房后再进入角色为普通用户。直播可以在进房前设置,房间不解散,角色依然存在。详情参见:{@link
/// TUIRole}。
@property(nonatomic, assign) TUIRole userRole;
/// 是否有音频流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasAudioStream;
/// 是否有视频流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasVideoStream;
/// 是否有屏幕分享流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasScreenStream;
/// 是否被禁止发送消息,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisabled;
/// 用户等级。
@property(nonatomic, assign) NSUInteger level;
/// 房间成员自定义信息。
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSData*>* roomCustomInfo;
@end
/**
* 5.4 房间内用户信息变更参数key。
*/
typedef NS_OPTIONS(NSUInteger, TUIUserInfoModifyFlag) {
TUIUserInfoModifyFlagNone = 0x00,
/// userRole 参数发生变更。
TUIUserInfoModifyFlagUserRole = 0x01 << 0,
/// nameCard 参数发生变更。
TUIUserInfoModifyFlagNameCard = 0x01 << 1,
};
/**
* 5.5 视频编码参数
*/
TUIENGINE_EXPORT @interface TUIRoomVideoEncoderParams : NSObject
/// 视频质量, 请参见:{@link TUIVideoQuality}。
@property(nonatomic, assign) TUIVideoQuality videoResolution;
/// 分辨率模式, 请参见:{@link TUIResolutionMode}。
@property(nonatomic, assign) TUIResolutionMode resolutionMode;
/// 视频采集帧率。
@property(nonatomic, assign) NSInteger fps;
/// 目标视频码率。
@property(nonatomic, assign) NSInteger bitrate;
@end
/**
* 5.6 房间内座位信息
*/
TUIENGINE_EXPORT @interface TUISeatInfo : NSObject
/// 房间 ID。
@property(nonatomic, copy, nullable) NSString* roomId;
/// 麦位序号。
@property(nonatomic, assign) NSInteger index;
/// 用户ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 用户昵称
@property(nonatomic, copy, nullable) NSString* userName;
/// 房间内用户昵称
@property(nonatomic, copy, nullable) NSString* nameCard;
/// 用户头像URL
@property(nonatomic, copy, nullable) NSString* avatarUrl;
/// 麦位是否被锁定,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isLocked;
/// 麦位是否被禁止打开摄像头,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isVideoLocked;
/// 麦位是否被禁止打开麦克风,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isAudioLocked;
@end
/**
* 5.7 房间内座位的全量信息
*/
TUIENGINE_EXPORT @interface TUISeatFullInfo : NSObject
/// 房间 ID
@property(nonatomic, copy, nonnull) NSString* roomId;
/// 麦位编号
@property(nonatomic, assign) NSInteger seatIndex;
/// 麦位是否被锁定
@property(nonatomic, assign) BOOL isSeatLocked;
/// 麦上用户 ID
@property(nonatomic, copy, nullable) NSString* userId;
/// 麦上用户的昵称
@property(nonatomic, copy, nullable) NSString* userName;
/// 麦上用户的头像 URL
@property(nonatomic, copy, nullable) NSString* userAvatar;
/// 麦上用户的麦克风状态
@property(nonatomic, assign) TUIDeviceStatus userMicrophoneStatus;
/// 麦上用户的摄像头状态
@property(nonatomic, assign) TUIDeviceStatus userCameraStatus;
/// 麦上用户的挂起状态
@property(nonatomic, assign) TUISuspendStatus userSuspendStatus;
/// 麦位的 x 坐标
@property(nonatomic, assign) NSUInteger x;
/// 麦位的 y 坐标
@property(nonatomic, assign) NSUInteger y;
/// 麦位的宽度
@property(nonatomic, assign) NSUInteger width;
/// 麦位的高度
@property(nonatomic, assign) NSUInteger height;
/// 麦位的纵向层级
@property(nonatomic, assign) NSUInteger zorder;
@end
/**
* 5.8 锁定麦位操作参数
*/
TUIENGINE_EXPORT @interface TUISeatLockParams : NSObject
/// 锁定麦位,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockSeat;
/// 锁定麦位摄像头,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockVideo;
/// 锁定麦位麦克风,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockAudio;
/// 锁定麦位标记位,默认值:{@link TUISeatLockFlagAll}。
@property(nonatomic, assign) TUISeatLockFlag lockFlag;
@end
/**
* 5.9 房间内用户音量
*/
TUIENGINE_EXPORT @interface TUIUserVoiceVolume : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 音量 用于承载所有正在说话的用户的音量大小,取值范围 0 - 100。
@property(nonatomic, assign) NSUInteger volume;
@end
/**
* 5.10 信令请求
*/
TUIENGINE_EXPORT @interface TUIRequest : NSObject
/// 请求ID。
@property(nonatomic, readonly, nonnull) NSString* requestId;
/// 请求类型。
@property(nonatomic, assign) TUIRequestAction requestAction;
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户昵称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 房间内用户昵称。
@property(nonatomic, copy, nonnull) NSString* nameCard;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 信令内容。
@property(nonatomic, copy, nonnull) NSString* content;
/// 时间戳。
@property(nonatomic, assign) NSUInteger timestamp;
/// 扩展信息。
@property(nonatomic, copy, nonnull) NSString* extensionInfo;
@end
/**
* 5.11 进房参数
*/
TUIENGINE_EXPORT @interface TUIEnterRoomOptions : NSObject
/// 房间密码。
@property(nonatomic, copy, nonnull) NSString* password;
@end
/**
* 5.12 搜索参数
*/
TUIENGINE_EXPORT @interface TUIUserSearchParam : NSObject
/// 搜索关键字,目前支持用户昵称搜索
@property(nonatomic, copy, nonnull) NSString* keyword;
/// 获取分页列表的下标。
@property(nonatomic, copy, nonnull) NSString* cursor;
@end
/**
* 5.13 房间内文本消息
*/
TUIENGINE_EXPORT @interface TUIRoomTextMessage : NSObject
/// 房间 ID只读
@property(nonatomic, copy, nonnull, readonly) NSString* roomId;
/// 消息发送者(只读)
@property(nonatomic, strong, nonnull, readonly) TUIUserInfo* sender;
/// 消息序列号(只读)
@property(nonatomic, assign, readonly) NSUInteger sequence;
/// 消息时间戳(只读)
@property(nonatomic, assign, readonly) NSTimeInterval timestampInSecond;
/// 消息文本
@property(nonatomic, copy, nonnull) NSString* textContent;
/// 消息扩展字段
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSString*>* extensionInfo;
@end
/**
* 5.14 房间内自定义消息
*/
TUIENGINE_EXPORT @interface TUIRoomCustomMessage : NSObject
/// 房间 ID只读
@property(nonatomic, copy, nonnull, readonly) NSString* roomId;
/// 消息发送者(只读)
@property(nonatomic, strong, nonnull, readonly) TUIUserInfo* sender;
/// 消息序列号(只读)
@property(nonatomic, assign, readonly) NSUInteger sequence;
/// 消息时间戳(只读)
@property(nonatomic, assign, readonly) NSTimeInterval timestampInSecond;
/// 自定义业务 ID
@property(nonatomic, copy, nonnull) NSString* businessId;
/// 自定义业务数据
@property(nonatomic, copy, nonnull) NSString* data;
@end
/////////////////////////////////////////////////////////////////////////////////
//
// TUIRoomEngine 基本类型定义
//
/////////////////////////////////////////////////////////////////////////////////
///
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 屏幕分享采集源信息
*/
TUIENGINE_EXPORT @interface TUIShareTarget : NSObject
/// 采集源的ID对于窗口该字段代表窗口的 ID对于屏幕该字段代表显示器的 ID。
@property(nonatomic, readonly, nonnull) NSString* targetId;
/// 采集源类型。
@property(nonatomic, readonly) TUICaptureSourceType sourceType;
/// 采集源名称。
@property(nonatomic, readonly, nullable) NSString* sourceName;
/// 缩略图。
@property(nonatomic, readonly, nullable) TUIImage* thumbnailImage;
/// 图标。
@property(nonatomic, readonly, nullable) TUIImage* iconImage;
/// 窗口的扩展信息。
@property(nonatomic, readonly, nullable) NSDictionary* extInfo;
@end
#endif
typedef void (^TUIRoomListBlock)(NSArray* _Nonnull list);
typedef void (^TUIRoomInfoBlock)(TUIRoomInfo* _Nullable roomInfo);
typedef void (^TUIRoomListResponseBlock)(NSArray<TUIRoomInfo*>* _Nonnull list);
typedef void (^TUIUserInfoBlock)(TUIUserInfo* _Nullable userInfo);
typedef void (^TUIUserListResponseBlock)(NSArray<TUIUserInfo*>* _Nonnull list,
NSInteger nextSequence);
typedef void (^TUISeatListResponseBlock)(NSArray<TUISeatInfo*>* _Nonnull list);
typedef void (^TUIRequestListResponseBlock)(NSArray<TUIRequest*>* _Nonnull list);
typedef void (^TUIRoomMetadataResponseBlock)(NSDictionary<NSString*, NSString*>* _Nonnull metadata);
typedef void (^TUIUserSearchResponseBlock)(NSArray<TUIUserInfo*>* _Nonnull list, NSString* cursor);
typedef void (^TUISendTextMessageBlock)(TUIRoomTextMessage* _Nonnull message);
typedef void (^TUISendCustomMessageBlock)(TUIRoomCustomMessage* _Nonnull message);
typedef void (^TUIPlayOnPlayingBlock)(NSString* _Nonnull userId);
typedef void (^TUIPlayOnLoadingBlock)(NSString* _Nonnull userId);
typedef void (^TUIPlayOnErrorBlock)(NSString* _Nonnull userId,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIRequestAcceptedBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestRejectedBlock)(NSString* _Nonnull requestId,
NSString* _Nonnull userId,
NSString* _Nonnull message);
typedef void (^TUIRequestCancelledBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestTimeoutBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestErrorBlock)(NSString* _Nonnull requestId,
NSString* _Nonnull userId,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIRequestAcceptedCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
NSString* _Nonnull extensionInfo);
typedef void (^TUIRequestRejectedCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
NSString* _Nonnull message,
NSString* _Nonnull extensionInfo);
typedef void (^TUIRequestCancelledCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestTimeoutCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestSuccessCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestErrorCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIExperimentalAPIResponseBlock)(NSString* _Nonnull jsonData);
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,277 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomDeviceManager @ TUIKitEngine
* Function: 设备测试、管理相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
NS_ASSUME_NONNULL_BEGIN
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 设备类型
*/
typedef NS_ENUM(NSInteger, TUIMediaDeviceType) {
/// 未定义的设备类型
TUIMediaDeviceTypeUnknown = -1,
/// 麦克风类型设备
TUIMediaDeviceTypeAudioInput = 0,
/// 扬声器类型设备
TUIMediaDeviceTypeAudioOutput = 1,
/// 摄像头类型设备
TUIMediaDeviceTypeVideoCamera = 2,
};
/**
* 设备操作
*/
typedef NS_ENUM(NSInteger, TUIMediaDeviceState) {
/// 设备已被插入
TUIMediaDeviceStateAdd = 0,
/// 设备已被移除
TUIMediaDeviceStateRemove = 1,
/// 设备已启用
TUIMediaDeviceStateActive = 2,
};
#endif
#if TARGET_OS_IPHONE
/**
* 音频路由(即声音的播放模式)
*/
typedef NS_ENUM(NSInteger, TUIAudioRoute) {
/// Speakerphone使用扬声器播放即“免提”扬声器位于手机底部声音偏大适合外放音乐。
TUIAudioRouteSpeakerphone = 0,
/// Earpiece使用听筒播放听筒位于手机顶部声音偏小适合需要保护隐私的通话场景。
TUIAudioRouteEarpiece = 1,
};
#endif
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 设备信息
*/
TUIENGINE_EXPORT @interface TUIDeviceInfo : NSObject
/// 设备 ID
@property(nonatomic, copy, nonnull) NSString* deviceId;
/// 设备名称
@property(nonatomic, copy, nonnull) NSString* deviceName;
/// 设备属性
@property(nonatomic, copy, nonnull) NSString* deviceProperties;
typedef void (^TUIDeviceListBlock)(NSArray<TUIDeviceInfo*>* _Nonnull list);
typedef void (^TUIDeviceInfoBlock)(TUIDeviceInfo* _Nullable deviceInfo);
@end
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
@protocol TUIRoomDeviceManagerObserver <NSObject>
/**
* 本地设备添加事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地设备包括摄像头、麦克风以及扬声器添加时SDK 便会抛出此事件回调。
* @param deviceId 设备 ID。
* @param type 设备类型。
* @param state 通断状态0设备已添加1设备已被移除2设备已启用。
*/
- (void)onDeviceChanged:(NSString*)deviceId type:(TUIMediaDeviceType)type state:(TUIMediaDeviceState)state NS_SWIFT_NAME(onDeviceChanged(deviceId:type:state:));
/**
* 测试摄像头画面渲染成功回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试摄像头画面渲染成功时SDK 便会抛出此事件回调。
* @param width 画面的宽度。
* @param height 画面的高度。
*/
- (void)onTestCameraVideoFrameRendered:(NSInteger)width height:(NSInteger)height NS_SWIFT_NAME(onTestCameraVideoFrameRendered(width:height:));
/**
* 测试麦克风时的音量回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试麦克风时SDK 便会抛出此事件回调。
* @param volume 麦克风采集到的音量值取值范围0 - 100。
*/
- (void)onTestMicVolume:(NSInteger)volume NS_SWIFT_NAME(onTestMicVolume(volume:));
/**
* 测试扬声器时的音量回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试扬声器时SDK 便会抛出此事件回调。
* @param volume SDK 提交给扬声器去播放的声音的音量取值范围0 - 100。
*/
- (void)onTestSpeakerVolume:(NSInteger)volume NS_SWIFT_NAME(onTestSpeakerVolume(volume:));
@end
#endif
/////////////////////////////////////////////////////////////////////////////////
//
// 设备管理相关接口
//
/////////////////////////////////////////////////////////////////////////////////
TUIENGINE_EXPORT @interface TUIRoomDeviceManager : NSObject
#if TARGET_OS_IPHONE
/**
* 判断当前是否为前置摄像头(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (BOOL)isFrontCamera NS_SWIFT_NAME(isFrontCamera());
/**
* 切换前置或后置摄像头(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)switchCamera:(BOOL)frontCamera NS_SWIFT_NAME(switchCamera(_:));
/**
* 查询是否支持自动识别人脸位置(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (BOOL)isAutoFocusEnabled NS_SWIFT_NAME(isAutoFocusEnabled());
/**
* 开启自动对焦功能(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 开启后SDK 会自动检测画面中的人脸位置,并将摄像头的焦点始终对焦在人脸位置上。
*/
- (void)enableCameraAutoFocus:(BOOL)enabled NS_SWIFT_NAME(enableCameraAutoFocus(_:));
/**
* 开启/关闭闪光灯,也就是手电筒模式(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)enableCameraTorch:(BOOL)enabled NS_SWIFT_NAME(enableCameraTorch(_:));
/**
* 设置音频路由(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 手机有两个音频播放设备:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
- (void)setAudioRoute:(TUIAudioRoute)route NS_SWIFT_NAME(setAudioRoute(_:));
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_OSX
/**
* 设置事件回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 您可以通过 TUIRoomDeviceManagerObserver 获得各类事件通知。
* @param observer 监听的实例。
*/
- (void)setObserver:(id<TUIRoomDeviceManagerObserver>)observer NS_SWIFT_NAME(setObserver(_:));
/**
* 开始摄像头测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。在测试过程中可以使用 {@link $setCurrentDevice$} 接口切换摄像头。
*/
- (void)startCameraDeviceTest:(TUIVideoView* __nullable)view NS_SWIFT_NAME(startCameraDeviceTest(view:));
/**
* 结束摄像头测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopCameraDeviceTest NS_SWIFT_NAME(stopCameraDeviceTest());
/**
* 开始麦克风测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 该接口可以测试麦克风是否能正常工作,测试到的麦克风采集音量的大小,会以回调的形式通知给您,其中 volume 的取值范围为0 - 100。
* @param interval 麦克风音量的回调间隔。
* @param playback 是否开启回播麦克风声音,开启后用户测试麦克风时会听到自己的声音。
*/
- (void)startMicDeviceTest:(NSInteger)interval playback:(BOOL)playback NS_SWIFT_NAME(startMicDeviceTest(interval:playback:));
/**
* 结束麦克风测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopMicDeviceTest NS_SWIFT_NAME(stopMicDeviceTest());
/**
* 开始扬声器测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 该接口通过播放指定的音频文件,用于测试播放设备是否能正常工作。如果用户在测试时能听到声音,说明播放设备能正常工作。
* @param filePath 声音文件的路径。
*/
- (void)startSpeakerDeviceTest:(NSString*)filePath NS_SWIFT_NAME(startSpeakerDeviceTest(filePath:));
/**
* 结束扬声器测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopSpeakerDeviceTest NS_SWIFT_NAME(stopSpeakerDeviceTest());
/**
* 获取设备列表(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,指定需要获取哪种设备的列表。详见 {@link $TUIMediaDeviceType$} 定义。
*/
- (void)getDevicesList:(TUIMediaDeviceType)type callback:(TUIDeviceListBlock)callback NS_SWIFT_NAME(getDevicesList(type:callback:));
/**
* 设置当前要使用的设备(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,详见 {@link $TUIMediaDeviceType$} 定义。
* @param deviceId 设备ID您可以通过接口 {@link getDevicesList} 获得设备 ID。
*/
- (void)setCurrentDevice:(TUIMediaDeviceType)type deviceId:(NSString*)deviceId NS_SWIFT_NAME(setCurrentDevice(type:deviceId:));
/**
* 获取当前正在使用的设备(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,详见 {@link $TUIMediaDeviceType$} 定义。
*/
- (void)getCurrentDevice:(TUIMediaDeviceType)type callback:(TUIDeviceInfoBlock)callback NS_SWIFT_NAME(getCurrentDevice(type:callback:));
#endif
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,502 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomObserver @ TUIKitEngine
* Function: TUIRoomEngine的事件回调接口
*/
#import <Foundation/Foundation.h>
#import "TUIRoomDefine.h"
#import "TUIRoomDeviceManager.h"
NS_ASSUME_NONNULL_BEGIN
@protocol TUIRoomObserver <NSObject>
@optional
/////////////////////////////////////////////////////////////////////////////////
//
// 错误事件回调
//
///////////////////////////////////////////////////////////////
/**
* 1.1 错误事件回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当发生错误事件时触发,表示 SDK
* 抛出的不可恢复的错误,例如进入房间失败或设备开启失败等。
* @param errorCode 错误码,请参见:{@link TUIError}。
* @param message 错误信息。
*/
- (void)onError:(TUIError)errorCode
message:(NSString *)message NS_SWIFT_NAME(onError(error:message:));
/////////////////////////////////////////////////////////////////////////////////
//
// 登录状态事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 2.1 用户被踢下线
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下线时触发。
* @param message 被踢下线的描述。
*/
- (void)onKickedOffLine:(NSString *)message NS_SWIFT_NAME(onKickedOffLine(message:));
/**
* 2.2 用户凭证超时事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的凭证过期时触发。
*/
- (void)onUserSigExpired NS_SWIFT_NAME(onUserSigExpired());
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 3.1 房间名称更改事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间名称改变时触发。
* @param roomId 房间ID。
* @param roomName 房间名称。
*/
- (void)onRoomNameChanged:(NSString *)roomId
roomName:(NSString *)roomName NS_SWIFT_NAME(onRoomNameChanged(roomId:roomName:));
/**
* 3.2 房间内所有用户麦克风被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的麦克风禁用状态改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onAllUserMicrophoneDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onAllUserMicrophoneDisableChanged(roomId:isDisable:));
/**
* 3.3 房间内所有用户摄像头被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的摄像头禁用状态改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onAllUserCameraDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onAllUserCameraDisableChanged(roomId:isDisable:));
/**
* 3.4 房间内所有用户屏幕分享被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的屏幕共享权限改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onScreenShareForAllUserDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onScreenShareForAllUserDisableChanged(roomId:isDisable:));
/**
* 3.5 房间内用户发送文本消息被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的发送消息权限改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onSendMessageForAllUserDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onSendMessageForAllUserDisableChanged(roomId:isDisable:));
/**
* 3.6 房间被解散事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间被解散时触发。
* @param roomId 房间ID。
* @param reason 房间解散原因,请参见:{@link TUIRoomDismissedReason}。
*/
- (void)onRoomDismissed:(NSString *)roomId
reason:(TUIRoomDismissedReason)reason
NS_SWIFT_NAME(onRoomDismissed(roomId:reason:));
/**
* 3.7 被踢出房间事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户被房主/管理员踢出房间触发。
* @param roomId 房间ID。
* @param reason 被踢出原因。
* @param message 被踢出的描述。
*/
- (void)onKickedOutOfRoom:(NSString *)roomId
reason:(TUIKickedOutOfRoomReason)reason
message:(NSString *)message
NS_SWIFT_NAME(onKickedOutOfRoom(roomId:reason:message:));
/**
* 3.8 房间上麦模式发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间上麦模式发生变化时触发
* @param roomId 房间ID。
* @param seatMode 上麦模式。
*/
- (void)onRoomSeatModeChanged:(NSString *)roomId
seatMode:(TUISeatMode)seatMode
NS_SWIFT_NAME(onRoomSeatModeChanged(roomId:seatMode:));
/**
* 3.9 房间内人员数量发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间内人数发生变化时触发。
* @param roomId 房间ID。
* @param userCount 人员数量。
*/
- (void)onRoomUserCountChanged:(NSString *)roomId
userCount:(NSInteger)userCount
NS_SWIFT_NAME(onRoomUserCountChanged(roomId:userCount:));
/**
* 3.10 房间内自定义信息发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间自定义信息改变时触发。
* @param key 房间自定义信息 key
* @param value 房间自定义信息 value
*/
- (void)onRoomMetadataChanged:(NSString *)key
value:(NSString *)value NS_SWIFT_NAME(onRoomMetadataChanged(key:value:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内用户事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 4.1 远端用户进房事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 远端用户进入房间时触发。
* @param roomId 房间ID。
* @param userInfo 用户信息。
*/
- (void)onRemoteUserEnterRoom:(NSString *)roomId
userInfo:(TUIUserInfo *)userInfo
NS_SWIFT_NAME(onRemoteUserEnterRoom(roomId:userInfo:));
/**
* 4.2 远端用户离开房间事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 远端用户离开房间时触发。
* @param roomId 房间ID。
* @param userInfo 用户信息。
*/
- (void)onRemoteUserLeaveRoom:(NSString *)roomId
userInfo:(TUIUserInfo *)userInfo
NS_SWIFT_NAME(onRemoteUserLeaveRoom(roomId:userInfo:));
/**
* 4.3 房间内用户信息发生变化事件。
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当房间内用户信息发生变化时触发。
* @param userInfo 用户信息。
* @param modifyFlag 用户信息参数变更Key, 可参考{@link TUIUserInfoModifyFlag}。
*/
- (void)onUserInfoChanged:(TUIUserInfo *)userInfo
modifyFlag:(TUIUserInfoModifyFlag)modifyFlag
NS_SWIFT_NAME(onUserInfoChanged(userInfo:modifyFlag:));
/**
* 4.4 用户视频状态发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的视频状态改变时触发。
* @param userId 用户ID。
* @param streamType 视频流类型。
* @param hasVideo 是否有视频流。
* @param reason 视频流发生变化原因 {@link TUIChangeReasonBySelf}: 自己切换 {@link
* TUIChangeReasonByAdmin}: 被管理员切换。
*/
- (void)onUserVideoStateChanged:(NSString *)userId
streamType:(TUIVideoStreamType)streamType
hasVideo:(BOOL)hasVideo
reason:(TUIChangeReason)reason
NS_SWIFT_NAME(onUserVideoStateChanged(userId:streamType:hasVideo:reason:));
/**
* 4.5 用户音频状态发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的音频状态改变时触发。
* @param userId 用户ID。
* @param hasAudio 是否有音频流。
* @param reason 视频流发生变化原因 {@link TUIChangeReasonBySelf}: 自己切换 {@link
* TUIChangeReasonByAdmin}: 被管理员切换。
*/
- (void)onUserAudioStateChanged:(NSString *)userId
hasAudio:(BOOL)hasAudio
reason:(TUIChangeReason)reason
NS_SWIFT_NAME(onUserAudioStateChanged(userId:hasAudio:reason:));
/**
* 4.6 用户音量变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的音量改变时触发。
* @param volumeMap 用户音量字典 key: userId, value: 用于承载所有正在说话的用户的音量大小,取值范围
* 0 - 100。
*/
- (void)onUserVoiceVolumeChanged:(NSDictionary<NSString *, NSNumber *> *)volumeMap
NS_SWIFT_NAME(onUserVoiceVolumeChanged(volumeMap:));
/**
* 4.7 用户文本消息发送能力发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的发送消息权限改变时触发。
* @param userId 用户ID。
* @param isDisable 是否被禁止发送文本消息 {@link YES}: 用户被禁止发送消息 {@link NO}:
* 用户被解除禁止,可以发送消息。
*/
- (void)onSendMessageForUserDisableChanged:(NSString *)roomId
userId:(NSString *)userId
isDisable:(BOOL)muted
NS_SWIFT_NAME(OnSendMessageForUserDisableChanged(roomId:userId:isDisable:));
/**
* 4.8 用户网络状态变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的网络质量改变时触发。
* @param networkList 用户网络状态数组,可参见 {@link TUINetworkInfo} 对象。
*/
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkInfo *> *)networkList
NS_SWIFT_NAME(onUserNetworkQualityChanged(networkList:));
/**
* 4.9 屏幕分享暂停
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享暂停时触发。
* @param reason
* 暂停原因0用户主动暂停1屏幕窗口不可见暂停Mac或设置屏幕分享参数导致的暂停Windows2屏幕分享窗口被最小化导致的暂停
* Windows3屏幕分享窗口被隐藏导致的暂停仅 Windows)4系统停止录屏仅iOS
*/
- (void)onUserScreenCapturePaused:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCapturePaused(reason:));
/**
* 4.10 屏幕分享恢复
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享恢复时触发。
* @param reason
* 恢复原因0用户主动恢复1屏幕窗口恢复可见从而恢复分享Mac或屏幕分享参数设置完毕后自动恢复Windows2屏幕分享窗口从最小化被恢复
* Windows3屏幕分享窗口从隐藏被恢复仅 Windows4系统恢复录屏仅iOS
*/
- (void)onUserScreenCaptureResumed:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCaptureResumed(reason:));
/**
* 4.11 屏幕分享结束
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享停止时触发。
* @param reason
* 停止原因0用户主动停止1屏幕窗口关闭导致停止2表示屏幕分享的显示屏状态变更如接口被拔出、投影模式变更等
*/
- (void)onUserScreenCaptureStopped:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCaptureStopped(reason:));
/**
* 4.12 用户视频大小发生改变
*
* @note 此函数支持直播房间类型({@link TUIRoomTypeLive})。
* 用户视频大小发生改变时触发。
* @param roomId 房间ID。
* @param userId 当本地为观众且与主播成功连麦时该参数表示主播的用户ID否则表示混流ID。
* @param streamType 视频流类型。
* @param width 视频流的宽度。
* @param height 视频流的高度。
*/
- (void)onUserVideoSizeChanged:(NSString *)roomId
userId:(NSString *)userId
streamType:(TUIVideoStreamType)streamType
width:(int)width
height:(int)height
NS_SWIFT_NAME(onUserVideoSizeChanged(roomId:userId:streamType:width:height:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内麦位事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 5.1 麦位列表发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当麦位列表改变时触发。
* @param roomId 当前的房间 ID
* @param seatList 目前麦上最新的用户列表,包含新上麦的用户。
* @param newlySeatedUsers 新上麦的用户列表。
* @param newlyLeftUsers 新下麦的用户列表。
*/
- (void)onSeatListChanged:(NSString *)roomId
seatList:(NSArray<TUISeatFullInfo *> *)seatList
newlySeatedUsers:(NSArray<TUIUserInfo *> *)newlySeatedUsers
newlyLeftUsers:(NSArray<TUIUserInfo *> *)newlyLeftUsers
NS_SWIFT_NAME(onSeatListChanged(roomId:seatList:newlySeatedUsers:newlyLeftUsers:));
/**
* 5.2 收到用户被踢下麦事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下麦时触发。
* @param seatIndex 麦位编号。
* @param operateUser 操作踢人的(主持人/管理员)用户信息。
* @param extensionInfo 扩展信息。
*/
- (void)onKickedOffSeat:(NSInteger)seatIndex
operateUser:(TUIUserInfo *)operateUser
extensionInfo:(NSString *)extensionInfo
NS_SWIFT_NAME(onKickedOffSeat(seatIndex:operateUser:extensionInfo:));
/////////////////////////////////////////////////////////////////////////////////
//
// 请求信令事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 6.1 收到请求消息事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当收到其他用户的请求时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
*/
- (void)onRequestReceived:(TUIRequest *)request NS_SWIFT_NAME(onRequestReceived(request:));
/**
* 6.2 收到请求被取消的事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当其他用户取消请求时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
* @param operateUser 取消信令的用户信息。
*/
- (void)onRequestCancelled:(TUIRequest *)request
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onRequestCancelled(request:operateUser:));
/**
* 6.3 收到请求被其他 管理员/房主 处理事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 收到请求被其他 管理员/房主 处理时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
* @param operateUser 取消信令的用户信息。
*/
- (void)onRequestProcessed:(TUIRequest *)request
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onRequestProcessed(request:operateUser:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内消息回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 7.1 收到了文本消息
*
* @param textMessage 消息对象,可参见 {@link $TUIRoomTextMessage$} 对象。
*/
- (void)onReceiveTextMessage:(TUIRoomTextMessage *)textMessage
NS_SWIFT_NAME(onReceiveTextMessage(textMessage:));
/**
* 7.2 收到了自定义消息
*
* @param customMessage 消息对象,可参见 {@link $TUIRoomCustomMessage$} 对象。
*/
- (void)onReceiveCustomMessage:(TUIRoomCustomMessage *)customMessage
NS_SWIFT_NAME(onReceiveCustomMessage(customMessage:));
/////////////////////////////////////////////////////////////////////////////////
//
// 废弃回调
//
/////////////////////////////////////////////////////////////////////////////////
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
/**
* 本地设备添加事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* 当用户的设备状态发生改变时触发例如用户的麦克风或摄像头被打开或关闭。当本地设备包括摄像头、麦克风以及扬声器添加时SDK
* 便会抛出此事件回调。
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* onDeviceChanged}代替。
* @param deviceId 设备 ID。
* @param type 设备类型。
* @param state 通断状态0设备已添加1设备已被移除2设备已启用。
*/
- (void)onDeviceChanged:(NSString *)deviceId
type:(TUIMediaDeviceType)type
state:(TUIMediaDeviceState)state
NS_SWIFT_NAME(onDeviceChanged(deviceId:type:state:))
__attribute__((deprecated("use onDeviceChanged in TUIRoomDeviceManager instead")));
#endif
/**
* 麦位列表发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当麦位列表改变时触发。
* @deprecated 此回调在 v3.5 版本开始废弃,未来会被回收,请使用 onSeatListChanged(roomId, seatList,
* newlySeatedUsers, newlyLeftUsers) 代替。
* @param seatList 目前麦上最新的用户列表,包含新上麦的用户。
* @param seatedList 新上麦的用户列表。
* @param leftList 新下麦的用户列表。
*/
- (void)onSeatListChanged:(NSArray<TUISeatInfo *> *)seatList
seated:(NSArray<TUISeatInfo *> *)seatedList
left:(NSArray<TUISeatInfo *> *)leftList
NS_SWIFT_NAME(onSeatListChanged(seatList:seated:left:)) __attribute__((deprecated(
"use onSeatListChanged(roomId:seatList:newlySeatedUsers:newlyLeftUsers:) instead")));
/**
* 收到用户被踢下麦事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下麦时触发。
* @deprecated 此回调在 v3.5 版本开始废弃,未来会被回收,请使用 onKickedOffSeat(seatIndex,
* operateUser, extensionInfo) 代替。
* @param seatIndex 麦位编号。
* @param operateUser 操作踢人的(主持人/管理员)用户信息。
*/
- (void)onKickedOffSeat:(NSInteger)seatIndex
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onKickedOffSeat(seatIndex:operateUser:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>22G91</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>RTCRoomEngine</string>
<key>CFBundleIdentifier</key>
<string>com.tencent.cloud.roomengine</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>RTCRoomEngine</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>3.5.0.955</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>iPhoneOS</string>
</array>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>21C52</string>
<key>DTPlatformName</key>
<string>iphoneos</string>
<key>DTPlatformVersion</key>
<string>15.2</string>
<key>DTSDKBuild</key>
<string>21C52</string>
<key>DTSDKName</key>
<string>iphoneos15.2</string>
<key>DTXcode</key>
<string>1510</string>
<key>DTXcodeBuild</key>
<string>15C65</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
<key>NSPrincipalClass</key>
<string></string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,6 @@
framework module RTCRoomEngine {
umbrella header "RTCEngine.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,204 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
*/
#import "TUIRoomEngine.h"
@class TRTCCloud;
@class TXDeviceManager;
@class TXAudioEffectManager;
@class TXBeautyManager;
NS_ASSUME_NONNULL_BEGIN
@interface TUIRoomEngine (deprecated)
/////////////////////////////////////////////////////////////////////////////////
//
// 弃用接口(建议使用对应的新接口)
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 获得设备管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXDeviceManager *)getDeviceManager NS_SWIFT_NAME(getDeviceManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 获得音效管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXAudioEffectManager *)getAudioEffectManager NS_SWIFT_NAME(getAudioEffectManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 获得美颜管理对象
*
* @deprecated v1.5.0 版本开始不推荐使用。
*/
- (TXBeautyManager *)getBeautyManager NS_SWIFT_NAME(getBeautyManager())
__attribute__((deprecated("Deprecated from v1.5.0")));
/**
* 设置本地用户视频渲染的视图控件
*
* @deprecated v1.6.1 版本开始不推荐使用。
*/
- (void)setLocalVideoView:(TUIVideoStreamType)streamType
view:(TUIVideoView *__nullable)view
NS_SWIFT_NAME(setLocalVideoView(streamType:view:))
__attribute__((deprecated("Deprecated from v1.6.1")));
#if TARGET_OS_IPHONE
/**
* 切换前置或后置摄像头(仅适用于移动端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* switchCamera}代替。
* @return 0操作成功负数操作失败。
*/
- (NSInteger)switchCamera:(BOOL)frontCamera NS_SWIFT_NAME(switchCamera(frontCamera:))
__attribute__((deprecated("Deprecated from v2.0")));
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
/**
* 获取设备列表(仅适用于桌面端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* getDevicesList}代替。
* @param type 设备类型,指定需要获取哪种设备的列表。详见 TXMediaDeviceType 定义。
* @note
* - 使用完毕后请调用 release 方法释放资源,这样可以让 SDK 维护 ITXDeviceCollection 对象的生命周期。
* - 不要使用 delete 释放返回的 Collection 对象delete ITXDeviceCollection* 指针会导致异常崩溃。
* - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera。
* - 此接口只支持 Mac 和 Windows 平台。
*/
- (NSArray<TXMediaDeviceInfo *> *_Nullable)getDevicesList:(TUIMediaDeviceType)type
NS_SWIFT_NAME(getDevicesList(type:)) __attribute__((deprecated("Deprecated from v2.0")));
/**
* 设置当前要使用的设备(仅适用于桌面端)
*
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* setCurrentDevice}代替。 设置当前要使用的设备后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onDeviceChanged} 通知您。
* @param type 设备类型,详见 TXMediaDeviceType 定义。
* @param deviceId 设备ID您可以通过接口 {@link getDevicesList} 获得设备 ID。
* @return 0操作成功负数操作失败。
*/
- (NSInteger)setCurrentDevice:(TUIMediaDeviceType)type
deviceId:(NSString *)deviceId NS_SWIFT_NAME(setCurrentDevice(type:deviceId:))
__attribute__((deprecated("Deprecated from v2.0")));
#endif
/**
* 调用实验性接口
*
* @deprecated v3.0 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* @param jsonStr 接口信息。
* @return 返回结果
*/
+ (id)callExperimentalAPI:(NSString *)jsonStr NS_SWIFT_NAME(callExperimentalAPI(jsonStr:))
__attribute__((deprecated("Deprecated from v3.0")));
/**
* 上麦(上麦发言模式下,需要申请)
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 上麦成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link onSeatListChanged}
* 通知房间内用户。
* @note 开启上麦发言模式时,需要向主持人或管理员发起申请才允许上麦。
* 开启自由发言模式,直播场景可以自由上麦,上麦后开麦发言,会议场景无需调用该接口,即可开麦发言。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param timeout 超时时间,单位秒,如果设置为 0SDK 不会做超时检测,也不会触发超时回调。
* @param onAccepted 邀请被接受的回调。
* @param onRejected 邀请被拒绝的回调。
* @param onCancelled 邀请被取消的回调。
* @param onTimeout 邀请超时未处理的回调。
* @param onError 邀请发生错误的回调。
* @return TUIRequest 请求体。
*/
- (TUIRequest *)takeSeat:(NSInteger)seatIndex
timeout:(NSTimeInterval)timeout
onAccepted:(TUIRequestAcceptedBlock)onAccepted
onRejected:(TUIRequestRejectedBlock)onRejected
onCancelled:(TUIRequestCancelledBlock)onCancelled
onTimeout:(TUIRequestTimeoutBlock)onTimeout
onError:(TUIRequestErrorBlock)onError
NS_SWIFT_NAME(takeSeat(_:timeout:onAccepted:onRejected:onCancelled:onTimeout:onError:));
/**
* 主持人/管理员 邀请用户上麦
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 接口调用成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onRequestReceived} 通知被邀请用户。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param userId 用户ID。
* @param timeout 超时时间,单位秒,如果设置为 0SDK 不会做超时检测,也不会触发超时回调。
* @param onAccepted 邀请被接受的回调。
* @param onRejected 邀请被拒绝的回调。
* @param onCancelled 邀请被取消的回调。
* @param onTimeout 邀请超时未处理的回调。
* @param onError 邀请发生错误的回调。
* @return TUIRequest 请求体。
*/
- (TUIRequest *)takeUserOnSeatByAdmin:(NSInteger)seatIndex
userId:(NSString *)userId
timeout:(NSTimeInterval)timeout
onAccepted:(TUIRequestAcceptedBlock)onAccepted
onRejected:(TUIRequestRejectedBlock)onRejected
onCancelled:(TUIRequestCancelledBlock)onCancelled
onTimeout:(TUIRequestTimeoutBlock)onTimeout
onError:(TUIRequestErrorBlock)onError
NS_SWIFT_NAME(takeUserOnSeatByAdmin(_:userId:timeout:onAccepted:onRejected:onCancelled:onTimeout:onError:));
/**
* 主持人/管理员 将用户踢下麦
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 接口调用成功后,SDK会通过 {@link TUIRoomObserver} 中的 {@link
* onSeatListChanged} 通知房间内用户。
* @param seatIndex 麦位编号。未开启麦位、不关心麦位序列的情况下,填-1即可。
* @param userId 用户ID。
* @param onSuccess 成功回调。
* @param onError 失败回调。
*/
- (void)kickUserOffSeatByAdmin:(NSInteger)seatIndex
userId:(NSString *)userId
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(kickUserOffSeatByAdmin(_:userId:onSuccess:onError:));
/**
* 回复请求
*
* @deprecated v3.5 版本开始不推荐使用
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* @note 在收到信令请求时,可以使用此接口来回复接收到的请求。
* @param requestId 请求ID(发送请求的接口返回或者OnRequestReceived事件通知)。
* @param agree 是否同意 YES: 同意请求, NO: 拒绝请求。
* @param onSuccess 成功回调。
* @param onError 失败回调。
*/
- (void)responseRemoteRequest:(NSString *)requestId
agree:(BOOL)agree
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(responseRemoteRequest(_:agree:onSuccess:onError:));
NS_ASSUME_NONNULL_END
@end

View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2025 Tencent. All Rights Reserved.
*
*/
#import <RTCRoomEngine/TUICommonDefine.h>
#import <RTCRoomEngine/TUIEngineSymbolExport.h>
#import <RTCRoomEngine/TUIRoomDeviceManager.h>
#import <RTCRoomEngine/TUILiveListManager.h>
#import <RTCRoomEngine/TUILiveConnectionManager.h>
#import <RTCRoomEngine/TUILiveBattleManager.h>
#import <RTCRoomEngine/TUILiveLayoutManager.h>
#import <RTCRoomEngine/TUILiveGiftManager.h>
#import <RTCRoomEngine/TUIConferenceListManager.h>
#import <RTCRoomEngine/TUIConferenceInvitationManager.h>
#import <RTCRoomEngine/DeprecatedRoomEngineAPI.h>
#import <RTCRoomEngine/TUIRoomEngine.h>
#import <RTCRoomEngine/TUIRoomDefine.h>
#import <RTCRoomEngine/TUIRoomObserver.h>
#import <RTCRoomEngine/TUICallEngine.h>
#import <RTCRoomEngine/TUICallDefine.h>
#import <RTCRoomEngine/TUICallObserver.h>

View File

@@ -0,0 +1,217 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallDefine 关键类型定义
* Description: 定义枚举或常量,例如:通话类型,角色等。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
@class TUIOfflinePushInfo;
typedef void (^TUICallSucc)(void);
typedef void (^TUICallFail)(int code, NSString *_Nullable errMsg);
/// TUICallEngine 版本号
static const NSString *_Nullable TUICALL_VERSION = @"0.0.0.0";
/// 您当前未购买音视频通话能力套餐请前往控制台开通免费体验https://console.cloud.tencent.com/im/detail或加购正式版https://buy.cloud.tencent.com/avc
static const int ERROR_PACKAGE_NOT_PURCHASED = -1001;
/// 您当前购买的套餐不支持该能力请先购买https://buy.cloud.tencent.com/avc
static const int ERROR_PACKAGE_NOT_SUPPORTED = -1002;
/// TIM SDK 版本过低,请升级 TIM SDK 版本 >= 6.6
static const int ERROR_TIM_VERSION_OUTDATED = -1003;
/// 获取权限失败,当前未授权音 / 视频权限,请查看是否开启设备权限
static const int ERROR_PERMISSION_DENIED = -1101;
/// 未调用 initTUICallEngine API 使用需在 init 之后
static const int ERROR_INIT_FAIL = -1201;
/// 参数错误
static const int ERROR_PARAM_INVALID = -1202;
/// 当前状态不支持调用
static const int ERROR_REQUEST_REFUSED = -1203;
/// 当前方法正在执行中,请勿重复调用
static const int ERROR_REQUEST_REPEATED = -1204;
/// 当前通话场景,不支持该功能
static const int ERROR_SCENE_NOT_SUPPORTED = -1205;
/// 信令发送失败
static const int ERROR_SIGNALING_SEND_FAIL = -1401;
/// 通话类型:未知、音频、视频
typedef NS_ENUM(NSUInteger, TUICallMediaType) {
TUICallMediaTypeUnknown,
TUICallMediaTypeAudio,
TUICallMediaTypeVideo,
};
/// 通话角色:未知、主叫、被叫
typedef NS_ENUM(NSUInteger, TUICallRole) {
TUICallRoleNone,
TUICallRoleCall,
TUICallRoleCalled,
};
/// 通话状态:空闲、等待中、接听中
typedef NS_ENUM(NSUInteger, TUICallStatus) {
TUICallStatusNone,
TUICallStatusWaiting,
TUICallStatusAccept,
};
typedef NS_ENUM(NSUInteger, TUICallScene) {
TUICallSceneNone = 0,
TUICallSceneGroup = 1,
TUICallSceneMulti = 2,
TUICallSceneSingle = 3,
};
typedef NS_ENUM(NSUInteger, TUICallIOSOfflinePushType) {
TUICallIOSOfflinePushTypeAPNs = 0,
TUICallIOSOfflinePushTypeVoIP = 1,
};
typedef NS_ENUM(NSUInteger, TUICallEndReason) {
TUICallEndReasonUnknown = 0,
TUICallEndReasonHangup = 1,
TUICallEndReasonReject = 2,
TUICallEndReasonNoResponse = 3,
TUICallEndReasonOffline = 4,
TUICallEndReasonLineBusy = 5,
TUICallEndReasonCanceled = 6,
TUICallEndReasonOtherDeviceAccepted = 7,
TUICallEndReasonOtherDeviceReject = 8,
TUICallEndReasonEndByServer = 9,
};
// 通话结果
typedef NS_ENUM(NSUInteger, TUICallResultType) {
TUICallResultTypeUnknown,
TUICallResultTypeMissed,
TUICallResultTypeIncoming,
TUICallResultTypeOutgoing,
};
/**
* 扩展参数
*/
NS_ASSUME_NONNULL_BEGIN
TUIENGINE_EXPORT @interface TUICallParams : NSObject
@property(nonatomic, strong) TUIRoomId *roomId;
@property(nonatomic, strong) TUIOfflinePushInfo *offlinePushInfo;
@property(nonatomic, assign) int timeout;
@property(nonatomic, copy) NSString *userData;
@property(nonatomic, copy) NSString *chatGroupId;
@property(nonatomic, assign) BOOL isEphemeralCall;
@end
/**
* 扩展信息
*/
TUIENGINE_EXPORT @interface TUICallObserverExtraInfo : NSObject
@property(nonatomic, strong) TUIRoomId *roomId;
@property(nonatomic, assign) TUICallRole role;
@property(nonatomic, copy) NSString *userData;
@property(nonatomic, copy) NSString *chatGroupId;
@property(nonatomic, assign) BOOL isEphemeralCall;
@end
/**
* 离线推送自定义类
*/
TUIENGINE_EXPORT @interface TUIOfflinePushInfo : NSObject
@property(nonatomic, copy) NSString *title;
@property(nonatomic, copy) NSString *desc;
@property(nonatomic, assign) BOOL ignoreIOSBadge;
@property(nonatomic, assign) BOOL enableIOSBackgroundNotification;
@property(nonatomic, copy) NSString *iOSInterruptionLevel;
@property(nonatomic, copy) NSString *iOSImage;
@property(nonatomic, copy) NSString *iOSSound;
@property(nonatomic, copy) NSString *AndroidSound;
@property(nonatomic, copy) NSString *AndroidOPPOChannelID;
@property(nonatomic, copy) NSString *OPPOCategory;
@property(nonatomic, assign) NSInteger OPPONotifyLevel;
@property(nonatomic, copy) NSString *AndroidFCMChannelID;
@property(nonatomic, copy) NSString *fcmImage;
@property(nonatomic, assign) NSInteger AndroidVIVOClassification;
@property(nonatomic, copy) NSString *VIVOCategory;
@property(nonatomic, copy) NSString *AndroidXiaoMiChannelID;
@property(nonatomic, copy) NSString *AndroidHuaWeiCategory;
@property(nonatomic, copy) NSString *huaweiImage;
@property(nonatomic, copy) NSString *honorImportance;
@property(nonatomic, copy) NSString *honorImage;
@property(nonatomic, assign) BOOL isDisablePush;
@property(nonatomic, assign) TUICallIOSOfflinePushType iOSPushType;
@property(nonatomic, copy) NSString *extraInfo;
@end
/**
* 通话记录
*/
TUIENGINE_EXPORT @interface TUICallRecords : NSObject
@property(nonatomic, copy) NSString *callId;
@property(nonatomic, copy) NSString *inviter;
@property(nonatomic, strong) NSArray *inviteList;
@property(nonatomic, copy) NSString *groupId;
@property(nonatomic, assign) TUICallScene scene;
@property(nonatomic, assign) TUICallMediaType mediaType;
@property(nonatomic, assign) TUICallRole role;
@property(nonatomic, assign) TUICallResultType result;
@property(nonatomic, assign) NSTimeInterval beginTime;
@property(nonatomic, assign) NSTimeInterval totalTime;
@end
/// 通话扩展参数
@interface TUICallRecentCallsFilter : NSObject
@property(nonatomic, assign) TUICallResultType result;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,282 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallEngine
* Function: TUICallEngine's main feature API
* Version: <:Version:>
*/
#import <Foundation/Foundation.h>
#import "TUICallObserver.h"
#import "TUICallDefine.h"
#import "TUICommonDefine.h"
@class TRTCCloud;
NS_ASSUME_NONNULL_BEGIN
TUIENGINE_EXPORT @interface TUICallEngine : NSObject
/**
* 创建 TUICallEngine 实例(单例模式)
*/
+ (TUICallEngine *)createInstance NS_SWIFT_NAME(createInstance());
/**
* 销毁 TUICallEngine 实例(单例模式)
*/
+ (void)destroyInstance NS_SWIFT_NAME(destroyInstance());
/**
* 初始化函数,请在使用所有功能之前先调用该函数,以便完成包含通话服务鉴权在内初始化动作。
*
* @param sdkAppId 应用ID
* @param userId 当前用户的 ID
* @param userSig 安全保护签名
*/
- (void)init:(int)sdkAppId userId:(NSString *)userId userSig:(NSString *)userSig succ:(TUICallSucc)succ fail:(TUICallFail)fail;
/**
* 添加回调接口您可以通过这个接口监听TUICallObserver相关的事件回调。
*/
- (void)addObserver:(id<TUICallObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*/
- (void)removeObserver:(id<TUICallObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起 1VN 通话
*
* @param userIdList 目标用户的 userId 列表
* @param callMediaType 通话的媒体类型,例如:视频通话、语音通话
* @param params 通话参数扩展字段,例如:离线推送自定义内容
*/
- (void)calls:(NSArray<NSString *> *)userIdList callMediaType:(TUICallMediaType)callMediaType params:(TUICallParams *_Nullable)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(calls(userIdList:callMediaType:params:succ:fail:));
/**
* 接受当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数接听来电。
*/
- (void)accept:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(accept(succ:fail:));
/**
* 拒绝当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数拒绝来电。
*/
- (void)reject:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(reject(succ:fail:));
/**
* 挂断当前通话,当您处于通话中,可以调用该函数结束通话。
*/
- (void)hangup:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(hangup(succ:fail:));
/**
* 忽略当前通话,当您作为被叫收到 onCallReceived() 的回调时,可以调用该函数忽略来电,此时主叫会收到 onUserLineBusy 的回调。
* 备注:如果您的业务中存在直播、会议等场景,在直播/会议中的情况时,也可以调用这个函数来忽略此次来电。
*/
- (void)ignore:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(ignore(succ:fail:));
/**
* 主动加入此次多人通话。
*
* @param callId 此次通话的唯一ID
*/
- (void)join:(NSString *)callId succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(join(callId:succ:fail:));
/**
* 邀请用户加入此次群组通话。
* 使用场景:一个群组通话中的用户主动邀请其他人时使用。
*
* @param userIdList 目标用户的 userId 列表
* @param params 通话参数扩展字段,例如:离线推送自定义内容
*/
- (void)inviteUser:(NSArray<NSString *> *)userIdList params:(TUICallParams *)params succ:(void (^)(NSArray<NSString *> *userIdList))succ fail:(TUICallFail)fail NS_SWIFT_NAME(inviteUser(userIdList:params:succ:fail:));
/**
* 切换通话媒体类型,比如视频通话切音频通话
*
* @param callMediaType 通话的媒体类型,例如:视频通话、语音通话
*/
- (void)switchCallMediaType:(TUICallMediaType)callMediaType NS_SWIFT_NAME(switchCallMediaType(_:));
/**
* 开始订阅远端用户视频流
*
* @param userId 目标用户的 userId
* @param videoView 待渲染的视图
*/
- (void)startRemoteView:(NSString *)userId
videoView:(TUIVideoView *)videoView
onPlaying:(void (^)(NSString *userId))onPlaying
onLoading:(void (^)(NSString *userId))onLoading
onError:(void (^)(NSString *userId, int code, NSString *errMsg))onError NS_SWIFT_NAME(startRemoteView(userId:videoView:onPlaying:onLoading:onError:));
/**
* 停止订阅远端用户视频流
*
* @param userId 目标用户的 userId
*/
- (void)stopRemoteView:(NSString *)userId NS_SWIFT_NAME(stopRemoteView(userId:));
/**
* 开启摄像头
*
* @param camera 前置/后置 摄像头
* @param videoView 待渲染的视图
*/
- (void)openCamera:(TUICamera)camera videoView:(TUIVideoView *)videoView succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(openCamera(_:videoView:succ:fail:));
/**
* 关闭摄像头
*/
- (void)closeCamera NS_SWIFT_NAME(closeCamera());
/**
* 切换前后摄像头
*
* @param camera 前置/后置 摄像头
*/
- (void)switchCamera:(TUICamera)camera NS_SWIFT_NAME(switchCamera(_:));
/**
* 打开麦克风
*/
- (void)openMicrophone:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(openMicrophone(succ:fail:));
/**
* 关闭麦克风
*/
- (void)closeMicrophone NS_SWIFT_NAME(closeMicrophone());
/**
* 选择音频播放设备(听筒/扬声器)
*
* @param device 听筒/扬声器
*/
- (void)selectAudioPlaybackDevice:(TUIAudioPlaybackDevice)device NS_SWIFT_NAME(selectAudioPlaybackDevice(_:));
/**
* 设置用户的昵称、头像
*
* @param nickname 用户昵称
* @param avatar 用户头像(格式为 URL
*/
- (void)setSelfInfo:(NSString *_Nullable)nickname avatar:(NSString *_Nullable)avatar succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setSelfInfo(nickname:avatar:succ:fail:));
/**
* 开启/关闭 TUICallEngine 的多设备登录模式 (尊享版套餐支持)
*
* @param enable 开启:true; 关闭:false
*/
- (void)enableMultiDeviceAbility:(BOOL)enable succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(enableMultiDeviceAbility(enable:succ:fail:));
/**
* 设置用户画面的渲染模式
*
* @param userId 指定用户的 ID
* @param params 画面渲染参数:画面的旋转角度、填充模式,详见 {@link TUICommonDefine.VideoRenderParams}.
*/
- (void)setVideoRenderParams:(NSString *)userId params:(TUIVideoRenderParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setVideoRenderParams(userId:params:succ:fail:));
/**
* 设置视频编码器的编码参数
* 该设置能够决定远端用户看到的画面质量,同时也能决定云端录制出的视频文件的画面质量。
*
* @param params 编码参数:画面的分辨率、视频宽高比模式,详见 {@link TUICommonDefine.VideoEncoderParams}.
*/
- (void)setVideoEncoderParams:(TUIVideoEncoderParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setVideoEncoderParams(_:succ:fail:));
/**
* 设置美颜
*/
- (void)setBeautyLevel:(CGFloat)level succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(setBeautyLevel(_:succ:fail:));
/**
* 高级接口,获得当前通话业务中的 TRTCCloud 实例
*
* @return TRTCCloud 实例
*/
- (TRTCCloud *)getTRTCCloudInstance NS_SWIFT_NAME(getTRTCCloudInstance());
/**
* 调用实验性接口
*
* @param jsonObject json 数据
*/
- (void)callExperimentalAPI:(NSString *)jsonObject NS_SWIFT_NAME(callExperimentalAPI(jsonObject:));
/**
* 查询通话记录
*
* @param filter 查询过滤条件
*/
- (void)queryRecentCalls:(TUICallRecentCallsFilter *)filter succ:(void (^)(NSArray<TUICallRecords *> *callRecords))succ fail:(void (^)(void))fail NS_SWIFT_NAME(queryRecentCalls(filter:succ:fail:));
/**
* 删除通话记录
*
* @param callIdList 待删除记录的callId列表
*/
- (void)deleteRecordCalls:(NSArray<NSString *> *)callIdList succ:(void (^)(NSArray<NSString *> *succList))succ fail:(void (^)(void))fail NS_SWIFT_NAME(deleteRecordCalls(_:succ:fail:));
/**
* 设置视频通话虚化效果
*
* @param level 虚化等级: 0-关闭虚化效果; 1-low; 2-middle; 3-high
*/
- (void)setBlurBackground:(NSInteger)level fail:(TUICallFail)fail NS_SWIFT_NAME(setBlurBackground(_:fail:));
/**
* 设置视频通话图片背景
*
* @param imagePath 图片本地路径,为空则关闭背景图片效果; 不为空则开启图片背景效果
*/
- (void)setVirtualBackground:(NSString *)imagePath fail:(TUICallFail)fail NS_SWIFT_NAME(setVirtualBackground(_:fail:));
/**
* 此接口已于2023年9月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)call:(TUIRoomId *)roomId
userId:(NSString *)userId
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(call(roomId:userId:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2025年1月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)call:(NSString *)userId callMediaType:(TUICallMediaType)callMediaType params:(TUICallParams *)params succ:(TUICallSucc)succ fail:(TUICallFail)fail NS_SWIFT_NAME(call(userId:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2023年9月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)groupCall:(TUIRoomId *)roomId
groupId:(NSString *)groupId
userIdList:(NSArray<NSString *> *)userIdList
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(groupCall(roomId:groupId:userIdList:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2025年1月废弃。若您刚刚开始接入TUICallEngine请优先使用calls其功能更强大稳定性更佳。
*/
- (void)groupCall:(NSString *)groupId
userIdList:(NSArray<NSString *> *)userIdList
callMediaType:(TUICallMediaType)callMediaType
params:(TUICallParams *)params
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(groupCall(groupId:userIdList:callMediaType:params:succ:fail:)) __attribute__((deprecated));
/**
* 此接口已于2015年1月废弃。若您刚刚开始接入TUICallEngine请优先使用join。
*/
- (void)joinInGroupCall:(TUIRoomId *)roomId
groupId:(NSString *)groupId
callMediaType:(TUICallMediaType)callMediaType
succ:(TUICallSucc)succ
fail:(TUICallFail)fail NS_SWIFT_NAME(joinInGroupCall(roomId:groupId:callMediaType:succ:fail:)) __attribute__((deprecated));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,210 @@
/**
* Copyright (c) 2022 Tencent. All rights reserved.
* Module: TUICallObserver
* Function: TUICallObserver 主功能接口
* Version: <:Version:>
*/
#import <Foundation/Foundation.h>
#import "TUICallDefine.h"
@class TUIRoomId, TUINetworkQualityInfo;
NS_ASSUME_NONNULL_BEGIN
@protocol TUICallObserver <NSObject>
@optional
/**
* 通话过程中错误回调
*
* @param code 错误码
* @param message 错误信息
*/
- (void)onError:(int)code message:(NSString *_Nullable)message NS_SWIFT_NAME(onError(code:message:));
/**
* 收到通话请求的回调(仅被叫收到)
*
* @param callId 此次通话的唯一 ID
* @param callerId 主叫 ID邀请方
* @param calleeIdList 被叫 ID 列表(被邀请方)
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param info 扩展信息
*/
- (void)onCallReceived:(NSString *)callId
callerId:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
mediaType:(TUICallMediaType)mediaType
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:mediaType:info:));
/**
* 通话接通的回调(主叫和被叫都可以收到)
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param info 扩展信息
*/
- (void)onCallBegin:(NSString *)callId mediaType:(TUICallMediaType)mediaType info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallBegin(callId:mediaType:info:));
/**
* 通话结束的回调(主叫和被叫都可以收到)
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param reason 通话结束原因
* @param userId 结束通话的用户 ID
* @param totalTime 此次通话的时长
* @param info 扩展信息
*/
- (void)onCallEnd:(NSString *)callId
mediaType:(TUICallMediaType)mediaType
reason:(TUICallEndReason)reason
userId:(NSString *)userId
totalTime:(float)totalTime
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallEnd(callId:mediaType:reason:userId:totalTime:info:));
/**
* 通话取消的回调
*
* @param callId 此次通话的唯一 ID
* @param mediaType 通话的媒体类型,比如视频通话、语音通话
* @param reason 通话结束原因
* @param userId 结束通话的用户 ID
* @param info 扩展信息
*/
- (void)onCallNotConnected:(NSString *)callId
mediaType:(TUICallMediaType)mediaType
reason:(TUICallEndReason)reason
userId:(NSString *)userId
info:(TUICallObserverExtraInfo *)info NS_SWIFT_NAME(onCallNotConnected(callId:mediaType:reason:userId:info:));
/**
* 通话媒体类型发生改变的回调
*
* @param oldCallMediaType 旧的通话类型
* @param newCallMediaType 新的通话类型
*/
- (void)onCallMediaTypeChanged:(TUICallMediaType)oldCallMediaType newCallMediaType:(TUICallMediaType)newCallMediaType NS_SWIFT_NAME(onCallMediaTypeChanged(oldCallMediaType:newCallMediaType:));
/**
* xxxx 用户拒绝通话的回调
*
* @param userId 拒绝用户的 ID
*/
- (void)onUserReject:(NSString *)userId NS_SWIFT_NAME(onUserReject(userId:));
/**
* xxxx 用户不响应的回调
*
* @param userId 无响应用户的 ID
*/
- (void)onUserNoResponse:(NSString *)userId NS_SWIFT_NAME(onUserNoResponse(userId:));
/**
* xxxx 用户忙线的回调
*
* @param userId 忙线用户的 ID
*/
- (void)onUserLineBusy:(NSString *)userId NS_SWIFT_NAME(onUserLineBusy(userId:));
/**
* 当用户被邀请加入通话时的回调
*
* @param userId 被邀请的用户 ID
*/
- (void)onUserInviting:(NSString *)userId NS_SWIFT_NAME(onUserInviting(userId:));
/**
* xxxx 用户加入通话的回调
*
* @param userId 加入当前通话的用户 ID
*/
- (void)onUserJoin:(NSString *)userId NS_SWIFT_NAME(onUserJoin(userId:));
/**
* xxxx 用户离开通话的回调
*
* @param userId 离开当前通话的用户 ID
*/
- (void)onUserLeave:(NSString *)userId NS_SWIFT_NAME(onUserLeave(userId:));
/**
* xxxx 远端用户是否有视频流的回调
*
* @param userId 通话用户 ID
* @param isVideoAvailable 用户视频是否可用
*/
- (void)onUserVideoAvailable:(NSString *)userId isVideoAvailable:(BOOL)isVideoAvailable NS_SWIFT_NAME(onUserVideoAvailable(userId:isVideoAvailable:));
/**
* xxxx 远端用户是否有音频流的回调
*
* @param userId 通话用户 ID
* @param isAudioAvailable 用户音频是否可用
*/
- (void)onUserAudioAvailable:(NSString *)userId isAudioAvailable:(BOOL)isAudioAvailable NS_SWIFT_NAME(onUserAudioAvailable(userId:isAudioAvailable:));
/**
* 所有用户音量大小的反馈回调
*
* @param volumeMap 音量表,根据每个 userId 可以获取对应用户的音量大小音量范围0-100
*/
- (void)onUserVoiceVolumeChanged:(NSDictionary<NSString *, NSNumber *> *)volumeMap NS_SWIFT_NAME(onUserVoiceVolumeChanged(volumeMap:));
/**
* 所有用户网络质量的反馈回调
*
* @param networkQualityList 网络状态,根据每个 userId 可以获取对应用户当前的网络质量
*/
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkQualityInfo *> *)networkQualityList NS_SWIFT_NAME(onUserNetworkQualityChanged(networkQualityList:));
/**
* 当前用户被踢下线:此时可以 UI 提示用户,并再次重新调用初始化
*/
- (void)onKickedOffline NS_SWIFT_NAME(onKickedOffline());
/**
* 在线时票据过期:此时您需要生成新的 userSig,并再次重新调用初始化
*/
- (void)onUserSigExpired NS_SWIFT_NAME(onUserSigExpired());
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallReceived 回调,功能更强,信息更全面;
*/
- (void)onCallReceived:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
groupId:(NSString *_Nullable)groupId
callMediaType:(TUICallMediaType)callMediaType NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:groupId:callMediaType:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallReceived 回调,功能更强,信息更全面;
*/
- (void)onCallReceived:(NSString *)callerId
calleeIdList:(NSArray<NSString *> *)calleeIdList
groupId:(NSString *_Nullable)groupId
callMediaType:(TUICallMediaType)callMediaType
userData:(NSString *_Nullable)userData NS_SWIFT_NAME(onCallReceived(callerId:calleeIdList:groupId:callMediaType:userData:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃, 推荐使用 onCallNotConnected 回调,功能更强,信息更全面;
*/
- (void)onCallCancelled:(NSString *)callerId NS_SWIFT_NAME(onCallCancelled(callerId:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallBegin 回调,功能更强,信息更全面;
*/
- (void)onCallBegin:(TUIRoomId *)roomId callMediaType:(TUICallMediaType)callMediaType callRole:(TUICallRole)callRole NS_SWIFT_NAME(onCallBegin(roomId:callMediaType:callRole:)) __attribute__((deprecated("Deprecated from v3.0")));
/**
* 此接口已于2025年3月废弃推荐使用新的 onCallEnd 回调,功能更强,信息更全面;
*/
- (void)onCallEnd:(TUIRoomId *)roomId
callMediaType:(TUICallMediaType)callMediaType
callRole:(TUICallRole)callRole
totalTime:(float)totalTime NS_SWIFT_NAME(onCallEnd(roomId:callMediaType:callRole:totalTime:)) __attribute__((deprecated("Deprecated from v3.0")));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,508 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUICommonDefine @ TUIKitEngine
* Function: TUIKitEngine 复用型定义
*/
#import <Foundation/Foundation.h>
#import "TUIEngineSymbolExport.h"
#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
#import <UIKit/UIKit.h>
typedef UIView TUIVideoView;
typedef UIImage TUIImage;
typedef UIEdgeInsets TUIEdgeInsets;
#elif TARGET_OS_MAC
#import <AppKit/AppKit.h>
typedef NSView TUIVideoView;
typedef NSImage TUIImage;
typedef NSEdgeInsets TUIEdgeInsets;
#endif
/**
* 1.1 错误码枚举定义。
*/
typedef NS_ENUM(NSInteger, TUIError) {
/// 操作成功。
TUIErrorSuccess = 0,
/// 暂未归类的通用错误。
TUIErrorFailed = -1,
/// 请求被限频,请稍后重试。
TUIErrorFreqLimit = -2,
/// 重复操作。
TUIErrorRepeatOperation = -3,
/// 房间 ID 不匹配,请检查是否退房或者切换了房间。
TUIErrorRoomMismatch = -4,
/// 未找到SDKAppID请在腾讯云视立方SDK[控制台](https://console.cloud.tencent.com/vcube/project/manage)确认应用信息。
TUIErrorSDKAppIDNotFound = -1000,
/// 调用 API 时,传入的参数不合法,检查入参是否合法。
TUIErrorInvalidParameter = -1001,
/// 未登录,请调用Login接口。
TUIErrorSdkNotInitialized = -1002,
/// 获取权限失败,当前未授权音/视频权限请查看是否开启设备权限。Room场景下请使用以下错误码来处理:
/// 摄像头没有系统授权: ERR_CAMERA_NOT_AUTHORIZED。
/// 麦克风没有系统授权: ERR_MICROPHONE_NOT_AUTHORIZED。
TUIErrorPermissionDenied = -1003,
/// 该功能需要开通额外的套餐请在腾讯云视立方SDK [控制台](https://console.cloud.tencent.com/vcube/project/manage) 按需开通对应套餐。
TUIErrorRequirePayment = -1004,
/// 错误描述:
/// SDK检测到当前使用的License无效或已过期导致播放功能受限无法正常播放
/// 错误原因:
/// 1. License非法或已过期
/// 2. License未包含所需功能权限
/// 3. License签名验证失败
/// 处理建议:
/// 1. 在腾讯云视立方控制台确认License有效期
/// 2. 联系腾讯云技术支持更新或重新获取License
TUIErrorInvalidLicense = -1005,
/// 系统问题,打开摄像头失败。检查摄像头设备是否正常。
TUIErrorCameraStartFail = -1100,
/// 摄像头没有系统授权, 检查系统授权。
TUIErrorCameraNotAuthorized = -1101,
/// 摄像头被占用,检查是否有其他进程使用摄像头。
TUIErrorCameraOccupied = -1102,
/// 当前无摄像头设备,请插入摄像头设备解决该问题。
TUIErrorCameraDeviceEmpty = -1103,
/// 系统问题,打开麦克风失败。检查麦克风设备是否正常。
TUIErrorMicrophoneStartFail = -1104,
/// 麦克风没有系统授权,检查系统授权。
TUIErrorMicrophoneNotAuthorized = -1105,
/// 麦克风被占用。
TUIErrorMicrophoneOccupied = -1106,
/// 当前无麦克风设备。
TUIErrorMicrophoneDeviceEmpty = -1107,
/// 获取屏幕分享源(屏幕和窗口)失败,检查屏幕录制权限。
TUIErrorGetScreenSharingTargetFailed = -1108,
/// 开启屏幕分享失败,检查房间内是否有人正在屏幕分享。
TUIErrorStartScreenSharingFailed = -1109,
/// 音频采集设备不可用(例如被系统电话或微信语音电话占用)。
TUIErrorAudioCaptureDeviceUnavailable = -1110,
/// 需要进房后才可使用此功能。
TUIErrorOperationInvalidBeforeEnterRoom = -2101,
/// 房主不支持退房操作Conference(会议)房间类型: 可以先转让房主再退房。LivingRoom(直播)房间类型: 房主只能解散房间。
TUIErrorExitNotSupportedForRoomOwner = -2102,
/// 当前房间类型下不支持该操作。
TUIErrorOperationNotSupportedInCurrentRoomType = -2103,
/// 创建房间ID 非法,自定义 ID 必须为可打印 ASCII 字符0x20-0x7e最长48个字节。
TUIErrorRoomIdInvalid = -2105,
/// 房间名称非法名称最长30字节如果包含中文字符编码必须是 UTF-8。
TUIErrorRoomNameInvalid = -2107,
/// 当前用户已在别的房间内,需要先退房才能加入新的房间:
/// 单个roomEngine实例只支持用户进入一个房间如果要进入不同的房间请先退房或者使用新的roomEngine实例。
TUIErrorAlreadyInOtherRoom = -2108,
/// 用户不存在。
TUIErrorUserNotExist = -2200,
/// 需要房主权限才能操作。
TUIErrorUserNeedOwnerPermission = -2300,
/// 需要房主或者管理员权限才能操作。
TUIErrorUserNeedAdminPermission = -2301,
/// 信令请求无权限,例如取消非自己发起的邀请。
TUIErrorRequestNoPermission = -2310,
/// 信令请求ID 无效或已经被处理过。
TUIErrorRequestIdInvalid = -2311,
/// 信令请求重复。
TUIErrorRequestIdRepeat = -2312,
/// 最大麦位超出套餐包数量限制。
TUIErrorMaxSeatCountLimit = -2340,
/// 麦位编号不存在。
TUIErrorSeatIndexNotExist = -2344,
/// 当前麦位音频被锁。
TUIErrorOpenMicrophoneNeedSeatUnlock = -2360,
/// 需要向房主或管理员申请后打开麦克风。
TUIErrorOpenMicrophoneNeedPermissionFromAdmin = -2361,
/// 当前麦位视频被锁, 需要由房主解锁麦位后,才能打开摄像头。
TUIErrorOpenCameraNeedSeatUnlock = -2370,
/// 需要向房主或管理员申请后打开摄像头。
TUIErrorOpenCameraNeedPermissionFromAdmin = -2371,
/// 当前麦位视频被锁, 需要由房主解锁麦位后,才能打开屏幕分享。
TUIErrorOpenScreenShareNeedSeatUnlock = -2372,
/// 需要向房主或管理员申请后打开屏幕分享。
TUIErrorOpenScreenShareNeedPermissionFromAdmin = -2373,
/// 当前房间已开启全员禁言。
TUIErrorSendMessageDisabledForAll = -2380,
/// 当前房间内,您已被已禁言。
TUIErrorSendMessageDisabledForCurrent = -2381,
/// 当前房间不支持预加载。
TUIErrorRoomNotSupportPreloading = -4001,
/// 错误描述:正在通话中,不允许操作设备/流相关接口。
/// 错误原因:
/// 当您在使用 TUIRoomEngine 直播过程中接听来自 TUICallEngine 的通话时为了避免通话的音视频数据被直播间观众拉取到TUIRoomEngine 会做如下处理:
/// 1. 暂停视频流上行,如果您在直播时有调用 `setLocalVideoMuteImage` 接口设置过垫片图片直播间观众会看到您设置的垫片图片TUICallEngine 通话结束后会自动恢复摄像头画面的上行;
/// 2. 暂停音频流上行TUICallEngine 通话结束后会自动恢复麦克风音频的上行。
/// 在 TUICallEngine 通话未结束期间,您在直播间内调用设备和流相关的 API 时均会出现此错误码。
/// 处理建议:您可以在页面上弹框提醒用户 “您正在通话中,请挂断后再试”。
TUIErrorCallInProgress = -6001,
/// 错误描述:
/// 服务器内部发生未知错误,导致请求无法正常处理
/// 错误原因:
/// 1. 服务器端服务异常或崩溃
/// 2. 服务器资源不足或过载
/// 3. 服务器配置错误
/// 处理建议:
/// 1. 提示用户"服务器繁忙,请稍后重试"
/// 2. 检查服务器日志定位具体问题
/// 3. 联系腾讯云技术支持排查后台服务问题
TUIErrorServerSystemError = 100001,
/// 错误描述:
/// 服务器接收到非法或不完整的请求参数,导致请求无法处理
/// 产生原因:
/// 1. 必填参数缺失或为空
/// 2. 参数格式不符合要求
/// 3. 参数值超出允许范围
/// 4. 参数类型不匹配
/// 处理建议:
/// 1. 检查请求参数是否完整
/// 2. 验证参数格式和类型是否符合API文档要求
/// 3. 确保参数值在有效范围内
/// 4. 查阅相关API文档确认参数规范
TUIErrorServerInvalidParameter = 100002,
/// 房间ID 已被使用请选择别的房间ID。
TUIErrorRoomIdOccupied = 100003,
/// 进房时房间不存在,或许已被解散。
TUIErrorRoomIdNotExist = 100004,
/// 用户不在当前房间内。
TUIErrorUserNotEntered = 100005,
/// 房间成员已满。
TUIErrorRoomUserFull = 100008,
/// 当前房间需要密码才能进入。
TUIErrorNeedPassword = 100018,
/// 进房密码错误。
TUIErrorWrongPassword = 100019,
/// 信令请求冲突。
TUIErrorRequestIdConflict = 100102,
/// 当前麦位被锁。
TUIErrorSeatLocked = 100200,
/// 当前麦位已经有人了。
TUIErrorSeatOccupied = 100210,
/// 当前用户已经在麦位上。
TUIErrorAlreadyInSeat = 100203,
/// 上麦人数已满。
TUIErrorAllSeatOccupied = 100205,
/// 当前用户没有在麦上。
TUIErrorUserNotInSeat = 100206,
/// 不支持连麦。
TUIErrorSeatNotSupportLinkMic = 100211,
/// 当前房间已连线。
TUIErrorRoomAlreadyConnected = 100401,
/// 当前房间与其他房间连线中。
TUIErrorRoomConnectedInOther = 100403,
/// 当前房间连线超出最大数量限制。
TUIErrorMaxConnectedCountLimit = 100404,
/// 房间自定义信息 key 数量超过上限
TUIErrorRoomMetadataExceedKeyCountLimit = 100500,
/// 房间自定义信息 value 字节大小超过上限
TUIErrorRoomMetadataExceedValueSizeLimit = 100501,
/// 礼物能力未开启
TUIErrorGiftAbilityNotEnabled = 102001,
/// 礼物ID不存在
TUIErrorGiftNotExist = 102002,
/// 错误描述:
/// 礼物服务器预验证失败, 礼物系统在发送礼物之前,会向您在控制台上配置的回调服务器地址发送“礼物发送确认请求”,如果从您的服务器获得确认码为 0礼物系统才会真正发出礼物。
/// 错误原因:
/// 1. 礼物系统向您的服务器请求超时了(超时时间为两秒),比如您的服务器没有打开相应的端口,或者防火墙策略限制了外网的 http 协议访问。
/// 2. 您的服务器没有成功解析“礼物发送确认请求”的数据包,导致您的服务器返回了数值不为 0 的确认码。
/// 处理建议:
/// 1. 检查服务器端口开放状态和防火墙设置。
/// 2. 确保服务器能正确处理JSON格式的验证请求。
TUIErrorGiftServerPreVerificationFailed = 102004,
};
/**
* 1.2 网络质量。
*/
typedef NS_ENUM(NSUInteger, TUINetworkQuality) {
/// 未定义。
TUINetworkQualityUnknown = 0,
/// 当前网络非常好。
TUINetworkQualityExcellent = 1,
/// 当前网络比较好。
TUINetworkQualityGood = 2,
/// 当前网络一般。
TUINetworkQualityPoor = 3,
/// 当前网络较差。
TUINetworkQualityBad = 4,
/// 当前网络很差。
TUINetworkQualityVeryBad = 5,
/// 当前网络不满足 TRTC 的最低要求。
TUINetworkQualityDown = 6,
};
/**
* 1.3 插件类型。
*/
typedef NS_ENUM(NSUInteger, TUIExtensionType) {
/// 设备管理插件。
TUIExtensionTypeDeviceManager = 1,
/// 直播管理插件。
TUIExtensionTypeLiveListManager = 2,
/// 会议列表插件。
TUIExtensionTypeConferenceListManager = 3,
/// 会中呼叫插件。
TUIExtensionTypeConferenceInvitationManager = 4,
/// 直播布局插件。
TUIExtensionTypeLiveLayoutManager = 5,
/// 直播礼物插件
TUIExtensionTypeLiveGiftManager = 6,
};
/**
* 1.4 音频设备。
*/
typedef NS_ENUM(NSUInteger, TUIAudioPlaybackDevice) {
/// 扬声器。
TUIAudioPlaybackDeviceSpeakerphone = 0,
/// 听筒。
TUIAudioPlaybackDeviceEarpiece = 1,
};
/**
* 1.5 前置/后置摄像头。
*/
typedef NS_ENUM(NSUInteger, TUICamera) {
/// 前置摄像头。
TUICameraFront = 0,
/// 后置摄像头。
TUICameraBack = 1,
};
/**
* 1.6 网络质量信息。
*/
TUIENGINE_EXPORT @interface TUINetworkInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 网络质量。
@property(nonatomic, assign) TUINetworkQuality quality;
/// 上行丢包率,单位 (%) 该数值越小越好。
/// 如果 upLoss 为 0%,则意味着上行链路的网络质量很好,上传到云端的数据包基本不发生丢失。
/// 如果 upLoss 为 30%,则意味着 SDK 向云端发送的音视频数据包中,会有 30%丢失在传输链路中。
@property(nonatomic, assign) uint32_t upLoss;
/// 下行丢包率,单位 (%) 该数值越小越好。
/// 如果 downLoss 为 0%,则意味着下行链路的网络质量很好,从云端接收的数据包基本不发生丢失。
/// 如果 downLoss 为 30%,则意味着云端向 SDK 传输的音视频数据包中,会有 30%丢失在传输链路中。
@property(nonatomic, assign) uint32_t downLoss;
/// 网络延迟,单位 ms。
@property(nonatomic, assign) uint32_t delay;
@end
/**
* 1.8 网络质量信息废弃推荐使用1.6 {@link TUINetworkInfo})。
*/
TUIENGINE_EXPORT @interface TUINetworkQualityInfo : NSObject
/// 用户 ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 网络质量。
@property(nonatomic, assign) TUINetworkQuality quality;
@end
/**
* 1.9 视频画面填充模式。
*/
typedef NS_ENUM(NSInteger, TUIVideoRenderParamsFillMode) {
/// 填充模式:即将画面内容居中等比缩放以充满整个显示区域,超出显示区域的部分将会被裁剪掉,此模式下画面可能不完整。
TUIVideoRenderParamsFillModeFill = 0,
/// 适应模式:即按画面长边进行缩放以适应显示区域,短边部分会被填充为黑色,此模式下图像完整但可能留有黑边。
TUIVideoRenderParamsFillModeFit = 1,
};
/**
* 1.10 视频画面旋转方向。
*/
typedef NS_ENUM(NSInteger, TUIVideoRenderParamsRotation) {
/// 不旋转。
TUIVideoRenderParamsRotation_0 = 0,
/// 顺时针旋转90度。
TUIVideoRenderParamsRotation_90 = 1,
/// 顺时针旋转180度。
TUIVideoRenderParamsRotation_180 = 2,
/// 顺时针旋转270度。
TUIVideoRenderParamsRotation_270 = 3,
};
/**
* 1.11 视频宽高比模式。
*/
typedef NS_ENUM(NSInteger, TUIVideoEncoderParamsResolutionMode) {
/// 横屏分辨率例如Resolution_640_360 + Landscape = 640x360。
TUIVideoEncoderParamsResolutionModeLandscape = 0,
/// 竖屏分辨率,例如Resolution_640_360 + Portrait = 360x640。
TUIVideoEncoderParamsResolutionModePortrait = 1,
};
/**
* 1.12 视频分辨率。
*/
typedef NS_ENUM(NSInteger, TUIVideoEncoderParamsResolution) {
/// 宽高比 16:9分辨率 640x360建议码率VideoCall500kbps。
TUIVideoEncoderParamsResolution_640_360 = 1,
/// 宽高比 16:9分辨率 960x540建议码率VideoCall850kbps。
TUIVideoEncoderParamsResolution_960_540 = 2,
/// 宽高比 16:9分辨率 1280x720建议码率VideoCall1200kbps
TUIVideoEncoderParamsResolution_1280_720 = 3,
/// 宽高比 16:9分辨率 1920x1080建议码率VideoCall2000kbps。
TUIVideoEncoderParamsResolution_1920_1080 = 4,
};
/**
* 1.13 通话中音视频房间ID。
*
* - intRoomId 与 strRoomId 是互斥的,若您选用 strRoomId则 intRoomId 需要填写为 0。若两者都填SDK 将优先选用 intRoomId。
* - 不要混用 intRoomId 和 strRoomId因为它们之间是不互通的比如数字 123 和字符串 123 两个完全不同的房间。
*/
TUIENGINE_EXPORT @interface TUIRoomId : NSObject
/// 数字房间号,取值范围 1 - 2147483647(2^31-1)。
@property(nonatomic, assign) UInt32 intRoomId;
/// 字符串房间号,推荐取值:
/// 限制长度为 64 字节。以下为支持的字符集范围(共 89 个字符):
/// 大小写英文字母a-zA-Z
/// 数字0-9
/// 空格、!、#、$、%、&、(、)、+、-、:、;、<、=、.、>、?、@、[、]、^、_、{、}、|、~、,。
@property(nonatomic, copy) NSString* _Nullable strRoomId;
@end
/**
* 1.14 视频画面的渲染参数。
*/
TUIENGINE_EXPORT @interface TUIVideoRenderParams : NSObject
/// 视频画面填充模式。
@property(nonatomic, assign) TUIVideoRenderParamsFillMode fillMode;
/// 视频画面旋转方向。
@property(nonatomic, assign) TUIVideoRenderParamsRotation rotation;
@end
/**
* 1.15 视频编码参数。
*/
TUIENGINE_EXPORT @interface TUIVideoEncoderParams : NSObject
/// 视频分辨率。
@property(nonatomic, assign) TUIVideoEncoderParamsResolution resolution;
/// 视频宽高比。
@property(nonatomic, assign) TUIVideoEncoderParamsResolutionMode resolutionMode;
@end
typedef void (^TUISuccessBlock)(void);
typedef void (^TUIErrorBlock)(TUIError code, NSString* _Nonnull message);

View File

@@ -0,0 +1,235 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIConferenceInvitationManager @ TUIKitEngine
* Function: 会中邀请相关接口,此页面中的函数仅支持会议房间类型({@link TUIRoomTypeConference})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 邀请状态
*/
typedef NS_ENUM(NSUInteger, TUIInvitationStatus) {
/// 未知状态。
TUIInvitationStatusNone = 0,
/// 待处理状态。
TUIInvitationStatusPending = 1,
/// 超时状态。
TUIInvitationStatusTimeout = 2,
/// 已接受状态。
TUIInvitationStatusAccepted = 3,
/// 被拒绝状态。
TUIInvitationStatusRejected = 4,
};
/**
* 邀请错误码枚举
*/
typedef NS_ENUM(NSInteger, TUIInvitationCode) {
/// 邀请成功。
TUIInvitationCodeSuccess = 0,
/// 当前用户已在邀请列表。
TUIInvitationCodeAlreadyInInvitationList = 1,
/// 当前用户已在房间内。
TUIInvitationCodeAlreadyInConference = 2,
};
/**
* 邀请拒绝原因枚举
*/
typedef NS_ENUM(NSInteger, TUIInvitationRejectedReason) {
/// 拒绝进入。
TUIInvitationRejectedReasonRejectToEnter = 0,
/// 在其他会议中。
TUIInvitationRejectedReasonInOtherConference = 1,
};
/**
* 邀请信息结构体
*/
TUIENGINE_EXPORT @interface TUIInvitation : NSObject
/// 邀请状态。
@property(nonatomic, assign, readonly) TUIInvitationStatus status;
/// 被邀请者信息。
@property(nonatomic, strong, readwrite) TUIUserInfo *invitee;
/// 邀请者信息。
@property(nonatomic, strong, readwrite) TUIUserInfo *inviter;
@end
typedef void (^TUIInvitationListResponseBlock)(NSArray<TUIInvitation *> *_Nonnull list, NSString *cursor);
typedef void (^TUIInviteUsersResponseBlock)(NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUIConferenceInvitationObserver <NSObject>
/**
* 收到邀请回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param extensionInfo 扩展信息。
*/
- (void)onReceiveInvitation:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation extensionInfo:(NSString *)extensionInfo NS_SWIFT_NAME(onReceiveInvitation(roomInfo:invitation:extensionInfo:));
/**
* 邀请已在其他设备被处理回调
*
* @param roomInfo 房间信息。
* @param accepted 邀请是否被接受。
*/
- (void)onInvitationHandledByOtherDevice:(TUIRoomInfo *)roomInfo accepted:(BOOL)accepted NS_SWIFT_NAME(onInvitationHandledByOtherDevice(roomInfo:accepted:));
/**
* 邀请被取消回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationCancelled:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationCancelled(roomInfo:invitation:));
/**
* 邀请被接受回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationAccepted:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationAccepted(roomInfo:invitation:));
/**
* 邀请被拒绝回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param reason 拒绝原因。
*/
- (void)onInvitationRejected:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation reason:(TUIInvitationRejectedReason)reason NS_SWIFT_NAME(onInvitationRejected(roomInfo:invitation:reason:));
/**
* 邀请超时回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
*/
- (void)onInvitationTimeout:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationTimeout(roomInfo:invitation:));
/**
* 邀请被管理员/房主撤销回调
*
* @param roomInfo 房间信息。
* @param invitation 邀请信息。
* @param admin 管理员/房主信息。
*/
- (void)onInvitationRevokedByAdmin:(TUIRoomInfo *)roomInfo invitation:(TUIInvitation *)invitation admin:(TUIUserInfo *)admin NS_SWIFT_NAME(onInvitationRevokedByAdmin(roomInfo:invitation:admin:));
/**
* 新增邀请回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationAdded:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationAdded(roomId:invitation:));
/**
* 邀请被移除回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationRemoved:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationRemoved(roomId:invitation:));
/**
* 邀请状态变更回调
*
* @param roomId 房间Id。
* @param invitation 邀请信息。
*/
- (void)onInvitationStatusChanged:(NSString *)roomId invitation:(TUIInvitation *)invitation NS_SWIFT_NAME(onInvitationStatusChanged(roomId:invitation:));
@end
TUIENGINE_EXPORT @interface TUIConferenceInvitationManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUIConferenceInvitationObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUIConferenceInvitationObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 邀请成员
*
* @param roomId 房间Id。
* @param userIdList 成员userId列表。
* @param timeout 超时时间。
* @param extensionInfo 扩展信息。
*/
- (void)inviteUsers:(NSString *)roomId
userIdList:(NSArray<NSString *> *)userIdList
timeout:(NSTimeInterval)timeout
extensionInfo:(NSString *)extensionInfo
onSuccess:(TUIInviteUsersResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(inviteUsers(_:userIdList:timeout:extensionInfo:onSuccess:onError:));
/**
* 取消邀请
*
* @param roomId 房间Id。
* @param userIdList 成员userId列表。
*/
- (void)cancelInvitation:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelInvitation(_:userIdList:onSuccess:onError:));
/**
* 接受邀请
*
* @param roomId 房间Id。
*/
- (void)accept:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(accept(_:onSuccess:onError:));
/**
* 拒绝邀请
*
* @param roomId 房间Id。
* @param reason 拒绝原因。
*/
- (void)reject:(NSString *)roomId reason:(TUIInvitationRejectedReason)reason onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(reject(_:reason:onSuccess:onError:));
/**
* 拉取邀请列表
*
* @param roomId 房间Id。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)getInvitationList:(NSString *)roomId cursor:(NSString *)cursor count:(NSInteger)count onSuccess:(TUIInvitationListResponseBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getInvitationList(_:cursor:count:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,225 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIConferenceListManager @ TUIKitEngine
* Function: 会议列表相关接口,此页面中的函数仅支持会议房间类型({@link TUIRoomTypeConference})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 会议状态
*/
typedef NS_OPTIONS(NSUInteger, TUIConferenceStatus) {
/// 未知状态
TUIConferenceStatusNone = 0,
/// 会议未开始
TUIConferenceStatusNotStarted = 1,
/// 会议进行中(当前时间 - 预约开始时间 < 1 分钟时,会议状态从未开始转到进行中)
TUIConferenceStatusRunning = 2,
};
/**
* 会议取消原因
*/
typedef NS_ENUM(NSUInteger, TUIConferenceCancelReason) {
/// 房主取消
TUIConferenceCancelReasonCancelledByAdmin = 0,
/// 当前用户被移出参会人员列表
TUIConferenceCancelReasonRemovedFromAttendees = 1,
};
/**
* 预定会议信息修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUIConferenceModifyFlag) {
/// 未定义
TUIConferenceModifyFlagNone = 0x00,
/// 会议名称
TUIConferenceModifyFlagRoomName = 0x01 << 0,
/// 预定开始时间,不填写则默认为当前时间
TUIConferenceModifyFlagScheduleStartTime = 0x01 << 16,
/// 预定结束时间,不填写,则默认为预定开始时间后 1 小时(即默认的会议时长为 1 小时),会议最小持续时间不能小于 5 分钟,最长时间不能超过 24 小时
TUIConferenceModifyFlagScheduleEndTime = 0x01 << 17,
};
/**
* 会议信息
*/
TUIENGINE_EXPORT @interface TUIConferenceInfo : NSObject
/// 预定会议开始时间
@property(nonatomic, assign) NSUInteger scheduleStartTime;
/// 预定会议结束时间
@property(nonatomic, assign) NSUInteger scheduleEndTime;
/// 邀请参会成员列表,可在预定会议时设置,拉取成员请使用 {@link fetchAttendeeList} 接口
@property(nonatomic, strong, readwrite) NSArray<NSString *> *scheduleAttendees;
/// 会议开始前提醒时间(秒)
@property(nonatomic, assign) NSInteger reminderSecondsBeforeStart;
/// 房间状态(只读)
@property(nonatomic, assign, readonly) TUIConferenceStatus status;
/// 会议基础信息
@property(nonatomic, strong, readwrite) TUIRoomInfo *basicRoomInfo;
@end
typedef void (^TUIScheduledAttendeesResponseBlock)(NSArray<TUIUserInfo *> *_Nonnull list, NSString *cursor, NSUInteger totalAttendeeCount);
typedef void (^TUIScheduledConferenceListResponseBlock)(NSArray<TUIConferenceInfo *> *_Nonnull list, NSString *cursor);
@protocol TUIConferenceListManagerObserver <NSObject>
/**
* 会议预定回调
*
* @param conferenceInfo 会议信息
*/
- (void)onConferenceScheduled:(TUIConferenceInfo *)conferenceInfo NS_SWIFT_NAME(onConferenceScheduled(conferenceInfo:));
/**
* 会议即将开始回调
*
* @param conferenceInfo 会议信息。
*/
- (void)onConferenceWillStart:(TUIConferenceInfo *)conferenceInfo NS_SWIFT_NAME(onConferenceWillStart(conferenceInfo:));
/**
* 会议取消回调
*
* @param roomId 会议Id即房间roomId。
* @param reason 会议取消原因。
* @param operateUser 取消会议操作者信息。
*/
- (void)onConferenceCancelled:(NSString *)roomId reason:(TUIConferenceCancelReason)reason operateUser:(TUIUserInfo *)operateUser NS_SWIFT_NAME(onConferenceCancelled(roomId:reason:operateUser:));
/**
* 会议信息变更回调
*
* @param conferenceInfo 会议信息。
* @param modifyFlag 会议信息变更标志位。
*/
- (void)onConferenceInfoChanged:(TUIConferenceInfo *)conferenceInfo modifyFlag:(TUIConferenceModifyFlag)modifyFlag NS_SWIFT_NAME(onConferenceInfoChanged(conferenceInfo:modifyFlag:));
/**
* 参会人员变更回调
*
* @param roomId 会议Id即房间roomId。
* @param leftUsers 离开成员列表。
* @param joinedUsers 新加入成员列表。
*/
- (void)onScheduleAttendeesChanged:(NSString *)roomId leftUsers:(NSArray<TUIUserInfo *> *)leftUsers joinedUsers:(NSArray<TUIUserInfo *> *)joinedUsers NS_SWIFT_NAME(onScheduleAttendeesChanged(roomId:leftUsers:joinedUsers:));
/**
* 会议状态变更回调
*
* @param roomId 会议Id即房间roomId。
* @param status 会议状态枚举,详情参见:{@link TUIConferenceStatus}。
*/
- (void)onConferenceStatusChanged:(NSString *)roomId status:(TUIConferenceStatus)status NS_SWIFT_NAME(onConferenceStatusChanged(roomId:status:));
@end
TUIENGINE_EXPORT @interface TUIConferenceListManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUIConferenceListManagerObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUIConferenceListManagerObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 预定会议
*
* @param conferenceInfo 预定会议信息。
*/
- (void)scheduleConference:(TUIConferenceInfo *)conferenceInfo onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(scheduleConference(_:onSuccess:onError:));
/**
* 取消预定会议
*
* @param roomId 要取消会议的会议Id即房间roomId。
*/
- (void)cancelConference:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelConference(_:onSuccess:onError:));
/**
* 更新预定会议信息
*
* @param conferenceInfo 预定会议信息。
* @param modifyFlag 更新会议信息标记位。
*/
- (void)updateConferenceInfo:(TUIConferenceInfo *)conferenceInfo
modifyFlag:(TUIConferenceModifyFlag)modifyFlag
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(updateConferenceInfo(conferenceInfo:modifyFlag:onSuccess:onError:));
/**
* 获取预定会议列表
*
* @param status 会议状态。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)fetchScheduledConferenceList:(TUIConferenceStatus)status
cursor:(NSString *)cursor
count:(NSInteger)count
onSuccess:(TUIScheduledConferenceListResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchScheduledConferenceList(status:cursor:count:onSuccess:onError:));
/**
* 获取预定会议邀请成员列表
*
* @param roomId 预定会议会议Id即房间roomId。
* @param cursor 分页获取索引,第一次拉取填 "",回调成功 如果callback返回的数据中 cursor 不为""表示需要分页请以返回的cursor作为参数再次调用接口拉取直至返回的cursor为"",表示数据已经全部拉取。
* @param count 本次拉取数量。
*/
- (void)fetchAttendeeList:(NSString *)roomId
cursor:(NSString *)cursor
count:(NSInteger)count
onSuccess:(TUIScheduledAttendeesResponseBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchAttendeeList(roomId:cursor:count:onSuccess:onError:));
/**
* 添加成员至邀请列表
*
* @param roomId 预定会议Id即房间roomId。
* @param userIdList 成员userId列表。
*/
- (void)addAttendeesByAdmin:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(addAttendeesByAdmin(roomId:userIdList:onSuccess:onError:));
/**
* 从邀请列表移除成员
*
* @param roomId 预定会议Id即房间roomId。
* @param userIdList 成员userId列表。
*/
- (void)removeAttendeesByAdmin:(NSString *)roomId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(removeAttendeesByAdmin(roomId:userIdList:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,12 @@
// Copyright (c) 2022 Tencent. All rights reserved.
#ifndef TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_
#define TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_
#if defined(BUILD_TUIENGINE)
#define TUIENGINE_EXPORT __attribute__((visibility("default")))
#else
#define TUIENGINE_EXPORT
#endif
#endif // TUIKIT_ENGINE_API_COMMON_APPLE_TUIENGINESYMBOLEXPORT_H_

View File

@@ -0,0 +1,266 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveBattleManager @ TUIKitEngine
* Function: 直播 Battle 相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Battle 用户信息
*/
TUIENGINE_EXPORT @interface TUIBattleUser : NSObject
/// Battle 房间 id。
@property(nonatomic, copy, nonnull) NSString *roomId;
/// Battle 用户id。
@property(nonatomic, copy, nonnull) NSString *userId;
/// Battle 用户昵称。
@property(nonatomic, copy, nonnull) NSString *userName;
/// Battle 用户头像地址。
@property(nonatomic, copy, nonnull) NSString *avatarUrl;
/// Battle 分数。
@property(nonatomic, assign) NSUInteger score;
@end
/**
* Battle 配置
*/
TUIENGINE_EXPORT @interface TUIBattleConfig : NSObject
/// Battle 最大时长(单位:秒)。
@property(nonatomic, assign) NSTimeInterval duration;
/// 被邀请用户是否需要回复同意/拒绝。
@property(nonatomic, assign) BOOL needResponse;
/// Battle 扩展信息。
@property(nonatomic, copy, nonnull) NSString *extensionInfo;
@end
/**
* Battle 信息
*/
TUIENGINE_EXPORT @interface TUIBattleInfo : NSObject
/// Battle ID。
@property(nonatomic, copy, readonly, nonnull) NSString *battleId;
/// Battle 配置。
@property(nonatomic, strong, readonly, nonnull) TUIBattleConfig *config;
/// Battle 发起人。
@property(nonatomic, strong, readonly, nonnull) TUIBattleUser *inviter;
/// Battle 邀请成员。
@property(nonatomic, strong, readonly, nonnull) NSArray<TUIBattleUser *> *inviteeList;
/// Battle 开始标记时间戳(单位:秒)。
@property(nonatomic, assign, readonly) NSUInteger startTime;
/// Battle 结束标记时间戳(单位:秒)。
@property(nonatomic, assign, readonly) NSUInteger endTime;
@end
/**
* Battle 邀请状态
*/
typedef NS_ENUM(NSInteger, TUIBattleCode) {
/// 默认状态。
TUIBattleCodeUnknown = -1,
/// Battle 请求发送成功。
TUIBattleCodeSuccess = 0,
/// 被邀请的房间不存在。
TUIBattleCodeRoomNotExist = 1,
/// 被邀请的房间已在 Battle 中。
TUIBattleCodeBattling = 2,
/// 被邀请的房间已与其他房间 Battle 中。
TUIBattleCodeBattlingOtherRoom = 3,
/// 房间已退出。
TUIBattleCodeRoomExit = 4,
/// 内部错误,推荐重试一次。
TUIBattleCodeRetry = 5,
};
/**
* Battle 结束的原因
*/
typedef NS_ENUM(NSInteger, TUIBattleStoppedReason) {
/// Battle 到达最大时长而超时结束
TUIBattleStoppedReasonTimeOver = 0,
/// Battle 其余人员都已退出
TUIBattleStoppedReasonOtherExit = 1,
};
typedef void (^TUIBattleRequestBlock)(TUIBattleInfo *battleInfo, NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUILiveBattleObserver <NSObject>
/**
* 收到 Battle 开始的通知
*
* @param battleInfo Battle 信息。
*/
- (void)onBattleStarted:(TUIBattleInfo *)battleInfo NS_SWIFT_NAME(onBattleStarted(battleInfo:));
/**
* 收到 Battle 结束的通知
*
* @param battleInfo Battle 信息。
* @param reason Battle 结束的原因。
*/
- (void)onBattleEnded:(TUIBattleInfo *)battleInfo reason:(TUIBattleStoppedReason)reason NS_SWIFT_NAME(onBattleEnded(battleInfo:reason:));
/**
* 收到用户加入 Battle 的通知
*
* @param battleId Battle ID。
* @param battleUser Battle 用户信息。
*/
- (void)onUserJoinBattle:(NSString *)battleId battleUser:(TUIBattleUser *)battleUser NS_SWIFT_NAME(onUserJoinBattle(battleId:battleUser:));
/**
* 收到用户退出 Battle 的通知
*
* @param battleId Battle ID。
* @param battleUser Battle 用户信息。
*/
- (void)onUserExitBattle:(NSString *)battleId battleUser:(TUIBattleUser *)battleUser NS_SWIFT_NAME(onUserExitBattle(battleId:battleUser:));
/**
* 收到用户 Battle 分数更新的通知
*
* @param battleId Battle ID。
* @param battleUserList Battle 所有用户信息。
*/
- (void)onBattleScoreChanged:(NSString *)battleId battleUserList:(NSArray<TUIBattleUser *> *)battleUserList NS_SWIFT_NAME(onBattleScoreChanged(battleId:battleUserList:));
/**
* 被叫收到 Battle 邀请的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestReceived:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestReceived(battleInfo:inviter:invitee:));
/**
* 被叫收到 Battle 取消的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestCancelled:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestCancelled(battleInfo:inviter:invitee:));
/**
* 收到 Battle 处理超时的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestTimeout:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestTimeout(battleInfo:inviter:invitee:));
/**
* 主叫收到被叫同意的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestAccept:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestAccept(battleInfo:inviter:invitee:));
/**
* 主叫收到被叫拒绝的通知
*
* @param battleInfo Battle 信息。
* @param inviter 发起邀请的用户信息。
* @param invitee 收到邀请的用户信息。
*/
- (void)onBattleRequestReject:(TUIBattleInfo *)battleInfo inviter:(TUIBattleUser *)inviter invitee:(TUIBattleUser *)invitee NS_SWIFT_NAME(onBattleRequestReject(battleInfo:inviter:invitee:));
@end
TUIENGINE_EXPORT @interface TUILiveBattleManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveBattleObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveBattleObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起 Battle 请求
*
* @param config Battle 配置信息。
* @param userIdList 待邀请的用户ID列表。
* @param timeout 超时时间。
*/
- (void)requestBattle:(TUIBattleConfig *)config
userIdList:(NSArray<NSString *> *)userIdList
timeout:(NSTimeInterval)timeout
onSuccess:(TUIBattleRequestBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(requestBattle(config:userIdList:timeout:onSuccess:onError:));
/**
* 取消 Battle 请求
*
* @param battleId Battle ID。
* @param userIdList 待取消的用户ID列表。
*/
- (void)cancelBattleRequest:(NSString *)battleId userIdList:(NSArray<NSString *> *)userIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelBattleRequest(battleId:userIdList:onSuccess:onError:));
/**
* 接受 Battle 请求
*
* @param battleId Battle ID。
*/
- (void)acceptBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(acceptBattle(battleId:onSuccess:onError:));
/**
* 拒绝 Battle 请求
*
* @param battleId Battle ID。
*/
- (void)rejectBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(rejectBattle(battleId:onSuccess:onError:));
/**
* 退出 Battle
*
* @param battleId Battle ID。
*/
- (void)exitBattle:(NSString *)battleId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(exitBattle(battleId:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,176 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveConnectionManager @ TUIKitEngine
* Function: 直播连线相关接口,此页面中的函数仅支持直播房间类型({@link TUIRoomTypeLive})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 连线用户信息
*/
TUIENGINE_EXPORT @interface TUIConnectionUser : NSObject
/// 连线的房间id。
@property(nonatomic, copy, nonnull) NSString *roomId;
/// 连线的用户id。
@property(nonatomic, copy, nonnull) NSString *userId;
/// 连线的用户昵称。
@property(nonatomic, copy, nonnull) NSString *userName;
/// 连线的用户头像地址。
@property(nonatomic, copy, nonnull) NSString *avatarUrl;
/// 连线开始标记时间戳。
@property(nonatomic, assign) NSUInteger joinConnectionTime;
@end
/**
* 连线邀请状态
*/
typedef NS_ENUM(NSInteger, TUIConnectionCode) {
/// 默认状态。
TUIConnectionCodeUnknown = -1,
/// 连线请求发送成功。
TUIConnectionCodeSuccess = 0,
/// 邀请连线的房间不存在。
TUIConnectionCodeRoomNotExist = 1,
/// 被邀请连线的房间已在邀请列表或者已连线。
TUIConnectionCodeConnecting = 2,
/// 被邀请连线的房间与其他房间连线中。
TUIConnectionCodeConnectingOtherRoom = 3,
/// 当前连线人数已达最大限制。
TUIConnectionCodeFull = 4,
/// 内部错误,推荐重试一次。
TUIConnectionCodeRetry = 5,
};
typedef void (^TUIConnectionRequestBlock)(NSDictionary<NSString *, NSNumber *> *resultMap);
@protocol TUILiveConnectionObserver <NSObject>
/**
* 收到连线用户列表发生变化
*
* @param connectedList 已连线的用户列表。
* @param joinedList 新加入连线的用户列表。
* @param leavedList 退出连线的用户列表。
*/
- (void)onConnectionUserListChanged:(NSArray<TUIConnectionUser *> *)connectedList
joinedList:(NSArray<TUIConnectionUser *> *)joinedList
leavedList:(NSArray<TUIConnectionUser *> *)leavedList NS_SWIFT_NAME(onConnectionUserListChanged(connectedList:joinedList:leavedList:));
/**
* 接收端收到连线邀请的回调
*
* @param inviter 邀请者信息。
* @param inviteeList 被邀请连线的用户列表。
* @param extensionInfo 透传信息。
*/
- (void)onConnectionRequestReceived:(TUIConnectionUser *)inviter inviteeList:(NSArray<TUIConnectionUser *> *)inviteeList extensionInfo:(NSString *)extensionInfo NS_SWIFT_NAME(onConnectionRequestReceived(inviter:inviteeList:extensionInfo:));
/**
* 邀请取消回调
*
* @param inviter 邀请者信息。
*/
- (void)onConnectionRequestCancelled:(TUIConnectionUser *)inviter NS_SWIFT_NAME(onConnectionRequestCancelled(inviter:));
/**
* 邀请被接受回调
*
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestAccept:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestAccept(invitee:));
/**
* 邀请被拒绝回调
*
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestReject:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestReject(invitee:));
/**
* 邀请超时回调
*
* @param inviter 邀请者信息。
* @param invitee 被邀请者的用户信息。
*/
- (void)onConnectionRequestTimeout:(TUIConnectionUser *)inviter invitee:(TUIConnectionUser *)invitee NS_SWIFT_NAME(onConnectionRequestTimeout(inviter:invitee:));
@end
TUIENGINE_EXPORT @interface TUILiveConnectionManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveConnectionObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveConnectionObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 发起连线请求
*
* @param roomIdList 待邀请的连线房间ID列表。
* @param timeout 超时时间。
* @param extensionInfo 扩展信息。
*/
- (void)requestConnection:(NSArray<NSString *> *)roomIdList
timeout:(NSTimeInterval)timeout
extensionInfo:(NSString *)extensionInfo
onSuccess:(TUIConnectionRequestBlock)onSuccess
onError:(TUIErrorBlock)onError NS_SWIFT_NAME(requestConnection(roomIdList:timeout:extensionInfo:onSuccess:onError:));
/**
* 取消连线请求
*
* @param roomIdList 被取消连线请求的房间Id列表。
*/
- (void)cancelConnectionRequest:(NSArray<NSString *> *)roomIdList onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(cancelConnectionRequest(roomIdList:onSuccess:onError:));
/**
* 接受连线邀请
*
* @param roomId 房间Id。
*/
- (void)acceptConnection:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(acceptConnection(_:onSuccess:onError:));
/**
* 拒绝连线邀请
*
* @param roomId 房间Id。
*/
- (void)rejectConnection:(NSString *)roomId onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(rejectConnection(_:onSuccess:onError:));
/**
* 退出房间连线
*
* 调用该接口会退出房间连线状态,仅限已连线的状态下调用。
*/
- (void)disconnect:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(disconnect(_onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,161 @@
/**
* Copyright (c) 2025 Tencent. All rights reserved.
* Module: TUILiveGiftManager @ TUIKitEngine
* Function: 直播 礼物 相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* Gift 礼物信息
*/
TUIENGINE_EXPORT @interface TUIGiftInfo : NSObject
/// Gift 礼物ID
@property(nonatomic, copy) NSString *giftId;
/// Gift 礼物名称
@property(nonatomic, copy) NSString *name;
/// Gift 礼物描述
@property(nonatomic, copy) NSString *desc;
/// Gift 礼物图标URL
@property(nonatomic, copy) NSString *iconUrl;
/// Gift 礼物资源URL
@property(nonatomic, copy) NSString *resourceUrl;
/// Gift 礼物等级
@property(nonatomic, assign) NSUInteger level;
/// Gift 礼物价格
@property(nonatomic, assign) NSUInteger coins;
/// Gift 礼物扩展自定义信息
@property(nonatomic, strong) NSDictionary<NSString *, NSString *> *extensionInfo;
@end
/**
* Gift 分类信息
*/
TUIENGINE_EXPORT @interface TUIGiftCategory : NSObject
/// Gift 分类ID
@property(nonatomic, copy) NSString *categoryId;
/// Gift 分类名称
@property(nonatomic, copy) NSString *name;
/// Gift 分类描述
@property(nonatomic, copy) NSString *desc;
/// Gift 分类扩展自定义信息
@property(nonatomic, strong) NSDictionary<NSString *, NSString *> *extensionInfo;
/// Gift 分类礼物列表
@property(nonatomic, copy) NSArray<TUIGiftInfo *> *giftList;
@end
typedef void (^TUIGetGiftListBlock)(NSArray<TUIGiftCategory *> *_Nonnull giftCategoryList);
typedef void (^TUIGetGiftCountBlock)(NSUInteger totalGiftsSent, NSUInteger totalGiftCoins, NSUInteger totalUniqueGiftSenders);
typedef void (^TUIGetLikesCountBlock)(NSUInteger totalLikesReceived);
@protocol TUILiveGiftObserver <NSObject>
/**
* 收到礼物数量变化的通知
*
* @param roomId 直播间ID
* @param totalGiftsSent 礼物数量
* @param totalGiftCoins 礼物价值
* @param totalUniqueGiftSenders 礼物发送者数量
*/
- (void)onGiftCountChanged:(NSString *)roomId
totalGiftsSent:(NSUInteger)totalGiftsSent
totalGiftCoins:(NSUInteger)totalGiftCoins
totalUniqueGiftSenders:(NSUInteger)totalUniqueGiftSenders NS_SWIFT_NAME(onGiftCountChanged(roomId:totalGiftsSent:totalGiftCoins:totalUniqueGiftSenders:));
/**
* 收到礼物消息的通知
*
* @param roomId 直播间ID
* @param giftInfo 礼物信息
* @param giftCount 礼物数量
* @param sender 礼物发送者信息
*/
- (void)onReceiveGiftMessage:(NSString *)roomId giftInfo:(TUIGiftInfo *)giftInfo giftCount:(NSUInteger)giftCount sender:(TUIUserInfo *)sender NS_SWIFT_NAME(onReceiveGiftMessage(roomId:giftInfo:giftCount:sender:));
/**
* 收到点赞消息的通知
*
* @param roomId 直播间ID
* @param totalLikesReceived 点赞数量
* @param sender 点赞发送者信息
*/
- (void)onReceiveLikesMessage:(NSString *)roomId totalLikesReceived:(NSUInteger)totalLikesReceived sender:(TUIUserInfo *)sender NS_SWIFT_NAME(onReceiveLikesMessage(roomId:totalLikesReceived:sender:));
@end
TUIENGINE_EXPORT @interface TUILiveGiftManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveGiftObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveGiftObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 请求获取礼物列表。
*
* @param roomId 直播间ID
*/
- (void)getGiftList:(NSString *)roomId onSuccess:(TUIGetGiftListBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getGiftList(roomId:onSuccess:onError:));
/**
* 发送礼物
*
* @param roomId 直播间ID
* @param giftId 礼物ID
* @param count 礼物数量
*/
- (void)sendGift:(NSString *)roomId giftId:(NSString *)giftId count:(NSUInteger)count onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(sendGift(roomId:giftId:count:onSuccess:onError:));
/**
* 发送点赞
*
* @param roomId 直播间ID
* @param count 点赞数量
*/
- (void)sendLike:(NSString *)roomId count:(NSUInteger)count onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(sendLike(roomId:count:onSuccess:onError:));
/**
* 房主获取礼物数量
*
* @param roomId 直播间ID
*/
- (void)getGiftCountByAnchor:(NSString *)roomId onSuccess:(TUIGetGiftCountBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getGiftCountByAnchor(roomId:onSuccess:onError:));
/**
* 获取点赞数量
*
* @param roomId 直播间ID
*/
- (void)getLikesCount:(NSString *)roomId onSuccess:(TUIGetLikesCountBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLikesCount(roomId:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,84 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveLayoutManager @ TUIKitEngine
* Function: 直播画面装饰相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 麦位的 UI 布局信息
*/
TUIENGINE_EXPORT @interface TUISeatLayout : NSObject
/// 当前使用的麦位布局模板的 ID
@property(nonatomic, assign, readonly) NSUInteger templateId;
/// 画布的宽度
@property(nonatomic, assign, readonly) NSUInteger canvasWidth;
/// 画布的高度
@property(nonatomic, assign, readonly) NSUInteger canvasHeight;
/// 麦位列表
@property(nonatomic, copy, readonly, nonnull) NSArray<TUISeatFullInfo *> *seatList;
@end
@protocol TUILiveLayoutObserver <NSObject>
@optional
/**
* 麦位布局发生变化的通知.(从 3.3 版本开始支持)
*
* @param roomId 房间 ID
* @param layout 最新的布局信息
*/
- (void)onSeatLayoutChanged:(NSString *)roomId layout:(TUISeatLayout *)layout NS_SWIFT_NAME(onSeatLayoutChanged(roomId:layout:));
/**
* 直播画面布局发生改变 (从 3.3 版本开始废弃,请使用 onSeatLayoutChanged 代替)
*
* @param roomId 房间ID
* @param layoutInfo 最新的画面布局信息
*/
- (void)onLiveVideoLayoutChanged:(NSString *)roomId
layoutInfo:(NSString *)layoutInfo NS_SWIFT_NAME(onLiveVideoLayoutChanged(roomId:layoutInfo:)) __attribute__((deprecated("Deprecated in version 3.3 and later, use onSeatLayoutChanged(roomId:layout:) instead.")));
@end
TUIENGINE_EXPORT @interface TUILiveLayoutManager : NSObject
/**
* 添加事件回调
*
* @param observer 监听的实例。
*/
- (void)addObserver:(id<TUILiveLayoutObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveLayoutObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 自定义设置视频流布局
*
* @param roomID 房间ID。
* @param layoutInfo 布局Json信息。
*/
- (void)setLiveStreamLayoutInfo:(NSString *)roomID
layoutInfo:(NSString *)layoutInfo
onSuccess:(TUISuccessBlock)onSuccess
onError:(TUIErrorBlock)onError
NS_SWIFT_NAME(setLiveStreamLayoutInfo(roomID:layoutInfo:onSuccess:onError:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,318 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUILiveListManager @ TUIKitEngine
* Function: 直播房间列表相关接口,此页面中的函数仅支持直播房间类型({@link TUIRoomTypeLive})。
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
#import "TUIRoomDefine.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 直播间修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUILiveModifyFlag) {
TUILiveModifyFlagNone = 0,
/// Name: 直播间名称
TUILiveModifyFlagName = 1 << 0,
/// Notice: 直播间公告
TUILiveModifyFlagNotice = 1 << 1,
/// DisableMessage: 房间内全员禁止消息
TUILiveModifyFlagDisableMessage = 1 << 2,
/// Publish: 直播间公开标记
TUILiveModifyFlagPublish = 1 << 5,
/// TakeSeatMode: 直播间内上麦模式
TUILiveModifyFlagTakeSeatMode = 1 << 6,
/// CoverUrl: 直播间封面
TUILiveModifyFlagCoverUrl = 1 << 7,
/// BackgroundUrl: 直播间背景.
TUILiveModifyFlagBackgroundUrl = 1 << 8,
/// Category: 直播间分类
TUILiveModifyFlagCategory = 1 << 9,
/// ActivityStatus: 直播间活跃状态,支持自定义设置
TUILiveModifyFlagActivityStatus = 1 << 10,
/// SeatLayoutTemplateId: 直播间麦位布局模板 ID
TUILiveModifyFlagSeatLayoutTemplateId = 1 << 11,
};
/**
* 直播统计数据修改标记位
*/
typedef NS_OPTIONS(NSUInteger, TUILiveStatisticsModifyFlag) {
TUILiveStatisticsModifyFlagNone = 0,
/// TotalViewers: 累计观看次数
TUILiveStatisticsModifyFlagTotalViewers = 1 << 0,
/// TotalGiftsSent: 送礼总个数
TUILiveStatisticsModifyFlagTotalGiftsSent = 1 << 1,
/// TotalGiftCoins: 送礼总金额
TUILiveStatisticsModifyFlagTotalGiftCoins = 1 << 2,
/// TotalUniqueGiftSenders: 送礼人数
TUILiveStatisticsModifyFlagTotalUniqueGiftSenders = 1 << 3,
/// TotalLikesReceived: 点赞总数
TUILiveStatisticsModifyFlagTotalLikesReceived = 1 << 4,
/// TotalMessageCount: 消息总数
TUILiveStatisticsModifyFlagTotalMessageCount = 1 << 5,
};
/**
* 直播信息
*/
TUIENGINE_EXPORT @interface TUILiveInfo : NSObject
/// 房间ID (创建房间必填参数最大支持48个字节)。
@property(nonatomic, copy, nonnull) NSString* roomId;
/// 房间名称创建房间可选参数默认房间ID最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* name;
/// 房间公告创建房间可选参数最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* notice;
/// 是否禁止发送消息(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisableForAllUser;
/// 直播间是否公开
@property(nonatomic, assign) BOOL isPublicVisible;
/// 是否开启麦位控制。
@property(nonatomic, assign) BOOL isSeatEnabled;
/// 房主开播后自动上麦
@property(nonatomic, assign) BOOL keepOwnerOnSeat;
/// 最大麦位数。
@property(nonatomic, assign) NSInteger maxSeatCount;
/// 上麦模式(只有开启麦位控制后生效)。
@property(nonatomic, assign) TUISeatMode seatMode;
/// 麦位布局模板 ID
/// 1.只有开启麦位控制后生效;
/// 2.seatLayoutTemplateId 和 maxSeatCount 同时设置时,优先以模板支持的麦位数为准。
@property(nonatomic, assign) NSUInteger seatLayoutTemplateId;
/// 直播间封面,最大支持 200 个字节
@property(nonatomic, copy, nonnull) NSString* coverUrl;
/// 直播间背景,最大支持 200 个字节
@property(nonatomic, copy, nonnull) NSString* backgroundUrl;
/// 直播间分类标签单个房间最大支持3个标记
@property(nonatomic, copy, nonnull) NSArray<NSNumber*>* categoryList;
/// 直播间活跃状态: 用户自定义标记
@property(nonatomic, assign) NSInteger activityStatus;
/// 房主ID: 默认为房间创建者ID只读
@property(nonatomic, readonly, nonnull) NSString* ownerId;
/// 房主昵称: 默认为房间创建者昵称(只读)。
@property(nonatomic, readonly, nonnull) NSString* ownerName;
/// 房主头像URL: 默认为房间创建者头像URL只读
@property(nonatomic, readonly, nonnull) NSString* ownerAvatarUrl;
/// 房间创建时间(只读)。
@property(nonatomic, readonly) NSUInteger createTime;
/// 累计观看次数
@property(nonatomic, assign) NSInteger viewCount;
/// 房间信息(废弃)
@property(nonatomic, strong, readonly) TUIRoomInfo* roomInfo;
@end
/**
* 直播统计数据
*/
TUIENGINE_EXPORT @interface TUILiveStatisticsData : NSObject
/// 累计观看次数
@property(nonatomic, assign) NSInteger totalViewers;
/// 送礼总个数
@property(nonatomic, assign) NSInteger totalGiftsSent;
/// 送礼总金额
@property(nonatomic, assign) NSInteger totalGiftCoins;
/// 送礼人数
@property(nonatomic, assign) NSInteger totalUniqueGiftSenders;
/// 点赞总数
@property(nonatomic, assign) NSInteger totalLikesReceived;
/// 消息总数
@property(nonatomic, assign) NSInteger totalMessageCount;
/// 直播时长
@property(nonatomic, assign) NSInteger liveDuration;
@end
typedef void (^TUILiveInfoBlock)(TUILiveInfo* _Nonnull liveInfo);
typedef void (^TUILiveInfoListBlock)(NSString* _Nonnull cursor, NSArray<TUILiveInfo*>* _Nonnull liveInfoList);
typedef void (^TUIStopLiveBlock)(TUILiveStatisticsData* _Nonnull statisticData);
typedef void (^TUILiveStatisticsBlock)(TUILiveStatisticsData* _Nonnull statisticData);
@protocol TUILiveListManagerObserver <NSObject>
@optional
/**
* 直播信息改变回调
*
* @param liveInfo 直播间信息
* @param modifyFlag 改变类型
*/
- (void)onLiveInfoChanged:(TUILiveInfo*)liveInfo modifyFlag:(TUILiveModifyFlag)modifyFlag NS_SWIFT_NAME(onLiveInfoChanged(liveInfo:modifyFlag:));
/**
* 直播统计数据改变回调
*
* @param roomId 房间ID
* @param statisticData 直播统计数据
* @param modifyFlag 改变类型
*/
- (void)onLiveStatisticsChanged:(NSString*)roomId statisticData:(TUILiveStatisticsData*)statisticData modifyFlag:(TUILiveStatisticsModifyFlag)modifyFlag NS_SWIFT_NAME(onLiveStatisticsChanged(roomId:statisticData:modifyFlag:));
@end
TUIENGINE_EXPORT @interface TUILiveListManager : NSObject
/**
* 设置事件回调
*
* 您可以通过 TUILiveListManagerObserver 获得直播间事件通知
* @param observer 监听的实例
*/
- (void)addObserver:(id<TUILiveListManagerObserver>)observer NS_SWIFT_NAME(addObserver(_:));
/**
* 移除事件回调
*
* @param observer 监听的实例。
*/
- (void)removeObserver:(id<TUILiveListManagerObserver>)observer NS_SWIFT_NAME(removeObserver(_:));
/**
* 主播开播
*
* @param liveInfo 直播信息
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)startLive:(TUILiveInfo*)liveInfo onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(startLive(liveInfo:onSuccess:onError:));
/**
* 主播关播
*
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)stopLive:(TUIStopLiveBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(stopLive(onSuccess:onError:));
/**
* 进入直播间
*
* @param roomId 房间 ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)joinLive:(NSString*)roomId onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(joinLive(roomId:onSuccess:onError:));
/**
* 离开直播间
*
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)leaveLive:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(leaveLive(onSuccess:onError:));
/**
* 修改直播信息
*
* @param liveInfo 直播信息
* @param modifyFlag 修改标记
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)setLiveInfo:(TUILiveInfo*)liveInfo modifyFlag:(TUILiveModifyFlag)modifyFlag onSuccess:(TUISuccessBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(setLiveInfo(_:modifyFlag:onSuccess:onError:));
/**
* 获取直播信息
*
* @param roomId 房间ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)getLiveInfo:(NSString*)roomId onSuccess:(TUILiveInfoBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLiveInfo(_:onSuccess:onError:));
/**
* 获取直播统计数据
*
* @param roomId 房间ID
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)getLiveStatistics:(NSString*)roomId onSuccess:(TUILiveStatisticsBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(getLiveStatistics(roomId:onSuccess:onError:));
/**
* 获取直播列表
*
* @note 获取直播间列表,单次拉取最大支持返回 50 个。
* @param cursor 列表下标
* @param count 每次拉取个数
* @param onSuccess 成功回调
* @param onError 失败回调
*/
- (void)fetchLiveList:(NSString*)cursor count:(NSInteger)count onSuccess:(TUILiveInfoListBlock)onSuccess onError:(TUIErrorBlock)onError NS_SWIFT_NAME(fetchLiveList(cursor:count:onSuccess:onError:));
/**
* 开始房间视频流预加载
*
* @param roomId 房间ID。
* @param isMuteAudio 是否静音播放。
* @param view 视频渲染视图。
* @param onPlaying 播放回调。
* @param onLoading 加载回调。
* @param onError 错误回调。
*/
- (void)startPreloadVideoStream:(NSString*)roomId
isMuteAudio:(BOOL)isMuteAudio
view:(TUIVideoView* __nullable)view
onPlaying:(TUIPlayOnPlayingBlock)onPlaying
onLoading:(TUIPlayOnLoadingBlock)onLoading
onError:(TUIPlayOnErrorBlock)onError NS_SWIFT_NAME(startPreloadVideoStream(roomId:isMuteAudio:view:onPlaying:onLoading:onError:));
/**
* 停止房间视频流预加载
*
* @param roomId 房间ID。
*/
- (void)stopPreloadVideoStream:(NSString*)roomId NS_SWIFT_NAME(stopPreloadVideoStream(_:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,791 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomDefine @ TUIKitEngine
* Function: TUIRoomEngine 关键类型定义
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
/////////////////////////////////////////////////////////////////////////////////
//
// 房间、角色相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 1.1 房间类型
*/
typedef NS_ENUM(NSUInteger, TUIRoomType) {
/// 会议类型房间,适用于会议,教育场景,该房间中可以开启自由发言,申请发言、上麦发言等不同模式。
TUIRoomTypeConference = 1,
/// 直播类型房间,适用于直播场景,该房间可以开启自由发言,上麦发言模式。
TUIRoomTypeLive = 2,
};
/**
* 1.2 上麦模式
*/
typedef NS_ENUM(NSUInteger, TUISeatMode) {
/// 自由上麦模式,台下观众可以自由上麦,无需申请。
TUISeatModeFreeToTake = 1,
/// 申请上麦模式,台下观众上麦需要房主或者管理员同意后才能上麦。
TUISeatModeApplyToTake = 2,
};
/**
* 1.3 房间内媒体设备类型
*/
typedef NS_ENUM(NSUInteger, TUIMediaDevice) {
/// 麦克风。
TUIMediaDeviceMicrophone = 1,
/// 摄像头。
TUIMediaDeviceCamera = 2,
/// 屏幕共享。
TUIMediaDeviceScreenSharing = 3,
};
/**
* 1.4 房间内角色类型
*/
typedef NS_ENUM(NSUInteger, TUIRole) {
/// 房主,一般指房间的创建者,房间内最高权限拥有者。
TUIRoleRoomOwner = 0,
/// 房间管理员。
TUIRoleAdministrator = 1,
/// 房间内普通成员。
TUIRoleGeneralUser = 2,
};
/**
* 1.5 房间解散原因
*/
typedef NS_ENUM(NSUInteger, TUIRoomDismissedReason) {
/// 被房主解散。
TUIRoomDismissedReasonByOwner = 1,
/// 被服务器解散。
TUIRoomDismissedReasonByServer = 2,
};
/**
* 1.6 用户的挂起状态
*/
typedef NS_ENUM(NSUInteger, TUISuspendStatus) {
/// 未挂起
TUISuspendStatusNone = 0,
/// 用户进入后台挂起
TUISuspendStatusInBackground = 1 << 0,
/// 用户正在接听电话
TUISuspendStatusInCalling = 1 << 1,
};
/**
* 1.7 用户的设备状态
*/
typedef NS_ENUM(NSUInteger, TUIDeviceStatus) {
/// 当前设备处于打开状态
TUIDeviceStatusOpened = 0,
/// 当前设备处于关闭状态,且是用户主动关闭
TUIDeviceStatusClosedBySelf = 1,
/// 当前设备处于关闭状态,且是被房主/管理员强制关闭
TUIDeviceStatusClosedByAdmin = 2,
};
/**
* 1.8 移动麦上用户的策略
*/
typedef NS_ENUM(NSUInteger, TUIMoveSeatPolicy) {
/// 目标麦位有人时放弃移动(默认策略)​​
TUIMoveSeatPolicyAbortWhenOccupied = 0,
/// 强制替换目标麦位上的用户​​,被替换的用户将会被踢下麦
TUIMoveSeatPolicyForceReplace = 1,
/// ​与目标麦位用户交换位置​​
TUIMoveSeatPolicySwapPosition = 2,
};
/**
* 1.9 锁定麦位标记位
*/
typedef NS_OPTIONS(NSUInteger, TUISeatLockFlag) {
TUISeatLockFlagNone = 0x00,
/// 锁定麦位
TUISeatLockFlagSeat = 0x01 << 0,
/// 锁定麦位摄像头
TUISeatLockFlagVideo = 0x01 << 1,
/// 锁定麦位麦克风
TUISeatLockFlagAudio = 0x01 << 2,
TUISeatLockFlagAll = TUISeatLockFlagSeat | TUISeatLockFlagVideo | TUISeatLockFlagAudio,
};
/////////////////////////////////////////////////////////////////////////////////
//
// 音视频相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 2.1 视频质量
*/
typedef NS_ENUM(NSUInteger, TUIVideoQuality) {
/// 低清360P。
TUIVideoQuality360P = 1,
/// 标清540P。
TUIVideoQuality540P = 2,
/// 高清720P。
TUIVideoQuality720P = 3,
/// 超清1080P。
TUIVideoQuality1080P = 4,
};
/**
* 2.2 音频质量
*/
typedef NS_ENUM(NSUInteger, TUIAudioQuality) {
/// 人声模式。
TUIAudioQualitySpeech = 0,
/// 默认模式。
TUIAudioQualityDefault = 1,
/// 音乐模式。
TUIAudioQualityMusic = 2,
};
/**
* 2.3 视频流类型
*/
typedef NS_ENUM(NSUInteger, TUIVideoStreamType) {
/// 高清摄像头视频流。
TUIVideoStreamTypeCameraStream = 0,
/// 屏幕分享视频流。
TUIVideoStreamTypeScreenStream = 1,
/// 低清摄像头视频流。
TUIVideoStreamTypeCameraStreamLow = 2,
};
/**
* 2.4 音视频状态更改原因(分类: 自己主动修改 或者 被房主、管理员修改)
*/
typedef NS_ENUM(NSUInteger, TUIChangeReason) {
/// 自己操作。
TUIChangeReasonBySelf = 0,
/// 房主或管理员操作。
TUIChangeReasonByAdmin = 1,
};
/**
* 2.5 用户被踢出房间原因(分类: 被主持人或管理员踢出、在其它设备进入房间被踢出 或者 被服务端踢出)
*/
typedef NS_ENUM(NSUInteger, TUIKickedOutOfRoomReason) {
/// 被主持人或管理员踢出。
TUIKickedOutOfRoomReasonByAdmin = 0,
/// 在其它设备进入房间被踢出。
TUIKickedOutOfRoomReasonByLoggedOnOtherDevice = 1,
/// 被服务端踢出。
TUIKickedOutOfRoomReasonByServer = 2,
/// 网络中断超时退房。
TUIKickedOutOfRoomReasonForNetworkDisconnected = 3,
/// 离线期间态进房状发生变化(被踢出房间或者房间已解散)。
TUIKickedOutOfRoomReasonForJoinRoomStatusInvalidDuringOffline = 4,
/// 超过了单设备最大可同时加入的房间个数,导致最早加入的房间自动退出
TUIKickedOutOfRoomReasonForCountOfJoinedRoomsExceedLimit = 5,
};
/**
* 2.6 分辨率模式(横屏 or 竖屏)
*/
typedef NS_ENUM(NSUInteger, TUIResolutionMode) {
/// 横屏。
TUIResolutionModeLandscape = 0,
/// 竖屏。
TUIResolutionModePortrait = 1,
};
/**
* 2.7 屏幕分享捕获源类型
*/
typedef NS_ENUM(NSInteger, TUICaptureSourceType) {
/// 未定义。
TUICaptureSourceTypeUnknown = -1,
/// 窗口。
TUICaptureSourceTypeWindow = 0,
/// 屏幕。
TUICaptureSourceTypeScreen = 1,
};
/////////////////////////////////////////////////////////////////////////////////
//
// 信令请求相关枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 4.1 请求类型
*/
typedef NS_ENUM(NSUInteger, TUIRequestAction) {
/// 无效请求。
TUIRequestActionInvalidAction = 0,
/// 请求远端用户打开摄像头。
TUIRequestActionOpenRemoteCamera = 1,
/// 请求远端用户打开麦克风。
TUIRequestActionOpenRemoteMicrophone = 2,
/// 请求上麦。
TUIRequestActionTakeSeat = 4,
/// 请求远端用户上麦。
TUIRequestActionRemoteUserOnSeat = 5,
/// 向管理员请求打开本地摄像头。
TUIRequestActionApplyToAdminToOpenLocalCamera = 6,
/// 向管理员请求打开本地麦克风。
TUIRequestActionApplyToAdminToOpenLocalMicrophone = 7,
/// 向管理员请求打开屏幕分享。
TUIRequestActionApplyToAdminToOpenLocalScreenShare = 8,
};
NS_ASSUME_NONNULL_BEGIN
/////////////////////////////////////////////////////////////////////////////////
//
// TUIRoomEngine 核心类型定义
//
/////////////////////////////////////////////////////////////////////////////////
///
/**
* 5.1 房间信息
*
* TUIRoomEngine 只支持字符串房间ID。
*/
TUIENGINE_EXPORT @interface TUIRoomInfo : NSObject
/// 房间ID (创建房间必填参数最大支持48个字节)。
@property(nonatomic, strong, nonnull) NSString* roomId;
/// 房主ID: 默认为房间创建者ID只读
@property(nonatomic, readonly, nonnull) NSString* ownerId;
/// 房主昵称: 默认为房间创建者昵称(只读)。
@property(nonatomic, readonly, nonnull) NSString* ownerName;
/// 房主头像URL: 默认为房间创建者头像URL只读
@property(nonatomic, readonly, nonnull) NSString* ownerAvatarUrl;
/// 房间类型(创建房间可选参数),请参见:{@link TUIRoomType}。
@property(nonatomic, assign) TUIRoomType roomType;
/// 房间名称创建房间可选参数默认房间ID最大支持100个字节
@property(nonatomic, copy, nonnull) NSString* name;
/// 是否禁止打开摄像头(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isCameraDisableForAllUser;
/// 是否禁止打开麦克风(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMicrophoneDisableForAllUser;
/// 是否禁止打开屏幕分享(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isScreenShareDisableForAllUser;
/// 是否禁止发送消息(创建房间可选参数),默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisableForAllUser;
/// 是否开启麦位控制。
@property(nonatomic, assign) BOOL isSeatEnabled;
/// 上麦模式(只有开启麦位控制后生效)。
@property(nonatomic, assign) TUISeatMode seatMode;
/// 最大麦位数。
@property(nonatomic, assign) NSInteger maxSeatCount;
/// 房主上麦后常驻麦位。
@property(nonatomic, assign) BOOL keepOwnerOnSeat;
/// 房间创建时间(只读)。
@property(nonatomic, readonly) NSUInteger createTime;
/// 房间内成员数量(只读)。
@property(nonatomic, readonly) NSInteger memberCount;
/// 房间密码。
@property(nonatomic, copy, nonnull) NSString* password;
@end
/**
* 5.2 用户登录信息
*/
TUIENGINE_EXPORT @interface TUILoginUserInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户名称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 用户的等级。
@property(nonatomic, assign) NSUInteger level;
/// 自定义信息。
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSData*>* customInfo
__attribute__((deprecated("use customInfo in TUIUserInfo instead")));
@end
/**
* 5.3 房间内用户信息
*/
TUIENGINE_EXPORT @interface TUIUserInfo : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户名称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 房间内用户昵称最大支持32个字节。
@property(nonatomic, copy, nonnull) NSString* nameCard;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 用户角色类型,会议类型的房间角色仅存在于房间内,退房后再进入角色为普通用户。直播可以在进房前设置,房间不解散,角色依然存在。详情参见:{@link
/// TUIRole}。
@property(nonatomic, assign) TUIRole userRole;
/// 是否有音频流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasAudioStream;
/// 是否有视频流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasVideoStream;
/// 是否有屏幕分享流,默认值:{@link NO}。
@property(nonatomic, assign) BOOL hasScreenStream;
/// 是否被禁止发送消息,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isMessageDisabled;
/// 用户等级。
@property(nonatomic, assign) NSUInteger level;
/// 房间成员自定义信息。
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSData*>* roomCustomInfo;
@end
/**
* 5.4 房间内用户信息变更参数key。
*/
typedef NS_OPTIONS(NSUInteger, TUIUserInfoModifyFlag) {
TUIUserInfoModifyFlagNone = 0x00,
/// userRole 参数发生变更。
TUIUserInfoModifyFlagUserRole = 0x01 << 0,
/// nameCard 参数发生变更。
TUIUserInfoModifyFlagNameCard = 0x01 << 1,
};
/**
* 5.5 视频编码参数
*/
TUIENGINE_EXPORT @interface TUIRoomVideoEncoderParams : NSObject
/// 视频质量, 请参见:{@link TUIVideoQuality}。
@property(nonatomic, assign) TUIVideoQuality videoResolution;
/// 分辨率模式, 请参见:{@link TUIResolutionMode}。
@property(nonatomic, assign) TUIResolutionMode resolutionMode;
/// 视频采集帧率。
@property(nonatomic, assign) NSInteger fps;
/// 目标视频码率。
@property(nonatomic, assign) NSInteger bitrate;
@end
/**
* 5.6 房间内座位信息
*/
TUIENGINE_EXPORT @interface TUISeatInfo : NSObject
/// 房间 ID。
@property(nonatomic, copy, nullable) NSString* roomId;
/// 麦位序号。
@property(nonatomic, assign) NSInteger index;
/// 用户ID。
@property(nonatomic, copy, nullable) NSString* userId;
/// 用户昵称
@property(nonatomic, copy, nullable) NSString* userName;
/// 房间内用户昵称
@property(nonatomic, copy, nullable) NSString* nameCard;
/// 用户头像URL
@property(nonatomic, copy, nullable) NSString* avatarUrl;
/// 麦位是否被锁定,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isLocked;
/// 麦位是否被禁止打开摄像头,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isVideoLocked;
/// 麦位是否被禁止打开麦克风,默认值:{@link NO}。
@property(nonatomic, assign) BOOL isAudioLocked;
@end
/**
* 5.7 房间内座位的全量信息
*/
TUIENGINE_EXPORT @interface TUISeatFullInfo : NSObject
/// 房间 ID
@property(nonatomic, copy, nonnull) NSString* roomId;
/// 麦位编号
@property(nonatomic, assign) NSInteger seatIndex;
/// 麦位是否被锁定
@property(nonatomic, assign) BOOL isSeatLocked;
/// 麦上用户 ID
@property(nonatomic, copy, nullable) NSString* userId;
/// 麦上用户的昵称
@property(nonatomic, copy, nullable) NSString* userName;
/// 麦上用户的头像 URL
@property(nonatomic, copy, nullable) NSString* userAvatar;
/// 麦上用户的麦克风状态
@property(nonatomic, assign) TUIDeviceStatus userMicrophoneStatus;
/// 麦上用户的摄像头状态
@property(nonatomic, assign) TUIDeviceStatus userCameraStatus;
/// 麦上用户的挂起状态
@property(nonatomic, assign) TUISuspendStatus userSuspendStatus;
/// 麦位的 x 坐标
@property(nonatomic, assign) NSUInteger x;
/// 麦位的 y 坐标
@property(nonatomic, assign) NSUInteger y;
/// 麦位的宽度
@property(nonatomic, assign) NSUInteger width;
/// 麦位的高度
@property(nonatomic, assign) NSUInteger height;
/// 麦位的纵向层级
@property(nonatomic, assign) NSUInteger zorder;
@end
/**
* 5.8 锁定麦位操作参数
*/
TUIENGINE_EXPORT @interface TUISeatLockParams : NSObject
/// 锁定麦位,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockSeat;
/// 锁定麦位摄像头,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockVideo;
/// 锁定麦位麦克风,默认值:{@link NO}。
@property(nonatomic, assign) BOOL lockAudio;
/// 锁定麦位标记位,默认值:{@link TUISeatLockFlagAll}。
@property(nonatomic, assign) TUISeatLockFlag lockFlag;
@end
/**
* 5.9 房间内用户音量
*/
TUIENGINE_EXPORT @interface TUIUserVoiceVolume : NSObject
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 音量 用于承载所有正在说话的用户的音量大小,取值范围 0 - 100。
@property(nonatomic, assign) NSUInteger volume;
@end
/**
* 5.10 信令请求
*/
TUIENGINE_EXPORT @interface TUIRequest : NSObject
/// 请求ID。
@property(nonatomic, readonly, nonnull) NSString* requestId;
/// 请求类型。
@property(nonatomic, assign) TUIRequestAction requestAction;
/// 用户ID。
@property(nonatomic, copy, nonnull) NSString* userId;
/// 用户昵称。
@property(nonatomic, copy, nonnull) NSString* userName;
/// 房间内用户昵称。
@property(nonatomic, copy, nonnull) NSString* nameCard;
/// 用户头像URL。
@property(nonatomic, copy, nonnull) NSString* avatarUrl;
/// 信令内容。
@property(nonatomic, copy, nonnull) NSString* content;
/// 时间戳。
@property(nonatomic, assign) NSUInteger timestamp;
/// 扩展信息。
@property(nonatomic, copy, nonnull) NSString* extensionInfo;
@end
/**
* 5.11 进房参数
*/
TUIENGINE_EXPORT @interface TUIEnterRoomOptions : NSObject
/// 房间密码。
@property(nonatomic, copy, nonnull) NSString* password;
@end
/**
* 5.12 搜索参数
*/
TUIENGINE_EXPORT @interface TUIUserSearchParam : NSObject
/// 搜索关键字,目前支持用户昵称搜索
@property(nonatomic, copy, nonnull) NSString* keyword;
/// 获取分页列表的下标。
@property(nonatomic, copy, nonnull) NSString* cursor;
@end
/**
* 5.13 房间内文本消息
*/
TUIENGINE_EXPORT @interface TUIRoomTextMessage : NSObject
/// 房间 ID只读
@property(nonatomic, copy, nonnull, readonly) NSString* roomId;
/// 消息发送者(只读)
@property(nonatomic, strong, nonnull, readonly) TUIUserInfo* sender;
/// 消息序列号(只读)
@property(nonatomic, assign, readonly) NSUInteger sequence;
/// 消息时间戳(只读)
@property(nonatomic, assign, readonly) NSTimeInterval timestampInSecond;
/// 消息文本
@property(nonatomic, copy, nonnull) NSString* textContent;
/// 消息扩展字段
@property(nonatomic, strong, nullable) NSDictionary<NSString*, NSString*>* extensionInfo;
@end
/**
* 5.14 房间内自定义消息
*/
TUIENGINE_EXPORT @interface TUIRoomCustomMessage : NSObject
/// 房间 ID只读
@property(nonatomic, copy, nonnull, readonly) NSString* roomId;
/// 消息发送者(只读)
@property(nonatomic, strong, nonnull, readonly) TUIUserInfo* sender;
/// 消息序列号(只读)
@property(nonatomic, assign, readonly) NSUInteger sequence;
/// 消息时间戳(只读)
@property(nonatomic, assign, readonly) NSTimeInterval timestampInSecond;
/// 自定义业务 ID
@property(nonatomic, copy, nonnull) NSString* businessId;
/// 自定义业务数据
@property(nonatomic, copy, nonnull) NSString* data;
@end
/////////////////////////////////////////////////////////////////////////////////
//
// TUIRoomEngine 基本类型定义
//
/////////////////////////////////////////////////////////////////////////////////
///
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 屏幕分享采集源信息
*/
TUIENGINE_EXPORT @interface TUIShareTarget : NSObject
/// 采集源的ID对于窗口该字段代表窗口的 ID对于屏幕该字段代表显示器的 ID。
@property(nonatomic, readonly, nonnull) NSString* targetId;
/// 采集源类型。
@property(nonatomic, readonly) TUICaptureSourceType sourceType;
/// 采集源名称。
@property(nonatomic, readonly, nullable) NSString* sourceName;
/// 缩略图。
@property(nonatomic, readonly, nullable) TUIImage* thumbnailImage;
/// 图标。
@property(nonatomic, readonly, nullable) TUIImage* iconImage;
/// 窗口的扩展信息。
@property(nonatomic, readonly, nullable) NSDictionary* extInfo;
@end
#endif
typedef void (^TUIRoomListBlock)(NSArray* _Nonnull list);
typedef void (^TUIRoomInfoBlock)(TUIRoomInfo* _Nullable roomInfo);
typedef void (^TUIRoomListResponseBlock)(NSArray<TUIRoomInfo*>* _Nonnull list);
typedef void (^TUIUserInfoBlock)(TUIUserInfo* _Nullable userInfo);
typedef void (^TUIUserListResponseBlock)(NSArray<TUIUserInfo*>* _Nonnull list,
NSInteger nextSequence);
typedef void (^TUISeatListResponseBlock)(NSArray<TUISeatInfo*>* _Nonnull list);
typedef void (^TUIRequestListResponseBlock)(NSArray<TUIRequest*>* _Nonnull list);
typedef void (^TUIRoomMetadataResponseBlock)(NSDictionary<NSString*, NSString*>* _Nonnull metadata);
typedef void (^TUIUserSearchResponseBlock)(NSArray<TUIUserInfo*>* _Nonnull list, NSString* cursor);
typedef void (^TUISendTextMessageBlock)(TUIRoomTextMessage* _Nonnull message);
typedef void (^TUISendCustomMessageBlock)(TUIRoomCustomMessage* _Nonnull message);
typedef void (^TUIPlayOnPlayingBlock)(NSString* _Nonnull userId);
typedef void (^TUIPlayOnLoadingBlock)(NSString* _Nonnull userId);
typedef void (^TUIPlayOnErrorBlock)(NSString* _Nonnull userId,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIRequestAcceptedBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestRejectedBlock)(NSString* _Nonnull requestId,
NSString* _Nonnull userId,
NSString* _Nonnull message);
typedef void (^TUIRequestCancelledBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestTimeoutBlock)(NSString* _Nonnull requestId, NSString* _Nonnull userId);
typedef void (^TUIRequestErrorBlock)(NSString* _Nonnull requestId,
NSString* _Nonnull userId,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIRequestAcceptedCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
NSString* _Nonnull extensionInfo);
typedef void (^TUIRequestRejectedCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
NSString* _Nonnull message,
NSString* _Nonnull extensionInfo);
typedef void (^TUIRequestCancelledCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestTimeoutCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestSuccessCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo);
typedef void (^TUIRequestErrorCallback)(NSString* _Nonnull requestId,
TUIUserInfo* _Nonnull userInfo,
TUIError code,
NSString* _Nonnull message);
typedef void (^TUIExperimentalAPIResponseBlock)(NSString* _Nonnull jsonData);
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,277 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomDeviceManager @ TUIKitEngine
* Function: 设备测试、管理相关接口
*/
#import <Foundation/Foundation.h>
#import "TUICommonDefine.h"
NS_ASSUME_NONNULL_BEGIN
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 设备类型
*/
typedef NS_ENUM(NSInteger, TUIMediaDeviceType) {
/// 未定义的设备类型
TUIMediaDeviceTypeUnknown = -1,
/// 麦克风类型设备
TUIMediaDeviceTypeAudioInput = 0,
/// 扬声器类型设备
TUIMediaDeviceTypeAudioOutput = 1,
/// 摄像头类型设备
TUIMediaDeviceTypeVideoCamera = 2,
};
/**
* 设备操作
*/
typedef NS_ENUM(NSInteger, TUIMediaDeviceState) {
/// 设备已被插入
TUIMediaDeviceStateAdd = 0,
/// 设备已被移除
TUIMediaDeviceStateRemove = 1,
/// 设备已启用
TUIMediaDeviceStateActive = 2,
};
#endif
#if TARGET_OS_IPHONE
/**
* 音频路由(即声音的播放模式)
*/
typedef NS_ENUM(NSInteger, TUIAudioRoute) {
/// Speakerphone使用扬声器播放即“免提”扬声器位于手机底部声音偏大适合外放音乐。
TUIAudioRouteSpeakerphone = 0,
/// Earpiece使用听筒播放听筒位于手机顶部声音偏小适合需要保护隐私的通话场景。
TUIAudioRouteEarpiece = 1,
};
#endif
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
/**
* 设备信息
*/
TUIENGINE_EXPORT @interface TUIDeviceInfo : NSObject
/// 设备 ID
@property(nonatomic, copy, nonnull) NSString* deviceId;
/// 设备名称
@property(nonatomic, copy, nonnull) NSString* deviceName;
/// 设备属性
@property(nonatomic, copy, nonnull) NSString* deviceProperties;
typedef void (^TUIDeviceListBlock)(NSArray<TUIDeviceInfo*>* _Nonnull list);
typedef void (^TUIDeviceInfoBlock)(TUIDeviceInfo* _Nullable deviceInfo);
@end
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
@protocol TUIRoomDeviceManagerObserver <NSObject>
/**
* 本地设备添加事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地设备包括摄像头、麦克风以及扬声器添加时SDK 便会抛出此事件回调。
* @param deviceId 设备 ID。
* @param type 设备类型。
* @param state 通断状态0设备已添加1设备已被移除2设备已启用。
*/
- (void)onDeviceChanged:(NSString*)deviceId type:(TUIMediaDeviceType)type state:(TUIMediaDeviceState)state NS_SWIFT_NAME(onDeviceChanged(deviceId:type:state:));
/**
* 测试摄像头画面渲染成功回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试摄像头画面渲染成功时SDK 便会抛出此事件回调。
* @param width 画面的宽度。
* @param height 画面的高度。
*/
- (void)onTestCameraVideoFrameRendered:(NSInteger)width height:(NSInteger)height NS_SWIFT_NAME(onTestCameraVideoFrameRendered(width:height:));
/**
* 测试麦克风时的音量回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试麦克风时SDK 便会抛出此事件回调。
* @param volume 麦克风采集到的音量值取值范围0 - 100。
*/
- (void)onTestMicVolume:(NSInteger)volume NS_SWIFT_NAME(onTestMicVolume(volume:));
/**
* 测试扬声器时的音量回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。当本地测试扬声器时SDK 便会抛出此事件回调。
* @param volume SDK 提交给扬声器去播放的声音的音量取值范围0 - 100。
*/
- (void)onTestSpeakerVolume:(NSInteger)volume NS_SWIFT_NAME(onTestSpeakerVolume(volume:));
@end
#endif
/////////////////////////////////////////////////////////////////////////////////
//
// 设备管理相关接口
//
/////////////////////////////////////////////////////////////////////////////////
TUIENGINE_EXPORT @interface TUIRoomDeviceManager : NSObject
#if TARGET_OS_IPHONE
/**
* 判断当前是否为前置摄像头(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (BOOL)isFrontCamera NS_SWIFT_NAME(isFrontCamera());
/**
* 切换前置或后置摄像头(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)switchCamera:(BOOL)frontCamera NS_SWIFT_NAME(switchCamera(_:));
/**
* 查询是否支持自动识别人脸位置(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (BOOL)isAutoFocusEnabled NS_SWIFT_NAME(isAutoFocusEnabled());
/**
* 开启自动对焦功能(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 开启后SDK 会自动检测画面中的人脸位置,并将摄像头的焦点始终对焦在人脸位置上。
*/
- (void)enableCameraAutoFocus:(BOOL)enabled NS_SWIFT_NAME(enableCameraAutoFocus(_:));
/**
* 开启/关闭闪光灯,也就是手电筒模式(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)enableCameraTorch:(BOOL)enabled NS_SWIFT_NAME(enableCameraTorch(_:));
/**
* 设置音频路由(仅支持移动端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 手机有两个音频播放设备:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
- (void)setAudioRoute:(TUIAudioRoute)route NS_SWIFT_NAME(setAudioRoute(_:));
#endif
#if !TARGET_OS_IPHONE && TARGET_OS_OSX
/**
* 设置事件回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 您可以通过 TUIRoomDeviceManagerObserver 获得各类事件通知。
* @param observer 监听的实例。
*/
- (void)setObserver:(id<TUIRoomDeviceManagerObserver>)observer NS_SWIFT_NAME(setObserver(_:));
/**
* 开始摄像头测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。在测试过程中可以使用 {@link $setCurrentDevice$} 接口切换摄像头。
*/
- (void)startCameraDeviceTest:(TUIVideoView* __nullable)view NS_SWIFT_NAME(startCameraDeviceTest(view:));
/**
* 结束摄像头测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopCameraDeviceTest NS_SWIFT_NAME(stopCameraDeviceTest());
/**
* 开始麦克风测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 该接口可以测试麦克风是否能正常工作,测试到的麦克风采集音量的大小,会以回调的形式通知给您,其中 volume 的取值范围为0 - 100。
* @param interval 麦克风音量的回调间隔。
* @param playback 是否开启回播麦克风声音,开启后用户测试麦克风时会听到自己的声音。
*/
- (void)startMicDeviceTest:(NSInteger)interval playback:(BOOL)playback NS_SWIFT_NAME(startMicDeviceTest(interval:playback:));
/**
* 结束麦克风测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopMicDeviceTest NS_SWIFT_NAME(stopMicDeviceTest());
/**
* 开始扬声器测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* 该接口通过播放指定的音频文件,用于测试播放设备是否能正常工作。如果用户在测试时能听到声音,说明播放设备能正常工作。
* @param filePath 声音文件的路径。
*/
- (void)startSpeakerDeviceTest:(NSString*)filePath NS_SWIFT_NAME(startSpeakerDeviceTest(filePath:));
/**
* 结束扬声器测试(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
*/
- (void)stopSpeakerDeviceTest NS_SWIFT_NAME(stopSpeakerDeviceTest());
/**
* 获取设备列表(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,指定需要获取哪种设备的列表。详见 {@link $TUIMediaDeviceType$} 定义。
*/
- (void)getDevicesList:(TUIMediaDeviceType)type callback:(TUIDeviceListBlock)callback NS_SWIFT_NAME(getDevicesList(type:callback:));
/**
* 设置当前要使用的设备(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,详见 {@link $TUIMediaDeviceType$} 定义。
* @param deviceId 设备ID您可以通过接口 {@link getDevicesList} 获得设备 ID。
*/
- (void)setCurrentDevice:(TUIMediaDeviceType)type deviceId:(NSString*)deviceId NS_SWIFT_NAME(setCurrentDevice(type:deviceId:));
/**
* 获取当前正在使用的设备(仅支持桌面端)
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link TUIRoomTypeLive})。
* @param type 设备类型,详见 {@link $TUIMediaDeviceType$} 定义。
*/
- (void)getCurrentDevice:(TUIMediaDeviceType)type callback:(TUIDeviceInfoBlock)callback NS_SWIFT_NAME(getCurrentDevice(type:callback:));
#endif
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,502 @@
/**
* Copyright (c) 2024 Tencent. All rights reserved.
* Module: TUIRoomObserver @ TUIKitEngine
* Function: TUIRoomEngine的事件回调接口
*/
#import <Foundation/Foundation.h>
#import "TUIRoomDefine.h"
#import "TUIRoomDeviceManager.h"
NS_ASSUME_NONNULL_BEGIN
@protocol TUIRoomObserver <NSObject>
@optional
/////////////////////////////////////////////////////////////////////////////////
//
// 错误事件回调
//
///////////////////////////////////////////////////////////////
/**
* 1.1 错误事件回调
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当发生错误事件时触发,表示 SDK
* 抛出的不可恢复的错误,例如进入房间失败或设备开启失败等。
* @param errorCode 错误码,请参见:{@link TUIError}。
* @param message 错误信息。
*/
- (void)onError:(TUIError)errorCode
message:(NSString *)message NS_SWIFT_NAME(onError(error:message:));
/////////////////////////////////////////////////////////////////////////////////
//
// 登录状态事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 2.1 用户被踢下线
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下线时触发。
* @param message 被踢下线的描述。
*/
- (void)onKickedOffLine:(NSString *)message NS_SWIFT_NAME(onKickedOffLine(message:));
/**
* 2.2 用户凭证超时事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的凭证过期时触发。
*/
- (void)onUserSigExpired NS_SWIFT_NAME(onUserSigExpired());
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 3.1 房间名称更改事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间名称改变时触发。
* @param roomId 房间ID。
* @param roomName 房间名称。
*/
- (void)onRoomNameChanged:(NSString *)roomId
roomName:(NSString *)roomName NS_SWIFT_NAME(onRoomNameChanged(roomId:roomName:));
/**
* 3.2 房间内所有用户麦克风被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的麦克风禁用状态改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onAllUserMicrophoneDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onAllUserMicrophoneDisableChanged(roomId:isDisable:));
/**
* 3.3 房间内所有用户摄像头被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的摄像头禁用状态改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onAllUserCameraDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onAllUserCameraDisableChanged(roomId:isDisable:));
/**
* 3.4 房间内所有用户屏幕分享被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的屏幕共享权限改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onScreenShareForAllUserDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onScreenShareForAllUserDisableChanged(roomId:isDisable:));
/**
* 3.5 房间内用户发送文本消息被禁用事件
*
* @note 此函数仅支持会议房间类型({@link TUIRoomTypeConference})。
* 所有用户的发送消息权限改变时触发。
* @param roomId 房间ID。
* @param isDisable 是否被禁用。
*/
- (void)onSendMessageForAllUserDisableChanged:(NSString *)roomId
isDisable:(BOOL)isDisable
NS_SWIFT_NAME(onSendMessageForAllUserDisableChanged(roomId:isDisable:));
/**
* 3.6 房间被解散事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间被解散时触发。
* @param roomId 房间ID。
* @param reason 房间解散原因,请参见:{@link TUIRoomDismissedReason}。
*/
- (void)onRoomDismissed:(NSString *)roomId
reason:(TUIRoomDismissedReason)reason
NS_SWIFT_NAME(onRoomDismissed(roomId:reason:));
/**
* 3.7 被踢出房间事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户被房主/管理员踢出房间触发。
* @param roomId 房间ID。
* @param reason 被踢出原因。
* @param message 被踢出的描述。
*/
- (void)onKickedOutOfRoom:(NSString *)roomId
reason:(TUIKickedOutOfRoomReason)reason
message:(NSString *)message
NS_SWIFT_NAME(onKickedOutOfRoom(roomId:reason:message:));
/**
* 3.8 房间上麦模式发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间上麦模式发生变化时触发
* @param roomId 房间ID。
* @param seatMode 上麦模式。
*/
- (void)onRoomSeatModeChanged:(NSString *)roomId
seatMode:(TUISeatMode)seatMode
NS_SWIFT_NAME(onRoomSeatModeChanged(roomId:seatMode:));
/**
* 3.9 房间内人员数量发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间内人数发生变化时触发。
* @param roomId 房间ID。
* @param userCount 人员数量。
*/
- (void)onRoomUserCountChanged:(NSString *)roomId
userCount:(NSInteger)userCount
NS_SWIFT_NAME(onRoomUserCountChanged(roomId:userCount:));
/**
* 3.10 房间内自定义信息发生变化
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 房间自定义信息改变时触发。
* @param key 房间自定义信息 key
* @param value 房间自定义信息 value
*/
- (void)onRoomMetadataChanged:(NSString *)key
value:(NSString *)value NS_SWIFT_NAME(onRoomMetadataChanged(key:value:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内用户事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 4.1 远端用户进房事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 远端用户进入房间时触发。
* @param roomId 房间ID。
* @param userInfo 用户信息。
*/
- (void)onRemoteUserEnterRoom:(NSString *)roomId
userInfo:(TUIUserInfo *)userInfo
NS_SWIFT_NAME(onRemoteUserEnterRoom(roomId:userInfo:));
/**
* 4.2 远端用户离开房间事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 远端用户离开房间时触发。
* @param roomId 房间ID。
* @param userInfo 用户信息。
*/
- (void)onRemoteUserLeaveRoom:(NSString *)roomId
userInfo:(TUIUserInfo *)userInfo
NS_SWIFT_NAME(onRemoteUserLeaveRoom(roomId:userInfo:));
/**
* 4.3 房间内用户信息发生变化事件。
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当房间内用户信息发生变化时触发。
* @param userInfo 用户信息。
* @param modifyFlag 用户信息参数变更Key, 可参考{@link TUIUserInfoModifyFlag}。
*/
- (void)onUserInfoChanged:(TUIUserInfo *)userInfo
modifyFlag:(TUIUserInfoModifyFlag)modifyFlag
NS_SWIFT_NAME(onUserInfoChanged(userInfo:modifyFlag:));
/**
* 4.4 用户视频状态发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的视频状态改变时触发。
* @param userId 用户ID。
* @param streamType 视频流类型。
* @param hasVideo 是否有视频流。
* @param reason 视频流发生变化原因 {@link TUIChangeReasonBySelf}: 自己切换 {@link
* TUIChangeReasonByAdmin}: 被管理员切换。
*/
- (void)onUserVideoStateChanged:(NSString *)userId
streamType:(TUIVideoStreamType)streamType
hasVideo:(BOOL)hasVideo
reason:(TUIChangeReason)reason
NS_SWIFT_NAME(onUserVideoStateChanged(userId:streamType:hasVideo:reason:));
/**
* 4.5 用户音频状态发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的音频状态改变时触发。
* @param userId 用户ID。
* @param hasAudio 是否有音频流。
* @param reason 视频流发生变化原因 {@link TUIChangeReasonBySelf}: 自己切换 {@link
* TUIChangeReasonByAdmin}: 被管理员切换。
*/
- (void)onUserAudioStateChanged:(NSString *)userId
hasAudio:(BOOL)hasAudio
reason:(TUIChangeReason)reason
NS_SWIFT_NAME(onUserAudioStateChanged(userId:hasAudio:reason:));
/**
* 4.6 用户音量变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的音量改变时触发。
* @param volumeMap 用户音量字典 key: userId, value: 用于承载所有正在说话的用户的音量大小,取值范围
* 0 - 100。
*/
- (void)onUserVoiceVolumeChanged:(NSDictionary<NSString *, NSNumber *> *)volumeMap
NS_SWIFT_NAME(onUserVoiceVolumeChanged(volumeMap:));
/**
* 4.7 用户文本消息发送能力发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的发送消息权限改变时触发。
* @param userId 用户ID。
* @param isDisable 是否被禁止发送文本消息 {@link YES}: 用户被禁止发送消息 {@link NO}:
* 用户被解除禁止,可以发送消息。
*/
- (void)onSendMessageForUserDisableChanged:(NSString *)roomId
userId:(NSString *)userId
isDisable:(BOOL)muted
NS_SWIFT_NAME(OnSendMessageForUserDisableChanged(roomId:userId:isDisable:));
/**
* 4.8 用户网络状态变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户的网络质量改变时触发。
* @param networkList 用户网络状态数组,可参见 {@link TUINetworkInfo} 对象。
*/
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkInfo *> *)networkList
NS_SWIFT_NAME(onUserNetworkQualityChanged(networkList:));
/**
* 4.9 屏幕分享暂停
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享暂停时触发。
* @param reason
* 暂停原因0用户主动暂停1屏幕窗口不可见暂停Mac或设置屏幕分享参数导致的暂停Windows2屏幕分享窗口被最小化导致的暂停
* Windows3屏幕分享窗口被隐藏导致的暂停仅 Windows)4系统停止录屏仅iOS
*/
- (void)onUserScreenCapturePaused:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCapturePaused(reason:));
/**
* 4.10 屏幕分享恢复
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享恢复时触发。
* @param reason
* 恢复原因0用户主动恢复1屏幕窗口恢复可见从而恢复分享Mac或屏幕分享参数设置完毕后自动恢复Windows2屏幕分享窗口从最小化被恢复
* Windows3屏幕分享窗口从隐藏被恢复仅 Windows4系统恢复录屏仅iOS
*/
- (void)onUserScreenCaptureResumed:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCaptureResumed(reason:));
/**
* 4.11 屏幕分享结束
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 用户的屏幕分享停止时触发。
* @param reason
* 停止原因0用户主动停止1屏幕窗口关闭导致停止2表示屏幕分享的显示屏状态变更如接口被拔出、投影模式变更等
*/
- (void)onUserScreenCaptureStopped:(NSInteger)reason
NS_SWIFT_NAME(onUserScreenCaptureStopped(reason:));
/**
* 4.12 用户视频大小发生改变
*
* @note 此函数支持直播房间类型({@link TUIRoomTypeLive})。
* 用户视频大小发生改变时触发。
* @param roomId 房间ID。
* @param userId 当本地为观众且与主播成功连麦时该参数表示主播的用户ID否则表示混流ID。
* @param streamType 视频流类型。
* @param width 视频流的宽度。
* @param height 视频流的高度。
*/
- (void)onUserVideoSizeChanged:(NSString *)roomId
userId:(NSString *)userId
streamType:(TUIVideoStreamType)streamType
width:(int)width
height:(int)height
NS_SWIFT_NAME(onUserVideoSizeChanged(roomId:userId:streamType:width:height:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内麦位事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 5.1 麦位列表发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当麦位列表改变时触发。
* @param roomId 当前的房间 ID
* @param seatList 目前麦上最新的用户列表,包含新上麦的用户。
* @param newlySeatedUsers 新上麦的用户列表。
* @param newlyLeftUsers 新下麦的用户列表。
*/
- (void)onSeatListChanged:(NSString *)roomId
seatList:(NSArray<TUISeatFullInfo *> *)seatList
newlySeatedUsers:(NSArray<TUIUserInfo *> *)newlySeatedUsers
newlyLeftUsers:(NSArray<TUIUserInfo *> *)newlyLeftUsers
NS_SWIFT_NAME(onSeatListChanged(roomId:seatList:newlySeatedUsers:newlyLeftUsers:));
/**
* 5.2 收到用户被踢下麦事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下麦时触发。
* @param seatIndex 麦位编号。
* @param operateUser 操作踢人的(主持人/管理员)用户信息。
* @param extensionInfo 扩展信息。
*/
- (void)onKickedOffSeat:(NSInteger)seatIndex
operateUser:(TUIUserInfo *)operateUser
extensionInfo:(NSString *)extensionInfo
NS_SWIFT_NAME(onKickedOffSeat(seatIndex:operateUser:extensionInfo:));
/////////////////////////////////////////////////////////////////////////////////
//
// 请求信令事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 6.1 收到请求消息事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当收到其他用户的请求时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
*/
- (void)onRequestReceived:(TUIRequest *)request NS_SWIFT_NAME(onRequestReceived(request:));
/**
* 6.2 收到请求被取消的事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当其他用户取消请求时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
* @param operateUser 取消信令的用户信息。
*/
- (void)onRequestCancelled:(TUIRequest *)request
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onRequestCancelled(request:operateUser:));
/**
* 6.3 收到请求被其他 管理员/房主 处理事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 收到请求被其他 管理员/房主 处理时触发。
* @param request 请求内容,可参见 {@link TUIRequest} 对象。
* @param operateUser 取消信令的用户信息。
*/
- (void)onRequestProcessed:(TUIRequest *)request
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onRequestProcessed(request:operateUser:));
/////////////////////////////////////////////////////////////////////////////////
//
// 房间内消息回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 7.1 收到了文本消息
*
* @param textMessage 消息对象,可参见 {@link $TUIRoomTextMessage$} 对象。
*/
- (void)onReceiveTextMessage:(TUIRoomTextMessage *)textMessage
NS_SWIFT_NAME(onReceiveTextMessage(textMessage:));
/**
* 7.2 收到了自定义消息
*
* @param customMessage 消息对象,可参见 {@link $TUIRoomCustomMessage$} 对象。
*/
- (void)onReceiveCustomMessage:(TUIRoomCustomMessage *)customMessage
NS_SWIFT_NAME(onReceiveCustomMessage(customMessage:));
/////////////////////////////////////////////////////////////////////////////////
//
// 废弃回调
//
/////////////////////////////////////////////////////////////////////////////////
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
/**
* 本地设备添加事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。
* 当用户的设备状态发生改变时触发例如用户的麦克风或摄像头被打开或关闭。当本地设备包括摄像头、麦克风以及扬声器添加时SDK
* 便会抛出此事件回调。
* @deprecated v2.0 版本开始不推荐使用,建议使用{$TUIRoomDeviceManager$}中的{@link
* onDeviceChanged}代替。
* @param deviceId 设备 ID。
* @param type 设备类型。
* @param state 通断状态0设备已添加1设备已被移除2设备已启用。
*/
- (void)onDeviceChanged:(NSString *)deviceId
type:(TUIMediaDeviceType)type
state:(TUIMediaDeviceState)state
NS_SWIFT_NAME(onDeviceChanged(deviceId:type:state:))
__attribute__((deprecated("use onDeviceChanged in TUIRoomDeviceManager instead")));
#endif
/**
* 麦位列表发生变化事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当麦位列表改变时触发。
* @deprecated 此回调在 v3.5 版本开始废弃,未来会被回收,请使用 onSeatListChanged(roomId, seatList,
* newlySeatedUsers, newlyLeftUsers) 代替。
* @param seatList 目前麦上最新的用户列表,包含新上麦的用户。
* @param seatedList 新上麦的用户列表。
* @param leftList 新下麦的用户列表。
*/
- (void)onSeatListChanged:(NSArray<TUISeatInfo *> *)seatList
seated:(NSArray<TUISeatInfo *> *)seatedList
left:(NSArray<TUISeatInfo *> *)leftList
NS_SWIFT_NAME(onSeatListChanged(seatList:seated:left:)) __attribute__((deprecated(
"use onSeatListChanged(roomId:seatList:newlySeatedUsers:newlyLeftUsers:) instead")));
/**
* 收到用户被踢下麦事件
*
* @note 此函数支持会议房间类型和直播房间类型({@link TUIRoomTypeConference} & {@link
* TUIRoomTypeLive})。 当用户被踢下麦时触发。
* @deprecated 此回调在 v3.5 版本开始废弃,未来会被回收,请使用 onKickedOffSeat(seatIndex,
* operateUser, extensionInfo) 代替。
* @param seatIndex 麦位编号。
* @param operateUser 操作踢人的(主持人/管理员)用户信息。
*/
- (void)onKickedOffSeat:(NSInteger)seatIndex
operateUser:(TUIUserInfo *)operateUser
NS_SWIFT_NAME(onKickedOffSeat(seatIndex:operateUser:));
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>22G91</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>RTCRoomEngine</string>
<key>CFBundleIdentifier</key>
<string>com.tencent.cloud.roomengine</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>RTCRoomEngine</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>3.5.0.955</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>iPhoneSimulator</string>
</array>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string></string>
<key>DTPlatformName</key>
<string>iphonesimulator</string>
<key>DTPlatformVersion</key>
<string>15.2</string>
<key>DTSDKBuild</key>
<string>21C52</string>
<key>DTSDKName</key>
<string>iphonesimulator15.2</string>
<key>DTXcode</key>
<string>1510</string>
<key>DTXcodeBuild</key>
<string>15C65</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
<key>NSPrincipalClass</key>
<string></string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,6 @@
framework module RTCRoomEngine {
umbrella header "RTCEngine.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
</dict>
</plist>