Commit b1ccf7e8 by 徐利超

update

parent 79b98df1
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>MutiFaceDemo.xcscheme_^#shared#^_</key> <key>MutiFaceDemo.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>2</integer>
</dict> </dict>
</dict> </dict>
</dict> </dict>
......
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:MutiFaceDemo.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
<?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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
@interface AppDelegate : UIResponder <UIApplicationDelegate> @interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow *window;
@end @end
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
// //
#import "AppDelegate.h" #import "AppDelegate.h"
#import <NIMSDK/NIMSDK.h>
#import "LoginViewController.h"
#define NIMAppKey @"4ea930ab3d6fb1f3613e9877332c9dd9"
@interface AppDelegate () @interface AppDelegate ()
...@@ -17,25 +21,22 @@ ...@@ -17,25 +21,22 @@
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // Override point for customization after application launch.
// [[NIMAVChatSDK sharedSDK] serverSetting];
NIMSDKOption *option = [NIMSDKOption optionWithAppKey:NIMAppKey];
[[NIMSDK sharedSDK] registerWithOption:option];
if (!self.window) {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}
if (!self.window.rootViewController) {
LoginViewController *loginVC = [[LoginViewController alloc] init];
self.window.rootViewController = loginVC;
[self.window makeKeyAndVisible];
}
return YES; return YES;
} }
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end @end
//
// MutiFaceViewController.h
// MutiFaceDemo
//
// Created by Xu Lichao on 2020/1/21.
// Copyright © 2020 Yuwei. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MutiFaceViewController : UIViewController
@property (nonatomic, strong) NSString *roomName;
@property (nonatomic, assign) BOOL needCreate;
@end
NS_ASSUME_NONNULL_END
//
// LoginViewController.h
// MutiFaceDemo
//
// Created by Xu Lichao on 2020/1/21.
// Copyright © 2020 Yuwei. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface LoginViewController : UIViewController
@end
NS_ASSUME_NONNULL_END
//
// LoginViewController.m
// MutiFaceDemo
//
// Created by Xu Lichao on 2020/1/21.
// Copyright © 2020 Yuwei. All rights reserved.
//
#import "LoginViewController.h"
#import <NIMSDK/NIMSDK.h>
#import "MutiFaceViewController.h"
@interface LoginViewController ()
@property (nonatomic, strong) UIView *loginView;
@property (nonatomic, strong) UIButton *user1;
@property (nonatomic, strong) UIButton *user2;
@property (nonatomic, strong) UIButton *user3;
@property (nonatomic, strong) UIView *userView;
@property (nonatomic, strong) UIButton *quitBtn;
@property (nonatomic, strong) UILabel *userLabel;
@property (nonatomic, strong) UIView *roomView;
@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) UIButton *creatRoomBtn;
@property (nonatomic, strong) UIButton *joinRoomBtn;
@end
@implementation LoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
- (void)setupUI
{
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.loginView];
[_loginView addSubview:self.user1];
[_loginView addSubview:self.user2];
[_loginView addSubview:self.user3];
[self.view addSubview:self.userView];
[_userView addSubview:self.userLabel];
[_userView addSubview:self.quitBtn];
[self.view addSubview:self.roomView];
[_roomView addSubview:self.textField];
[_roomView addSubview:self.creatRoomBtn];
[_roomView addSubview:self.joinRoomBtn];
_userView.hidden = YES;
_roomView.hidden = YES;
}
#pragma mark - methods
- (void)updateViewWhenLoginSuccess
{
_loginView.hidden = YES;
_userView.hidden = NO;
_roomView.hidden = NO;
}
- (void)updateViewWhenQuitSuccess
{
_loginView.hidden = NO;
_userView.hidden = YES;
_roomView.hidden = YES;
}
#pragma mark - IBAction
- (void)user1Login
{
CHWEAKSELF
[[[NIMSDK sharedSDK] loginManager] login:@"hzyw1564536238433" token:@"e66363a51c4e260558c45da570248e56" completion:^(NSError * _Nullable error) {
CHSTRONGSELF
if (error) {
TraceS(@"======>>>>>%@",error);
[MBHUDTool showMessage:error.domain];
}else {
TraceS(@"云信登陆成功");
strongSelf.userLabel.text = @"用户1已经登陆";
[strongSelf updateViewWhenLoginSuccess];
}
}];
}
- (void)user2Login
{
CHWEAKSELF
[[[NIMSDK sharedSDK] loginManager] login:@"hzyw1564536932643" token:@"b7d0b0e251be61425e82fb75d0aa0e03" completion:^(NSError * _Nullable error) {
CHSTRONGSELF
if (error) {
TraceS(@"%@",error);
[MBHUDTool showMessage:error.domain];
}else {
TraceS(@"云信登陆成功");
strongSelf.userLabel.text = @"用户2已经登陆";
[strongSelf updateViewWhenLoginSuccess];
}
}];
}
- (void)user3Login
{
CHWEAKSELF
[[[NIMSDK sharedSDK] loginManager] login:@"hzyw1564538246299" token:@"2862bbc024662c2b8f9db0527ff4c085" completion:^(NSError * _Nullable error) {
CHSTRONGSELF
if (error) {
TraceS(@"%@",error);
[MBHUDTool showMessage:error.domain];
}else {
TraceS(@"云信登陆成功");
strongSelf.userLabel.text = @"用户3已经登陆";
[strongSelf updateViewWhenLoginSuccess];
}
}];
}
- (void)quitBtnTouched
{
CHWEAKSELF
[[[NIMSDK sharedSDK] loginManager] logout:^(NSError * _Nullable error) {
CHSTRONGSELF
[strongSelf updateViewWhenQuitSuccess];
}];
}
- (void)createRoomBtnTouched
{
MutiFaceViewController *vc = [[MutiFaceViewController alloc] init];
vc.roomName = self.textField.text;
vc.needCreate = YES;
[self presentViewController:vc animated:YES completion:nil];
}
- (void)joinRoomBtnTouched
{
MutiFaceViewController *vc = [[MutiFaceViewController alloc] init];
vc.roomName = self.textField.text;
vc.needCreate = NO;
[self presentViewController:vc animated:YES completion:nil];
}
#pragma mark - setter/getter
- (UIView *)loginView
{
if (!_loginView) {
_loginView = [[UIView alloc] initWithFrame:CGRectMake(0, 40, SCREEN_WIDTH, 200)];
_loginView.backgroundColor = [UIColor whiteColor];
}
return _loginView;
}
- (UIButton *)user1
{
if (!_user1) {
_user1 = [[UIButton alloc] initWithFrame:CGRectMake(40, 10, 100, 44)];
[_user1 setTitle:@"用户1登陆" forState:UIControlStateNormal];
[_user1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_user1.titleLabel.font = [UIFont systemFontOfSize:14];
_user1.layer.cornerRadius = 4;
_user1.layer.borderWidth = 1;
_user1.layer.borderColor = [UIColor blackColor].CGColor;
_user1.clipsToBounds = YES;
[_user1 addTarget:self action:@selector(user1Login) forControlEvents:UIControlEventTouchUpInside];
}
return _user1;
}
- (UIButton *)user2
{
if (!_user2) {
_user2 = [[UIButton alloc] initWithFrame:CGRectMake(40, 60, 100, 44)];
[_user2 setTitle:@"用户2登陆" forState:UIControlStateNormal];
[_user2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_user2.titleLabel.font = [UIFont systemFontOfSize:14];
_user2.layer.cornerRadius = 4;
_user2.layer.borderWidth = 1;
_user2.layer.borderColor = [UIColor blackColor].CGColor;
_user2.clipsToBounds = YES;
[_user2 addTarget:self action:@selector(user2Login) forControlEvents:UIControlEventTouchUpInside];
}
return _user2;
}
- (UIButton *)user3
{
if (!_user3) {
_user3 = [[UIButton alloc] initWithFrame:CGRectMake(40, 110, 100, 44)];
[_user3 setTitle:@"用户3登陆" forState:UIControlStateNormal];
[_user3 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_user3.titleLabel.font = [UIFont systemFontOfSize:14];
_user3.layer.cornerRadius = 4;
_user3.layer.borderWidth = 1;
_user3.layer.borderColor = [UIColor blackColor].CGColor;
_user3.clipsToBounds = YES;
[_user3 addTarget:self action:@selector(user3Login) forControlEvents:UIControlEventTouchUpInside];
}
return _user3;
}
- (UIView *)userView
{
if (!_userView) {
_userView = [[UIView alloc] initWithFrame:CGRectMake(0, 40, SCREEN_WIDTH, 100)];
_userView.backgroundColor = [UIColor whiteColor];
}
return _userView;
}
- (UILabel *)userLabel
{
if (!_userLabel) {
_userLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, SCREEN_WIDTH - 40, 20)];
_userLabel.textColor = [UIColor blackColor];
_userLabel.font = [UIFont systemFontOfSize:16];
}
return _userLabel;
}
- (UIButton *)quitBtn
{
if (!_quitBtn) {
_quitBtn = [[UIButton alloc] initWithFrame:CGRectMake(20, 40, 100, 44)];
[_quitBtn setTitle:@"退出登陆" forState:UIControlStateNormal];
[_quitBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_quitBtn.titleLabel.font = [UIFont systemFontOfSize:14];
_quitBtn.layer.cornerRadius = 4;
_quitBtn.layer.borderWidth = 1;
_quitBtn.layer.borderColor = [UIColor blackColor].CGColor;
_quitBtn.clipsToBounds = YES;
[_quitBtn addTarget:self action:@selector(quitBtnTouched) forControlEvents:UIControlEventTouchUpInside];
}
return _quitBtn;
}
- (UIView *)roomView
{
if (!_roomView) {
_roomView = [[UIView alloc] initWithFrame:CGRectMake(0, 300, SCREEN_WIDTH, 100)];
}
return _roomView;
}
- (UITextField *)textField
{
if (!_textField) {
_textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 10, 200, 30)];
_textField.text = @"YWTestRoomName_1";
_textField.font = kFont(14);
_textField.layer.borderWidth = 1;
_textField.layer.borderColor = [UIColor blackColor].CGColor;
_textField.layer.cornerRadius = 4;
_textField.clipsToBounds = YES;
}
return _textField;
}
- (UIButton *)creatRoomBtn
{
if (!_creatRoomBtn) {
_creatRoomBtn = [[UIButton alloc] initWithFrame:CGRectMake(20, 50, 80, 30)];
[_creatRoomBtn setTitle:@"创建并加入房间" forState:UIControlStateNormal];
[_creatRoomBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_creatRoomBtn.titleLabel.font = [UIFont systemFontOfSize:14];
_creatRoomBtn.layer.cornerRadius = 4;
_creatRoomBtn.layer.borderWidth = 1;
_creatRoomBtn.layer.borderColor = [UIColor blackColor].CGColor;
_creatRoomBtn.clipsToBounds = YES;
[_creatRoomBtn addTarget:self action:@selector(createRoomBtnTouched) forControlEvents:UIControlEventTouchUpInside];
}
return _creatRoomBtn;
}
- (UIButton *)joinRoomBtn
{
if (!_joinRoomBtn) {
_joinRoomBtn = [[UIButton alloc] initWithFrame:CGRectMake(120, 50, 80, 30)];
[_joinRoomBtn setTitle:@"加入房间" forState:UIControlStateNormal];
[_joinRoomBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_joinRoomBtn.titleLabel.font = [UIFont systemFontOfSize:14];
_joinRoomBtn.layer.cornerRadius = 4;
_joinRoomBtn.layer.borderWidth = 1;
_joinRoomBtn.layer.borderColor = [UIColor blackColor].CGColor;
_joinRoomBtn.clipsToBounds = YES;
[_joinRoomBtn addTarget:self action:@selector(joinRoomBtnTouched) forControlEvents:UIControlEventTouchUpInside];
}
return _joinRoomBtn;
}
@end
...@@ -20,29 +20,8 @@ ...@@ -20,29 +20,8 @@
<string>1</string> <string>1</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
<array> <array>
<string>armv7</string> <string>armv7</string>
......
//
// PrefixHeader.pch
// MutiFaceDemo
//
// Created by Xu Lichao on 2020/1/21.
// Copyright © 2020 Yuwei. All rights reserved.
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "MBHUDTool.h"
#import <NIMSDK/NIMSDK.h>
#import <NIMAVChat/NIMAVChat.h>
#endif
//weakSelf 宏定义
#define CHWEAKSELF __weak __typeof(&*self)weakSelf = self;
#define CHSTRONGSELF __strong __typeof(weakSelf) strongSelf = weakSelf;
#define kImage(name) [UIImage imageNamed:name]
#define kFont(size) [UIFont systemFontOfSize:size]
#define kBoldFont(size) [UIFont boldSystemFontOfSize:size]
#define SCREEN_SIZE [UIScreen mainScreen].bounds.size
#define SCREEN_WIDTH SCREEN_SIZE.width
#define SCREEN_HEIGHT SCREEN_SIZE.height
//whether this string is empty
#define ISEmptyString(str) (!str || str.length == 0)
//非空判2
#define IsNilOrNull(_ref) (((_ref) == nil) || ([(_ref) isEqual:[NSNull null]]))
#ifdef DEBUG
#define TraceS(NSString_format, ...) NSLog(@"%@", [NSString stringWithFormat:(NSString_format), ##__VA_ARGS__])
#else
#define TraceS(NSString_format, ...)
#endif
//
// MBHUDTool.h
// IdealOfFarming
//
// Created by Chaoooo on 2018/8/2.
// Copyright © 2018年 Hangzhou Transfar. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "MBProgressHUD.h"
@interface MBHUDTool : NSObject
/**
* @brief 只显示文字
*
* @param message 要显示的文字
*/
+ (MBProgressHUD *)showMessage:(NSString *)message;
+ (MBProgressHUD *)showMessage:(NSString *)message inView:(UIView *)sView;
+ (MBProgressHUD *)showMessage:(NSString *)message inView:(UIView *)sView hide:(NSUInteger)seconds;
- (void)showLodingMessage:(NSString *)message inView:(UIView *)view;
- (void)hiddenLodingMessageInView:(UIView *)view;
@end
//
// MBHUDTool.m
// IdealOfFarming
//
// Created by Chaoooo on 2018/8/2.
// Copyright © 2018年 Hangzhou Transfar. All rights reserved.
//
#import "MBHUDTool.h"
@implementation MBHUDTool
+ (MBProgressHUD *)showMessage:(NSString *)message
{
return [self showMessage:message inView:nil];
}
+ (MBProgressHUD *)showMessage:(NSString *)message inView:(UIView *)sView;
{
return [self showMessage:message inView:sView hide:1.5f];
}
+ (MBProgressHUD *)showMessage:(NSString *)message inView:(UIView *)sView hide:(NSUInteger)seconds
{
if (sView == nil) {
sView = [UIApplication sharedApplication].keyWindow;
}
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:sView animated:YES];
hud.mode = MBProgressHUDModeText;
hud.detailsLabel.text = message;
hud.detailsLabel.font = kFont(14);
[hud hideAnimated:YES afterDelay:seconds];
return hud;
}
- (void)showLodingMessage:(NSString *)message inView:(UIView *)view
{
if (view == nil) {
view = [UIApplication sharedApplication].keyWindow;
}
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES];
hud.detailsLabel.text = message;
hud.minSize = CGSizeMake(150.f, 100.f);
}
- (void)hiddenLodingMessageInView:(UIView *)view
{
if (view == nil) {
view = [UIApplication sharedApplication].keyWindow;
}
dispatch_async(dispatch_get_main_queue(), ^{
MBProgressHUD *hud = [MBProgressHUD HUDForView:view];
[hud hideAnimated:YES];
});
}
@end
//
// NIMAVChat.h
// NIMAVChat
//
// Created by Netease
// Copyright © 2016 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
/**
* 实时会话定义
*/
#import "NIMRTSManagerProtocol.h"
#import "NIMRTSOption.h"
#import "NIMRTSRecordingInfo.h"
/**
* 多方实时会话定义
*/
#import "NIMRTSConferenceManagerProtocol.h"
#import "NIMRTSConference.h"
#import "NIMRTSConferenceData.h"
#import "NIMRTSSocksParam.h"
/**
* 音视频网络通话定义
*/
#import "NIMNetCallManagerProtocol.h"
#import "NIMNetCallOption.h"
#import "NIMNetCallRecordingInfo.h"
#import "NIMNetCallMeeting.h"
#import "NIMNetCallUserInfo.h"
#import "NIMNetCallAudioFileMixTask.h"
#import "NIMNetCallVideoCaptureParam.h"
#import "NIMNetCallCustomVideoParam.h"
#import "NIMNetCallVideoProcessorParam.h"
#import "NIMNetCallServerRecord.h"
#import "NIMNetCallSocksParam.h"
#import "NIMNetCallAudioCustomInputTask.h"
#import "NIMNetCallNetstat.h"
#import "NIMNetCallMP4RecordOption.h"
#import "NIMNetCallRenderMode.h"
#import "NIMNetCallBypassTaskConfig.h"
#import "NIMNetCallRecordsSearchOption.h"
#ifdef NIM_MAC
#import "NIMNetCallMacAudioDevice.h"
#endif
#import "NIMNetCallVideoDevice.h"
/**
* 网络探测定义
*/
#import "NIMAVChatNetDetectManagerProtocol.h"
#import "NIMAVChatNetDetectResult.h"
/**
* 音视频业务类
*/
#import "NIMAVChatServerSetting.h"
#import "NIMAVChatHeader.h"
/**
* 视频渲染
*/
#import "NIMNetCallRenderMode.h"
//
// NIMAVChatHeader.h
// NIMAVChat
//
// Created by Netease
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
@class NIMAVChatServerSetting;
NS_ASSUME_NONNULL_BEGIN
/**
* NIMAVChat SDK
*/
@interface NIMAVChatSDK : NSObject
/**
* 获取SDK实例
*
* @return NIMAVChatSDK实例
*/
+ (instancetype)sharedSDK;
/**
* 当前音视频服务器配置
* @discussion 私有化需要进行自定义设置,必须在注册 appkey 完成之前设置
*/
@property (nonatomic,strong) NIMAVChatServerSetting *serverSetting;
/**
* 网络通话管理类
*/
@property (nonatomic,strong,readonly) id<NIMNetCallManager> netCallManager;
/**
* 实时会话管理类(点对点)
*/
@property (nonatomic,strong,readonly) id<NIMRTSManager> rtsManager;
/**
* 多方实时会话管理类
*/
@property (nonatomic,strong,readonly) id<NIMRTSConferenceManager> rtsConferenceManager;
/**
音视频实时会话网络探测管理类
*/
@property (nonatomic,strong,readonly) id<NIMAVChatNetDetectManager> avchatNetDetectManager;
@end
NS_ASSUME_NONNULL_END
//
// NIMAVChatNetDetectManagerProtocol.h
// NIMAVChat
//
// Created by Netease.
// Copyright (c) 2016 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
@class NIMAVChatNetDetectResult;
/**
网络探测类型
*/
typedef NS_ENUM(NSUInteger, NIMAVChatNetDetectType)
{
/**
* 音频探测
*/
NIMAVChatNetDetectTypeAudio = 0,
/**
* 默认清晰度 (视频探测)
*/
NIMAVChatNetDetectTypeDefault ,
/**
* 低视频质量 (视频探测)
*/
NIMAVChatNetDetectTypeLow ,
/**
* 中等视频质量 (视频探测)
*/
NIMAVChatNetDetectTypeMedium ,
/**
* 高视频质量 (视频探测)
*/
NIMAVChatNetDetectTypeHigh ,
/**
* 480P (视频探测)
*/
NIMAVChatNetDetectType480P ,
/**
* 540P (视频探测)
*/
NIMAVChatNetDetectType540P ,
/**
* 720P (视频探测)
*/
NIMAVChatNetDetectType720P ,
};
/**
网络探测结果 Block
@param result 网络探测的结果
*/
typedef void(^NIMAVChatNetDetectCompleteBlock)(NIMAVChatNetDetectResult *result);
/**
* 音视频实时会话网络探测管理类
*/
@protocol NIMAVChatNetDetectManager <NSObject>
/**
* 开始网络探测任务
*
* @param detectType 探测类型 包括音频探测 及6种清晰度的视频探测
*
* @param completion 任务完成 block
*
* @return 开始的网络探测任务的 id,可以用该 id 停止该任务,如果返回 0 表示开始失败
*/
- (UInt64)startDetectTaskForDetectType:(NIMAVChatNetDetectType)detectType
completion:(NIMAVChatNetDetectCompleteBlock)completion;
/**
* 停止网络探测任务
*
* @param taskId 需要停止的任务的 id
*/
- (void)stopDetectTask:(UInt64)taskId;
/**
* 获得 SDK 网络探测 log 文件路径
*
* @return 网络探测 log 文件路径
*/
- (NSString *)logFilepath;
@end
NS_ASSUME_NONNULL_END
//
// NIMAVChatNetDetectResult.h
// NIMAVChat
//
// Created by Netease on 16/12/16.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
网络探测任务结果
*/
@interface NIMAVChatNetDetectResult : NSObject
/**
任务 id
*/
@property (nonatomic,assign,readonly) UInt64 taskId;
/**
任务执行结果,如果没有错误则为 nil
*/
@property (nonatomic,strong,readonly) NSError *error;
/**
丢包率百分比
*/
@property (nonatomic,assign,readonly) NSInteger lossRate;
/**
rtt 最大值
*/
@property (nonatomic,assign,readonly) NSInteger rttMaximal;
/**
rtt 最小值
*/
@property (nonatomic,assign,readonly) NSInteger rttMinimal;
/**
rtt 平均值
*/
@property (nonatomic,assign,readonly) NSInteger rttAverage;
/**
rtt 偏差
*/
@property (nonatomic,assign,readonly) NSInteger rttMeanDeviation;
/**
扩展信息
*/
@property (nonatomic,copy,readonly) NSString *expandInfo;
@end
//
// NIMAVChatServerSetting.h
// NIMAVChat
//
// Created by Simon Blue on 2018/6/12.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
* 音视频服务器地址
*/
@interface NIMAVChatServerSetting : NSObject
/**
* NRTC 服务器地址
*/
@property (nonatomic, copy)NSString *nrtcServerAddress;
/**
* RoomServer 地址
*/
@property (nonatomic, copy)NSString *roomServerAddress;
/**
* 统计 服务器地址
*/
@property (nonatomic, copy)NSString *statisticsAddress;
/**
* 功能统计 服务器地址
*/
@property (nonatomic, copy)NSString *eventTrackAddress;
/**
* 兼容性配置 服务器地址
*/
@property (nonatomic, copy)NSString *compatConfigAddress;
/**
* 音频信息 服务器地址
*/
@property (nonatomic, copy)NSString *audioInfoAddress;
/**
* 通用上报 服务器地址
*/
@property (nonatomic, copy)NSString *commonReportAddress;
/**
* 从配置数据更新
*/
- (void)updateSettingFromConfigData:(NSData *)data;
@end
//
// NIMNetCallAudioCustomInputTask.h
// NIMAVChat
//
// Created by Simon Blue on 2018/8/14.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NIMNetCallAudioCustomInputTask : NSObject
//是否需要通过SDK播放
@property (nonatomic) BOOL needPlay;
//是否需要通过SDK发送
@property (nonatomic) BOOL needSend;
//采样率
@property (nonatomic) Float64 sampleRate;
@end
//
// NIMNetCallAudioFileMixTask.h
// NIM
//
// Created by Netease on 16/12/5.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
语音文件混音任务
*/
@interface NIMNetCallAudioFileMixTask : NSObject
/**
初始化任务
@param url 语音文件 URL。只能播放系统原生支持语音播放的音频文件类型,如 aac、mp3、mp4 和 wav 等
@return 任务实例
*/
- (instancetype)initWithFileURL:(NSURL *)url;
/**
语音文件 URL
*/
@property (nonatomic, readonly) NSURL *fileURL;
/**
循环播放次数,负数表示无限循环,非负数表示总共播放 numberOfLoops + 1 次,可以实时更新,更新后重新计数
*/
@property (nonatomic, assign) NSInteger numberOfLoops;
/**
发送的语音音量, 接受输入值为 0.0 到 1.0,可以实时更新
*/
@property (nonatomic, assign) float sendVolume;
/**
播放的语音音量, 接受输入值为 0.0 到 1.0,可以实时更新
*/
@property (nonatomic, assign) float playbackVolume;
/**
音效管理:只针对音效有效,对伴音无效;默认开启
*/
@property (nonatomic, assign) BOOL needSend;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallBypassTaskConfig.h
// NIMAVChat
//
// Created by Simon Blue on 2019/9/10.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NIMNetCallBypassTaskConfig : NSObject
/**
推流任务Id
*/
@property (nonatomic, copy)NSString *taskId;
/**
互动直播推流地址
*/
@property (nonatomic, copy)NSString *streamingUrl;
/**
* 互动直播音视频混屏模式,在 NIMNetCallBypass StreamingMixMode 里面选择合适的模式
*/
@property (nonatomic, assign)NSInteger streamingLayoutMode;
/**
* 互动直播音视频混屏自定义布局配置,在 bypassStreamingMixMode 为 NIMNetCallBypassStreamingMixModeCustomVideoLayout 或 NIMNetCallBypassStreamingMixModeCustomAudioLayout 时必须设置
*/
@property (nonatomic, copy)NSString *streaminglayoutConfig;
/**
互动直播服务器录制,互动直播服务器录制功能需要开通才能使用)
*/
@property (nonatomic, assign)BOOL serverRecord;
/**
要设置主画面的accid,可以不指定
*/
@property (nonatomic, copy)NSString *accid;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallCustomVideoParam.h
// NIMAVChat
//
// Created by Netease on 2017/7/17.
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreMedia/CMSampleBuffer.h>
#import "NIMAVChatDefs.h"
@class NIMNetCallVideoProcessorParam;
/**
* 自定义视频输入参数
*/
@interface NIMNetCallCustomVideoParam : NSObject<NSCopying>
/**
* 编码帧率
*/
@property (nonatomic, assign) NSUInteger videoFrameRate;
/**
* 视频前处理参数,如需开启前处理请指定该参数,不指定将不开启前处理。
@discussion 如果需要在通话开始时就已添加美颜,水印等前处理,请指定该参数中对应的参数。
*/
@property (nonatomic, strong) NIMNetCallVideoProcessorParam *videoProcessorParam;
@end
//
// NIMNetCallMP4RecordOption.h
// NIMAVChat
//
// Created by He on 2018/12/17.
// Copyright © 2018 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 本地MP4录制设置可选参数
*/
@interface NIMNetCallMP4RecordOption : NSObject
/**
* 录制的分辨率,默认为NIMNetCallVideoQualityDefault 480p, 可不设置
*/
@property(nonatomic, assign) NIMNetCallVideoQuality videoQuality;
/**
* 录制的视频码率,可不设置
*/
@property(nonatomic, assign) NSUInteger videoBitrate;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallMeeting.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
@class NIMNetCallOption;
NS_ASSUME_NONNULL_BEGIN
/**
* 多人音视频会议
*/
@interface NIMNetCallMeeting : NSObject
/**
* 会议名称
*
* @discussion 相同的会议名称, 只在会议使用完以后才可以重复使用, 开发者需要保证不会出现重复预订某会议名称而不使用的情况
*/
@property (nonatomic,copy) NSString *name;
/**
* 会议对应的当前通话 call id
*/
@property (nonatomic, readonly) UInt64 callID;
/**
* 扩展信息
* @discussion 用于在会议的创建和加入之间传递额外信息, 仅在创建会议时设置有效
*/
@property (nullable,nonatomic,copy) NSString *ext;
/**
* 加入会议的音视频类型
*/
@property (nonatomic,assign) NIMNetCallMediaType type;
/**
* 以发言者的角色加入, 非发言者 (观众)不发送音视频数据
*/
@property (nonatomic, assign) BOOL actor;
/**
* 网络通话可选配置
*/
@property (nullable, nonatomic, strong) NIMNetCallOption *option;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallNetstat.h
// NIMAVChat
//
// Created by hzgaofeng on 2018/8/30.
// Copyright © 2018年 Netease. All rights reserved.
//
/**
* 音视频网络状况
*/
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
@interface NIMNetCallNetstat : NSObject
/**
* 网络质量
*/
@property (nonatomic, assign) NIMNetCallNetStatus status;
/**
* rtt
*/
@property (nonatomic, assign) int rtt;
/**
* 音频丢包率百分比(0~100)
*/
@property (nonatomic, assign) int audioLossrate;
/**
* 视频丢包率百分比(0~100)
*/
@property (nonatomic, assign) int videoLossrate;
@end
//
// NIMNetCallOption.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreMedia/CMSampleBuffer.h>
#import "NIMAVChatDefs.h"
@class NIMNetCallVideoCaptureParam;
@class NIMNetCallCustomVideoParam;
@class NIMNetCallServerRecord;
@class NIMNetCallSocksParam;
@class NIMNetCallBypassTaskConfig;
NS_ASSUME_NONNULL_BEGIN
/**
* 语音数据处理Block
*
* @param audioSamples 麦克风采集到的语音原始 PCM 采样数据,处理完的数据通过该字段回填
* @param samplesNumber 采样数据点数量
* @param sampleRate 采样率
*
* @return 回填数据采样点数,不允许超过samplesNumber
*/
typedef NSUInteger(^NIMNetCallAudioSamplesHandler)(SInt16 *audioSamples, NSUInteger samplesNumber, Float64 sampleRate);
/**
* 网络通话选项
*/
@interface NIMNetCallOption : NSObject
/**
* 视频采集参数, 指定该参数以在加入网络通话时自动设置视频采集, 如果不指定该参数, 需要开发者调用 startVideoCapture: 手动开启视频采集。如果在加入网络通话前已经开启了视频采集, 该参数无效,该参数与 customVideoParam 不能同时设置
*/
@property (nullable, nonatomic, strong) NIMNetCallVideoCaptureParam *videoCaptureParam;
/**
* 自定义输入视频参数,该参数与 videoCaptureParam 不能同时设置
*/
@property (nullable, nonatomic, strong) NIMNetCallCustomVideoParam *customVideoParam;
/**
* 结束网络通话时自动停止视频采集, 默认为 YES。如果需要在离开会话以后摄像头保持开启,将该选项设置为 NO
*/
@property (nonatomic, assign) BOOL stopVideoCaptureOnLeave;
/**
* 远端视频展示类型
*/
@property(nonatomic, assign) NIMNetCallRemoteVideoShowType remoteViewoShowType;
/**
* 自动旋转远端画面, 默认为 YES
* @discussion 开启该选项, 以在远端设备旋转时在本端自动调整角度
*/
@property (nonatomic, assign) BOOL autoRotateRemoteVideo;
/**
* 期望的视频编码器. 硬件编码设置仅在 iOS 8.0 及以上系统有效
*/
@property (nonatomic,assign) NIMNetCallVideoCodec preferredVideoEncoder;
/**
* 期望的视频解码器. 硬件解码设置仅在 iOS 8.0 及以上系统有效
*/
@property (nonatomic,assign) NIMNetCallVideoCodec preferredVideoDecoder;
/**
* 视频最大编码码率 (bps). 如果不指定, SDK 会根据视频质量自动选择
*/
@property (nonatomic, assign) NSUInteger videoMaxEncodeBitrate;
/**
* 纯视频模式, 将不启动所有音频相关的模块, 默认为 NO
*/
@property (nonatomic, assign) BOOL pureVideo;
/**
* 结束网络通话时自动停止AudioSession, 默认为 YES
*/
@property (nonatomic, assign) BOOL autoDeactivateAudioSession;
/**
* 是否关闭SDK AudioSession配置 默认为 NO
*/
@property (nonatomic, assign) BOOL disEnableAudioSessionConfigration;
/**
* 语音降噪, 默认为 YES
*/
@property (nonatomic, assign) BOOL audioDenoise;
/**
* 自动增益, 默认为 YES
*/
@property (nonatomic, assign) NIMAVChatAGCType agcType;
/**
* 人声检测, 默认为 YES
*/
@property (nonatomic, assign) BOOL voiceDetect;
/**
* 音频播放采样率 默认 48K 采样率 在某些蓝牙耳机连接时可能会降至16k
*/
@property(nonatomic, assign) NIMAVChatAudioSamplerate playbackSampleRate;
/**
* 回声抑制
*/
@property (nonatomic, assign) NIMAVChatAcousticEchoCanceler acousticEchoCanceler;
/**
期望发送高清语音, 只有在通话的所有的参与者都设置为高清语音时才完全生效。3.3.0 之前的版本无法加入已经开启高清语音的多人会议。默认开启,开启该选项后在蓝牙耳机下效果可能达不到预期
*/
@property (nonatomic, assign) BOOL preferHDAudio;
/**
* 自动重置音频设备, 默认为NO 当检查音频采集数据不正常时,自动重置音频设备
*/
@property (nonatomic, assign) BOOL autoResetAudio;
/**
* 近距离传感器类型,默认为 NIMNetCallProximityMonitoringTypeDefault
*/
@property (nonatomic, assign) NIMNetCallProximityMonitoringType proximityMonitoringType;
/**
* 场景设置
*/
@property (nonatomic, assign) NIMAVChatScene scene;
/**
* 视频调控策略 默认为 清晰优先
*/
@property (nonatomic, assign) NIMAVChatVideoAdaptiveStrategy videoAdaptiveStrategy;
/**
* 本地采集的语音数据回调,供上层实现变音等功能
*/
@property (nullable, nonatomic, copy) NIMNetCallAudioSamplesHandler audioHandler;
/**
* 启用互动直播,只在加入会议时设置有效
*/
@property (nonatomic, assign) BOOL enableBypassStreaming;
/**
* 互动直播房间推流配置
*/
@property (nonatomic, strong) NSArray<NIMNetCallBypassTaskConfig *> *bypassTaskConfig;
/**
* 互动直播推流地址。只在加入会议时设置有效,只有主播端可以指定,每个频道只能有一个主播。
*
* @discussion 指定推流地址的客户端被认为是互动直播的主播端
*/
@property (nullable,nonatomic, strong) NSString *bypassStreamingUrl;
/**
* 互动直播音视频混屏模式,在 NIMNetCallBypassStreamingMixMode 里面选择合适的模式,只有主播设置有效
*/
@property (nonatomic, assign) NSUInteger bypassStreamingMixMode;
/**
* 互动直播音视频混屏自定义布局配置,在 bypassStreamingMixMode 为 NIMNetCallBypassStreamingMixModeCustomVideoLayout 或 NIMNetCallBypassStreamingMixModeCustomAudioLayout 时必须设置
*/
@property (nonatomic, copy) NSString *bypassStreamingMixCustomLayoutConfig;
/**
互动直播服务器录制,只有主播设置生效(互动直播服务器录制功能需要开通才能使用)
*/
@property (nonatomic, assign) BOOL bypassStreamingServerRecording;
/**
* 扩展消息
* @discussion 仅在主叫发起点对点通话时设置有效,用于在主被叫之间传递额外信息,被叫收到呼叫时会携带该信息
*/
@property (nullable,nonatomic,copy) NSString *extendMessage;
/**
* 始终持续呼叫
* @discussion 仅在主叫发起点对点通话时设置有效,用于设置被叫离线时是否仍然需要持续呼叫, 默认为 YES
*/
@property (nonatomic, assign) BOOL alwaysKeepCalling;
/**
* 网络通话请求是否附带推送
* @discussion 仅在主叫发起点对点通话时设置有效,默认为YES。将这个字段设为NO,网络通话请求将不再有苹果推送通知。
*/
@property (nonatomic,assign) BOOL apnsInuse;
/**
* 推送是否需要角标计数
* @discussion 仅在主叫发起点对点通话时设置有效,默认为YES。将这个字段设为NO,网络通话请求将不再对角标计数。
*/
@property (nonatomic,assign) BOOL apnsBadge;
/**
* 推送是否需要带前缀(一般为昵称)
* @discussion 仅在主叫发起点对点通话时设置有效,默认为YES。将这个字段设为NO,推送消息将不带有前缀(xx:)。
*/
@property (nonatomic,assign) BOOL apnsWithPrefix;
/**
* apns推送文案,长度限制500字
* @discussion 仅在主叫发起点对点通话时设置有效,默认为nil,用户可以设置当前通知的推送文案
*/
@property (nullable,nonatomic,copy) NSString *apnsContent;
/**
* apns推送声音文件
* @discussion 仅在主叫发起点对点通话时设置有效,默认为nil,用户可以设置当前通知的推送声音。该设置会覆盖apnsPayload中的sound设置
*/
@property (nullable,nonatomic,copy) NSString *apnsSound;
/**
* apns推送Payload
* @discussion 仅在主叫发起点对点通话时设置有效,可以通过这个字段定义自定义通知的推送Payload,支持字段参考苹果技术文档,最多支持2K
*/
@property (nullable,nonatomic,copy) NSDictionary *apnsPayload;
/**
* 服务端录制参数
* @discussion 服务端录制相关参数
*/
@property (nullable,nonatomic,strong) NIMNetCallServerRecord *serverRecord;
/**
* Sock5代理设置
* @discussion 是否使用音视频代理socks5代理,建议使用接口方式设置代理,该参数已废弃,且不能与接口方式同时使用
*/
@property (nullable,nonatomic,strong) NIMNetCallSocksParam *socks5Info;
/**
* 可选参数
*/
@property (nullable,nonatomic,strong) NSDictionary *extInfo;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallRecordingInfo.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMRTSManagerProtocol.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 网络通话服务器录制服务信息
*/
@interface NIMNetCallRecordingInfo : NSObject
/**
* 录制文件对应的 call id
*/
@property (nonatomic, readonly, assign) UInt64 callID;
/**
* 录制存储音频文件名
*/
@property (nonatomic, readonly, copy) NSString *audioRecordFileName;
/**
* 录制存储视频文件名
*/
@property (nonatomic, readonly, copy) NSString *videoRecordFileName;
@end
NS_ASSUME_NONNULL_END
\ No newline at end of file
//
// NIMNetCallRecordsSearchOption.h
// NIMAVChat
//
// Created by He on 2019/8/7.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 音视频话单搜索可选项
*/
@interface NIMNetCallRecordsSearchOption : NSObject
/**
该时间戳之前的记录, 小于、等于0表示全部
*/
@property (nonatomic,assign) NSTimeInterval timestamp;
/**
分页的数目
*/
@property (nonatomic,assign) NSUInteger limit;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallDisplayMode.h
// NIMAVChat
//
// Created by Netease on 2019/7/12.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
@interface NIMNetCallRenderMode : NSObject
@property (nonatomic,assign) NIMNetCallRenderFillMode fillMode;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallServerRecord.h
// NIMAVChat
//
// Created by fanghe's mac on 2018/8/13.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
/**
* 音视频服务端录制设置参数
*/
@interface NIMNetCallServerRecord : NSObject <NSCopying>
/**
* 启用服务器录制音频, 默认 NO
* @discussion 该开关仅在服务器开启录制功能时才有效,代表是否会有音频文件AAC生成
*/
@property (nonatomic, assign) BOOL enableServerAudioRecording;
/**
* 启用服务器录制视频, 默认 NO
* @discussion 该开关仅在服务器开启录制功能时才有效,代表是否会有视频文件MP4生成
*/
@property (nonatomic, assign) BOOL enableServerVideoRecording;
/**
* 录制模式, 默认为 NIMNetCallServerRecordModeDefault
*/
@property (nonatomic, assign) NIMNetCallServerRecordMode serverRecordingMode;
/**
* 是否为录制主讲人, 默认 NO
* @discussion 视频画面作为主画面的那个人称为录制主讲人
*/
@property (nonatomic, assign) BOOL enableServerHostRecording;
@end
//
// NIMNetCallSocks5.h
// NIMAVChat
//
// Created by fanghe's mac on 2018/8/14.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 音视频代理设置参数
*/
@interface NIMNetCallSocksParam : NSObject <NSCopying>
/**
* 是否使用全局socks5代理, 默认为 NO
*/
@property (nonatomic, assign) BOOL useSocks5Proxy;
/**
* 代理类型,默认为 NIMNetCallSocksTypeDefault
*/
@property (nonatomic, assign) NIMSocksType socks5Type;
/**
* socks5服务地址, 格式:ip:port
* @discussion 两个格式,代理无认证格式:socks5://ip:port;
* 代理有认证格式:socks5://username:password@ip:port
*/
@property (nonatomic, copy) NSString *socks5Addr;
/**
* socks5服务用户名,
*/
@property (nullable, nonatomic, copy) NSString *socks5Username;
/**
* socks5服务密码
*/
@property (nullable, nonatomic, copy) NSString *socks5Password;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallUserInfo.h
// NIMLib
//
// Created by Netease on 16/9/23.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
网络通话用户信息
*/
@interface NIMNetCallUserInfo : NSObject
/**
用户 id
*/
@property(nonatomic, copy, readonly) NSString *uid;
/**
音量
*/
@property(nonatomic, assign, readonly) UInt16 volume;
@end
//
// NIMNetCallVideoCaptureParam.h
// NIMAVChat
//
// Created by Netease on 17/3/24.
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreMedia/CMSampleBuffer.h>
#import "NIMAVChatDefs.h"
@class NIMNetCallVideoProcessorParam;
NS_ASSUME_NONNULL_BEGIN
/**
* 视频数据处理Block
*
* @param sampleBuffer 摄像头采集到的视频原始数据
*/
typedef void(^NIMNetCallVideoSampleBufferHandler)(CMSampleBufferRef sampleBuffer);
/**
* 音视频视频采集参数
*/
@interface NIMNetCallVideoCaptureParam : NSObject
/**
* 期望的发送视频质量
* @discussion 默认是 480P 等级. SDK可能会根据具体机型运算性能和协商结果调整为更合适的清晰度, 导致该设置无效(该情况通常发生在低性能设备上)
*/
@property (nonatomic,assign) NIMNetCallVideoQuality preferredVideoQuality;
/**
* 预览视频质量. 默认 480P SDK内部最低480P等级预览
*/
@property (nonatomic, assign) NIMNetCallVideoQuality previewVideoQuality;
/**
* 视频裁剪, 默认 16:9
*/
@property (nonatomic,assign) NIMNetCallVideoCrop videoCrop;
/**
* 视频采集画面格式, 默认是 420f
*/
@property (nonatomic, assign) NIMNetCallVideoCaptureFormat format;
/**
* 使用后置摄像头开始视频, 默认是 YES
*/
@property (nonatomic, assign) BOOL startWithBackCamera;
/**
* 初始打开摄像头, 默认是 YES
*/
@property (nonatomic, assign) BOOL startWithCameraOn;
/**
视频采集方向. 该设置会改变采集到的视频画面的角度, 主要用于支持互动直播时的横屏直播: 主播以各种角度手持设备直播, 并设置为该角度的 '视频采集方向', 拉流播放器就可以以正常的角度观看直播.
@discussion 在视频通话场景中, 如果播放端关闭 '自动旋转远端画面', 画面将以采集到的角度展现; 如果播放端开启 '自动旋转远端画面', 无论 '视频采集方向' 如何设置, 播放的画面都是正常的角度
*/
@property (nonatomic, assign) NIMVideoOrientation videoCaptureOrientation;
/**
* 视频发送帧率. 默认是 15 FPS
*/
@property (nonatomic, assign) NIMNetCallVideoFrameRate videoFrameRate;
/**
* 本地采集的视频数据回调,供上层实现美颜等功能
*/
@property (nullable, nonatomic, copy) NIMNetCallVideoSampleBufferHandler videoHandler;
/**
设置默认的手动对焦框
@discussion 只在支持手动对焦时才起作用,如果设置YES则使用默认的手动对焦框,设置NO表示不使用默认的手动对焦框,可以自己自定义对焦框。
*/
@property (nonatomic, assign) BOOL isSupportedManualFocusFrame;
/**
* 是否打开预览镜像 默认打开
*/
@property (nonatomic, assign) BOOL isPreviewMirror;
/**
* 是否打开编码镜像 默认关闭
*/
@property (nonatomic, assign) BOOL isCodeMirror;
/**
* 视频前处理参数,如需开启前处理请指定该参数,不指定将不开启前处理。
@discussion 如果需要在通话开始时就已添加美颜,水印等前处理,请指定该参数中对应的参数。
*/
@property (nonatomic, strong) NIMNetCallVideoProcessorParam *videoProcessorParam;
/**
* macOS 是否使用桌面采集
*/
@property (nonatomic, assign, getter=isCaptureScreen) BOOL captureScreen;
/**
* macOS 桌面采集区域
*/
@property(nonatomic, assign) CGRect screenCropRect;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallVideoDevice.h
// NIMAVChat
//
// Created by He on 2018/10/18.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <AVFoundation/AVFoundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 视频设备信息
*/
@interface NIMNetCallVideoDevice : NSObject
/**
* 视频设备类
*/
@property(nonatomic, strong) AVCaptureDevice *device;
/**
* 视频设备输入类
*/
@property(nonatomic, strong) AVCaptureDeviceInput *input;
@end
NS_ASSUME_NONNULL_END
//
// NIMNetCallVideoProcessorParam.h
// NIMAVChat
//
// Created by Simon Blue on 2017/11/30.
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
/**
* 水印参数
*/
@interface NIMNetCallVideoWaterMarkParam : NSObject
/**
* 水印图片 (静态水印需要指定)
*/
@property(nonatomic,strong)UIImage *image;
/**
* 具体位置和大小(x,y根据location位置,计算具体的位置信息)
*/
@property(nonatomic)CGRect rect;
/**
* 位置 默认右上
*/
@property(nonatomic)NIMNetCallWaterMarkLocation location;
/**
* 动态图像数组 (动态水印需要指定)
*/
@property(nonatomic,strong)NSArray *imageArray;
/**
* 播放速度的快慢:count代表count帧显示同一张图 (动态水印需要指定)
*/
@property(nonatomic)NSUInteger count;
/**
* 是否循环,不循环就显示一次 (动态水印需要指定)
*/
@property(nonatomic)BOOL loop;
@end
/**
* 前处理参数
*/
@interface NIMNetCallVideoProcessorParam : NSObject
/**
* 美颜类型
*/
@property(nonatomic)NIMNetCallFilterType filterType;
/**
* 对比度强度 [0-4] 默认为 1
*/
@property(nonatomic)float contrastIntensity;
/**
* 磨皮强度 [0-1] 默认为 0
*/
@property(nonatomic)float smoothIntensity;
/**
* 水印参数 如果需要在通话开始时添加请指定
*/
@property(nonatomic,strong)NIMNetCallVideoWaterMarkParam *waterMarkParam;
@end
//
// NIMRTSConference.h
// NIMAVChat
//
// Created by Netease on 16/10/27.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
@class NIMRTSConferenceData;
@class NIMRTSSocksParam;
NS_ASSUME_NONNULL_BEGIN
/**
* 多方实时会话接收数据处理 Handler
*
* @param data 预订或者加入的多人会议
*/
typedef void(^NIMRTSConferencReceiveDataHandler)(NIMRTSConferenceData *data);
/**
* 多方实时会话
*/
@interface NIMRTSConference : NSObject
/**
* 实时会话名称
*
* @discussion 相同的实时会话名称, 只在会话使用完以后才可以重复使用, 开发者需要保证不会出现重复预订某会话名称而不使用的情况
*/
@property (nonatomic,copy) NSString *name;
/**
* 扩展信息
* @discussion 用于在会话的创建和加入之间传递额外信息, 仅在创建会话时设置有效
*/
@property (nullable,nonatomic,copy) NSString *ext;
/**
* 接收数据处理
*/
@property (nullable,nonatomic,copy) NIMRTSConferencReceiveDataHandler dataHandler;
/**
* 服务器录制开关
*/
@property (nonatomic, assign) BOOL serverRecording;
/**
* 多方实时会话对应的当前 channel id, 在成功加入会话以后可以获取到
*/
@property (nonatomic,readonly) UInt64 channelID;
/**
* 服务器录制文件名
*/
@property (nullable,nonatomic,copy, readonly) NSString *serverRecordName;
@end
NS_ASSUME_NONNULL_END
//
// NIMRTSConferenceData.h
// NIMAVChat
//
// Created by Netease on 16/10/27.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
@class NIMRTSConference;
NS_ASSUME_NONNULL_BEGIN
/**
* 多方实时会话数据
*/
@interface NIMRTSConferenceData : NSObject
/**
* 数据属于的会话会话信息
*/
@property (nonatomic, copy) NIMRTSConference *conference;
/**
* 数据属于的会话会话信息
* @discussion 发送的数据长度不允许超过50KB, 推荐不超过4KB,发送周期建议控制在50ms以上
*/
@property (nonatomic, strong) NSData *data;
/**
* 数据的发送者或接收者
* @discussion 在发送数据时填写接收者,填 nil 表示广播数据;接收数据时该字段表示数据的发送者
*/
@property (nullable, nonatomic, copy) NSString *uid;
@end
NS_ASSUME_NONNULL_END
//
// NIMRTSConferenceManagerProtocol.h
// NIMAVChat
//
// Created by Netease.
// Copyright (c) 2016 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
@class NIMRTSConference;
@class NIMRTSConferenceData;
@class NIMRTSSocksParam;
typedef void(^NIMRTSConferenceOperationFinishBlock) (NSError * _Nullable error);
/**
* 多方实时会话相关回调
*/
@protocol NIMRTSConferenceManagerDelegate <NSObject>
@optional
/**
* 预订多方实时会话结果回调
*
* @param conference 预订的会话
* @param result 结果. nil 表示预订成功
*/
- (void)onReserveConference:(NIMRTSConference *)conference
result:(nullable NSError *)result;
/**
* 加入多方实时会话结果回调
*
* @param conference 加入的会话
* @param result 结果. nil 表示加入成功
*/
- (void)onJoinConference:(NIMRTSConference *)conference
result:(nullable NSError *)result;
/**
* 离开了多人实时会话(发生了错误)
*
* @param conference 离开的会话
* @param error 错误信息
*/
- (void)onLeftConference:(NIMRTSConference *)conference
error:(NSError *)error;
/**
* 用户加入了多方实时会话
*
* @param uid 用户 id
* @param conference 用户加入的会话
*/
- (void)onUserJoined:(NSString *)uid
conference:(NIMRTSConference *)conference;
/**
* 用户离开了多方实时会话
*
* @param uid 用户 id
* @param conference 用户离开的会话
* @param reason 用户离开的原因
*/
- (void)onUserLeft:(NSString *)uid
conference:(NIMRTSConference *)conference
reason:(NIMRTSConferenceUserLeaveReason)reason;
@end
/**
* 实时会话协议
*/
@protocol NIMRTSConferenceManager <NSObject>
/**
* 预订多方实时会话
*
* @param conference 需要预订的会话
*
* @return 接口调用的结果. 该结果只是表示当前这个函数调用是否成功,需要后续的回调才能判断预订会话是否成功
*/
- (nullable NSError *)reserveConference:(NIMRTSConference *)conference;
/**
* 加入多方实时会话
*
* @param conference 需要加入的会话
*
* @return 接口调用的结果. 该结果只是表示当前这个函数调用是否成功,需要后续的回调才能判断加入会话是否成功
*/
- (nullable NSError *)joinConference:(NIMRTSConference *)conference;
/**
* 离开多方实时会话
*
* @param conference 需要离开的会话
*
* @return 接口调用的结果
*
*/
- (nullable NSError *)leaveConference:(NIMRTSConference *)conference;
/**
* 离开多方实时会话
*
* @param conference 需要离开的会话
*
* @param block 接口调用的结果
*
*/
- (void)leaveConference:(NIMRTSConference *)conference
finishBlock:(NIMRTSConferenceOperationFinishBlock _Nullable)block;
/**
* 发送多方实时会话数据
*
* @param data 需要发送的实时会话数据, 数据长度不允许超过50KB, 推荐不超过4KB; 发送数据的周期建议控制在50ms以上
*
* @return 是否允许发送
*
* @discussion 被叫在响应请求之前不要调用挂断接口
*/
- (BOOL)sendRTSData:(NIMRTSConferenceData *)data;
/**
* 添加多方实时会话委托
*
* @param delegate 多方实时会话委托
*/
- (void)addDelegate:(id<NIMRTSConferenceManagerDelegate>)delegate;
/**
* 移除多方实时会话委托
*
* @param delegate 多方实时会话委托
*/
- (void)removeDelegate:(id<NIMRTSConferenceManagerDelegate>)delegate;
/**
* 配置白板代理参数
*
* @param socksParam 代理参数
*/
- (void)setUpRTSSocksWithParam:(NIMRTSSocksParam *)socksParam;
@end
NS_ASSUME_NONNULL_END
//
// NIMRTSManagerProtocol.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
@class NIMRTSOption;
@class NIMRTSRecordingInfo;
@class NIMRTSSocksParam;
/**
* 发起实时会话请求Block
*
* @param error 发起结果, 如果成功 error 为 nil
* @param sessionID 发起的实时会话的 ID
* @param channelID 实时会话内部使用的通道号, 对应服务器白板时长消息抄送里的 channelId. 仅在 error 为 nil 时有效
*/
typedef void(^NIMRTSRequestHandler)(NSError * __nullable error,NSString * __nullable sessionID,UInt64 channelID);
/**
* 响应实时会话请求Block
*
* @param error 响应实时会话请求, 如果成功 error 为 nil
* @param sessionID 响应的实时会话的 ID
* @param channelID 实时会话内部使用的通道号, 对应服务器白板时长消息抄送里的 channelId. 仅在 error 为 nil 时有效
*/
typedef void(^NIMRTSResponseHandler)(NSError * __nullable error,NSString * __nullable sessionID,UInt64 channelID);
/**
* 实时会话服务
*/
typedef NS_ENUM(NSInteger, NIMRTSService){
/**
* 包含可靠数据传输服务
*/
NIMRTSServiceReliableTransfer = 1,
/**
* 包含实时语音沟通服务
*/
NIMRTSServiceAudio = 4,
};
/**
* 实时会话状态
*/
typedef NS_ENUM(NSInteger, NIMRTSStatus){
/**
* 已连接
*/
NIMRTSStatusConnect,
/**
* 已断开
*/
NIMRTSStatusDisconnect,
};
/**
* 实时会话相关回调
*/
@protocol NIMRTSManagerDelegate <NSObject>
@optional
/**
* 被叫收到实时会话请求
*
* @param sessionID 实时会话ID
* @param caller 主叫帐号
* @param types 服务类型, NIMRTSService的组合
* @param extendMessage 附加信息
*/
- (void)onRTSRequest:(NSString *)sessionID
from:(NSString *)caller
services:(NSUInteger)types
message:(nullable NSString *)extendMessage;
/**
* 主叫收到被叫实时会话响应
*
* @param sessionID 实时会话ID
* @param callee 被叫帐号
* @param accepted 是否接听
*
* @discussion 被叫拒绝接听时, 主叫不需要再调用termimateRTS:接口
*/
- (void)onRTSResponse:(NSString *)sessionID
from:(NSString *)callee
accepted:(BOOL)accepted;
/**
* 对方结束实时会话
*
* @param sessionID 实时会话ID
* @param user 对方帐号
*/
- (void)onRTSTerminate:(NSString *)sessionID
by:(NSString *)user;
/**
* 这通呼入的实时会话请求已经被该帐号其他端处理
*
* @param sessionID 实时会话ID
* @param accepted 是否被接听
*/
- (void)onRTSResponsedByOther:(NSString *)sessionID
accepted:(BOOL)accepted;
/**
* 实时会话状态反馈
*
* @param sessionID 实时会话ID
* @param type 实时会话服务类型
* @param status 通话状态, 收到NIMRTSStatusDisconnect时无需调用terminate:结束该会话
* @param error 出错信息, 正常连接和断开时为nil
*/
- (void)onRTS:(NSString *)sessionID
service:(NIMRTSService)type
status:(NIMRTSStatus)status
error:(nullable NSError *)error;
/**
* 收到实时会话数据
*
* @param sessionID 实时会话ID
* @param data 收到的实时会话数据
* @param user 发送实时会话数据的用户
* @param channel 收发实时数据的服务通道
*/
- (void)onRTSReceive:(NSString *)sessionID
data:(NSData *)data
from:(NSString *)user
withIn:(NIMRTSService)channel;
/**
* 收到实时会话控制信息
*
* @param controlInfo 控制信息
* @param user 发送指令的用户
* @param sessionID 实时会话ID
*/
- (void)onRTSControl:(NSString *)controlInfo
from:(NSString *)user
forSession:(NSString *)sessionID;
/**
* 实时会话录制信息
*
* @param info 录制信息
* @param sessionID 实时会话ID
*/
- (void)onRTSRecordingInfo:(NIMRTSRecordingInfo *)info
forSession:(NSString *)sessionID;
/**
* 语音网络状态
*
* @param status 网络状态
* @param user 网络状态对应的用户;如果是自己,表示自己的发送网络状态
*/
- (void)onRTSAudioNetStatus:(NIMNetCallNetStatus)status
user:(NSString *)user;
@end
/**
* 实时会话协议
*/
@protocol NIMRTSManager <NSObject>
/**
* 主叫发起实时会话请求
*
* @param callees 被叫帐号列表, 当前版本只支持一个被叫
* @param types 实时会话服务类型, NIMRTSService的组合, 如果要同时发起可靠传输通道和音频通话, 使用 NIMRTSServiceReliableTransfer | NIMRTSServiceAudio
* @param option 发起会话附带的选项, 可以是nil
* @param completion 发起实时会话结果回调
*
* @return 发起的实时会话ID
*/
- (NSString *)requestRTS:(NSArray<NSString *> *)callees
services:(NSUInteger)types
option:(nullable NIMRTSOption *)option
completion:(nullable NIMRTSRequestHandler)completion;
/**
* 被叫响应实时会话请求
*
* @param sessionID 实时会话ID
* @param accept 是否接听
* @param option 接收会话附带的选项, 可以是nil
* @param completion 响应呼叫结果回调
*
*/
- (void)responseRTS:(NSString *)sessionID
accept:(BOOL)accept
option:(nullable NIMRTSOption *)option
completion:(nullable NIMRTSResponseHandler)completion;
/**
* 挂断实时会话
*
* @param sessionID 需要挂断的实时会话ID
*
* @discussion 被叫在响应请求之前不要调用挂断接口
*/
- (void)terminateRTS:(NSString *)sessionID;
/**
* 从指定通道发送数据
*
* @param data 需要发送的实时会话数据, 数据长度不允许超过50KB, 推荐不超过4KB; 发送数据的周期建议控制在50ms以上
* @param sessionID 实时会话ID
* @param userID 发送数据目标用户名, nil表示广播给所有用户
* @param service 实时会话服务类型
*
* @return 是否允许发送
*
* @discussion 被叫在响应请求之前不要调用挂断接口
*/
- (BOOL)sendRTSData:(NSData *)data
from:(NSString *)sessionID
to:(nullable NSString *)userID
with:(NIMRTSService)service;
/**
* 发送实时会话控制指令
*
* @param controlInfo 控制信息, 自定义实现
* @param sessionID 实时会话ID
*/
- (void)sendRTSControl:(NSString *)controlInfo
forSession:(NSString *)sessionID;
/**
* 设置当前实时会话静音模式
*
* @param mute 是否开启静音
*
*/
- (void)setMute:(BOOL)mute;
/**
* 设置当前实时会话扬声器模式
*
* @param useSpeaker 是否开启扬声器
*
*/
- (void)setSpeaker:(BOOL)useSpeaker API_UNAVAILABLE(macos);
/**
* 添加实时会话委托
*
* @param delegate 实时会话委托
*/
- (void)addDelegate:(id<NIMRTSManagerDelegate>)delegate;
/**
* 移除实时会话委托
*
* @param delegate 实时会话委托
*/
- (void)removeDelegate:(id<NIMRTSManagerDelegate>)delegate;
/**
* 配置白板代理参数
*
* @param socksParam 代理参数
*/
- (void)setUpRTSSocksWithParam:(NIMRTSSocksParam *)socksParam;
/**
* 配置全局代理,包括白板代理和音视频代理
*
* @param socksParam 代理参数
*/
- (void)setUpGlobalSocksWithParam:(NIMRTSSocksParam *)socksParam;
@end
NS_ASSUME_NONNULL_END
//
// NIMRTSOption.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
@class NIMRTSSocksParam;
NS_ASSUME_NONNULL_BEGIN
/**
* 实时会话的附带选项, 用于发起和响应
*/
@interface NIMRTSOption : NSObject
/**
* 扩展消息, 仅在发起会话时有效, 用于开发者在主被叫之间沟通额外信息
*/
@property (nullable,nonatomic, copy) NSString *extendMessage;
/**
* 结束网络通话时自动停止AudioSession, 默认为 YES
*/
@property (nonatomic, assign) BOOL autoDeactivateAudioSession;
/**
* 语音降噪, 默认为 YES
*/
@property (nonatomic, assign) BOOL audioDenoise;
/**
* 人声检测, 默认为 YES
*/
@property (nonatomic, assign) BOOL voiceDetect;
/**
* 期望发送高清语音, 只有在通话的所有的参与者都设置为高清语音时才生效。开启该选项后蓝牙耳机将不能使用
*/
@property (nonatomic, assign) BOOL preferHDAudio;
/**
* 场景设置
*/
@property (nonatomic, assign) NIMAVChatScene scene;
/**
服务器录制语音
*/
@property (nonatomic, assign) BOOL serverRecordAudio;
/**
服务器录制实时会话数据
*/
@property (nonatomic, assign) BOOL serverRecordData;
/**
* 始终持续呼叫, 用于设置被叫离线时是否仍然需要持续呼叫, 默认为 YES
*/
@property (nonatomic, assign) BOOL alwaysKeepCalling;
/**
* 实时会话请求是否附带推送
* @discussion 默认为YES。将这个字段设为NO,实时会话请求将不再有苹果推送通知。
*/
@property (nonatomic,assign) BOOL apnsInuse;
/**
* 推送是否需要角标计数
* @discussion 默认为YES。将这个字段设为NO,实时会话请求将不再对角标计数。
*/
@property (nonatomic,assign) BOOL apnsBadge;
/**
* 推送是否需要带前缀(一般为昵称)
* @discussion 默认为YES。将这个字段设为NO,推送消息将不带有前缀(xx:)。
*/
@property (nonatomic,assign) BOOL apnsWithPrefix;
/**
* apns推送文案,长度限制500字
* @discussion 默认为nil,用户可以设置当前通知的推送文案
*/
@property (nullable,nonatomic,copy) NSString *apnsContent;
/**
* apns推送声音文件
* @discussion 默认为nil,用户可以设置当前通知的推送声音。该设置会覆盖apnsPayload中的sound设置
*/
@property (nullable,nonatomic,copy) NSString *apnsSound;
/**
* apns推送Payload
* @discussion 可以通过这个字段定义自定义通知的推送Payload,支持字段参考苹果技术文档,最多支持2K
*/
@property (nullable,nonatomic,copy) NSDictionary *apnsPayload;
@end
NS_ASSUME_NONNULL_END
//
// NIMRTSRecordingInfo.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMRTSManagerProtocol.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 实时会话录制服务信息
*/
@interface NIMRTSRecordingInfo : NSObject
/**
* 录制文件的服务类型
*/
@property (nonatomic, readonly, assign) NIMRTSService service;
/**
* 录制存储文件名
*/
@property (nonatomic, readonly, copy) NSString *recordFileName;
@end
NS_ASSUME_NONNULL_END
\ No newline at end of file
//
// NIMRTSSocksParam.h
// NIMAVChat
//
// Created by He on 2018/10/17.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMAVChatDefs.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 互动白板代理设置参数
*/
@interface NIMRTSSocksParam : NSObject <NSCopying>
/**
* 是否使用全局socks5代理, 默认为 NO
*/
@property (nonatomic, assign) BOOL enableProxy;
/**
* 代理类型,默认 NIMSocksTypeDefault
*/
@property (nonatomic, assign) NIMSocksType socksType;
/**
* Socks服务器地址, 格式:ip:port
* @discussion 代理无认证格式:socks5://ip:port; 代理有认证格式:socks5://username:password@ip:port
*/
@property (nonatomic, copy) NSString *socksAddr;
/**
* Socks服务请求用户名
*/
@property (nullable, nonatomic, copy) NSString *socksUsername;
/**
* Socks服务请求密码
*/
@property (nullable, nonatomic, copy) NSString *socksPassword;
@end
NS_ASSUME_NONNULL_END
framework module NIMAVChat {
umbrella header "NIMAVChat.h"
export *
module * { export * }
}
## profiles.h
主要接口
```cpp
namespace profiles {
class Profiles {
public:
/**
* @brief 初始化模块
* @param release true=空实现,false=有日志输出
* @param platform 能力提供类,需要各个平台做实现,std::make_shared<profiles::ProfilesPlatformAndroidImpl>()
*/
static void Init(bool release, std::shared_ptr<ProfilesPlatform> platform);
/**
* @brief 开始打点采集、日志输出线程
*/
static void Start();
/**
* @brief 结束打点采集、日志输出线程
*/
static void Stop();
/**
* @brief 统计打点开始
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,可能为uid, ssrc等值,会影响聚合,会影响tag
* @param order 统计点在相同type中的顺序,只会影响输出显示
*
* @return token 统计点唯一id,用于结束打点Profiles#End方法
*/
static const std::string Begin(const char* module, const char* tag, const char* type, int32_t order);
/**
* @brief 支持跨线程的统计打点开始
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,0为主流程,1为次流程,只会影响输出显示
* @param order 统计点在相同type中的顺序,只会影响输出显示
*
* @return token 统计点唯一id,用于结束打点Profiles#End方法
*/
static const std::string BeginMultiThread(const char* module, const char* tag, const char* type, int32_t order);
/**
* @brief 统计打点结束
* @param token 使用token结束打点
*/
static void End(const char* token);
/**
* @brief 帧统计打点开始
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,可能为uid, ssrc等值,会影响聚合,会影响tag
* @param frameId 帧id,需要在相同module+tag内唯一
* @param order 统计点在相同type中的顺序,只会影响输出显示
*/
static void BeginWithId(const char* module, const char* tag, const char* type, const char* frameId, int32_t order);
/**
* @brief 帧统计打点结束
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,可能为uid, ssrc等值,会影响聚合,会影响tag
* @param frameId 帧id,需要在相同module+tag内唯一
*/
static void EndWithId(const char* module, const char* tag, const char* type, const char* frameId);
/**
* @brief 函数调用间隔统计
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,0为主流程,1为次流程,只会影响输出显示
* @param order 统计点在相同type中的顺序,只会影响输出显示
*/
static void Duration(const char* module, const char* tag, const char* type, int32_t order);
/**
* @brief 直接传cost(单位ms),适用于引擎的那2个回调
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,可能为uid, ssrc等值,会影响聚合,会影响tag
* @param cost 消耗时间,单位ms
* @param order 统计点在相同type中的顺序,只会影响输出显示
*/
static void Cost(const char* module, const char* tag, const char* type, int64_t cost, int32_t order);
/**
* @brief 抖动计算 会统计最大值 最小值 方差 均值
* @param module 模块名
* @param tag 统计点名称
* @param type 统计点类型,可能为uid, ssrc等值,会影响聚合,会影响tag
* @param value 消耗时间,单位ms
* @param order 统计点在相同type中的顺序,只会影响输出显示
*/
static void Jitter(const char* module, const char* tag, const char* type, int64_t value, int32_t order);
};
}
```
## profiles_platform.h
各平台实现接口
```cpp
namespace profiles {
class ProfilesPlatform {
public:
// to impl
virtual ~ProfilesPlatform() {}
/**
* @brief 打印日志
* @param log 日志内容
*/
virtual void ProfilesLog(const char* log) = 0;
/**
* @brief cpu使用率
* @return cpu cpu使用率 如0.99
*/
virtual float ProfilesGetCpu() = 0;
/**
* @brief cpu频率
* @return cpu频率 cpu频率,单位赫兹
*/
virtual int64_t ProfilesGetCpuFreq() = 0;
/**
* @brief cpu内核个数
* @return cpu内核个数 如6
*/
virtual int32_t ProfilesGetCpuCoreCnt() = 0;
/**
* @brief 电量
* @return 电池电量 电量满格1为,如0.99
*/
virtual float ProfilesGetBattery() = 0;
/**
* @brief 温度
* @return 温度 单位摄氏度,如37
*/
virtual int32_t ProfilesGetTemperature() = 0;
/**
* @brief 内存使用大小
* @return 内存使用大小 单位KB
*/
virtual int32_t ProfilesGetMemoryUsage() = 0;
/**
* @brief 通话唯一标识
* @return 通话唯一标识
*/
virtual const std::string ProfilesGetSessionId() = 0;
/**
* @brief 通话信息
* @return 如720x480 15FPS 6P,会作为辅助信息显示,可以自定义内容和格式
*/
virtual const std::string ProfilesGetSessionInfo() = 0;
/**
* @brief 各线程cpu占用
* @return 线程名,占用,线程名,占用,用英文逗号分隔,如 nrtc_video_x,0.10,nrtc_video_send,0.2
*/
virtual const std::string ProfilesGetCpuThread() = 0;
/**
* @brief 网络状态
* @return uid,rtt,videolossrate,uid,rtt,videolossrate,用英文逗号分隔
*/
virtual const std::string ProfilesGetNetStatus() = 0;
};
}
```
\ No newline at end of file
//
// NMCBasicModuleFramework.h
// NMCBasicModuleFramework
//
// Created by Netease on 2019/7/4.
// Copyright © 2019 taojinliang. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for NMCBasicModuleFramework.
FOUNDATION_EXPORT double NMCBasicModuleFrameworkVersionNumber;
//! Project version string for NMCBasicModuleFramework.
FOUNDATION_EXPORT const unsigned char NMCBasicModuleFrameworkVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <NMCBasicModuleFramework/PublicHeader.h>
framework module NMCBasicModuleFramework {
umbrella header "NMCBasicModuleFramework.h"
export *
module * { export * }
}
//
// NIMAntiSpamOption.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 反垃圾选项
* @discussion 这个选项用于配置反垃圾。当使用易盾反垃圾时,设置 enabled 为 YES (默认为 NO) 后该消息进投递到易盾系统进行反垃圾检测 (需要开启易盾服务),只对自定义消息有效
*/
@interface NIMAntiSpamOption : NSObject
/**
* 是否开启反垃圾
*/
@property (nonatomic,assign) BOOL yidunEnabled;
/**
* 需要反垃圾的内容
*/
@property (nullable,nonatomic,copy) NSString *content;
/**
* 用户在易盾配置的额外反垃圾的业务ID
*/
@property (nullable,nonatomic,copy) NSString *businessId;
/**
* 是否命中客户端反垃圾
* @discussion 默认为NO,使用 NIMAntispamManager 中的 checkLocalAntispam:error: 方法来确定所给文本是否命中客户端本地反垃圾,根据结果填写这个字段
*/
@property (nonatomic,assign) BOOL hitClientAntispam;
@end
/**
* 本地反垃圾检查选项
* @discussion 这个选项用于反垃圾的本地检查,可以用这个选项进行一些字符串的本地替换操作
*/
@interface NIMLocalAntiSpamCheckOption : NSObject
/**
* 检查内容
*/
@property (nonatomic,copy) NSString *content;
/**
* 需要替换的字符串
*/
@property (nullable,nonatomic,copy) NSString *replacement;
@end
/**
* 本地反垃圾检查结果类型
*/
typedef NS_ENUM (NSInteger, NIMLocalAntiSpamOperate){
/**
* 本地反垃圾列表不存在
*/
NIMAntiSpamOperateFileNotExists,
/**
* 本地替换
*/
NIMAntiSpamResultLocalReplace,
/**
* 本地屏蔽
*/
NIMAntiSpamResultLocalForbidden,
/**
* 服务器屏蔽
*/
NIMAntiSpamResultServerForbidden,
/**
* 没有命中词库,检查通过
*/
NIMAntiSpamResultNotHit,
/**
* 解析失败
*/
NIMAntiSpamResultError,
};
/**
* 本地反垃圾检查选项
* @discussion 这个选项用于反垃圾的本地检查,可以用这个选项进行一些字符串的本地替换操作
*/
@interface NIMLocalAntiSpamCheckResult : NSObject
/**
* 结果类型
*/
@property (nonatomic, assign, readonly) NIMLocalAntiSpamOperate type;
/**
* 替换后的字符串,只有当类型为本地替换时才有效
*/
@property (nonatomic, copy, readonly) NSString *content;
@end
NS_ASSUME_NONNULL_END
//
// NIMAntispamManagerProtocol.h
// NIMLib
//
// Created by chris on 2018/3/9.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class NIMLocalAntiSpamCheckOption;
@class NIMLocalAntiSpamCheckResult;
/**
* 反垃圾协议
*/
@protocol NIMAntispamManager <NSObject>
/**
* 本地反垃圾检查器
*
* @param option 本地反垃圾检查选项
* @param error 错误提示
* @discussion 此扩展不会漫游到其他端,上层需要保证 NSDictionary 可以转换为 JSON。
* @return 本地反垃圾检查结果,本地反垃圾列表会在每次登录后同步更新
* 因为网络问题,或者没有登录,都会导致本地反垃圾列表无效的情况,error 中会包含具体出错原因
*/
- (NIMLocalAntiSpamCheckResult *)checkLocalAntispam:(NIMLocalAntiSpamCheckOption *)option
error:(NSError **)error;
@end
NS_ASSUME_NONNULL_END
//
// NIMApnsManager.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class NIMPushNotificationSetting;
@class NIMPushNotificationMultiportConfig;
/**
* 更新推送回调
*
* @param error 错误信息,成功则error为nil
*/
typedef void(^NIMApnsHandler)(NSError * __nullable error);
/**
* 获取 badge 回调
*
* @return badge 数量
*/
typedef NSUInteger(^NIMBadgeHandler)(void);
/**
* 推送委托
*/
@protocol NIMApnsManagerDelegate <NSObject>
/**
* 其他端修改推送配置
*/
- (void)onOtherClientChangedPushNotificationMultiportConfig;
@end
/**
* 推送协议
*/
@protocol NIMApnsManager <NSObject>
/**
* 获取当前的推送免打扰设置
*
* @return 推送设置
*/
- (nullable NIMPushNotificationSetting *)currentSetting;
/**
* 更新推送免打扰设置
*
* @param setting 推送设置
* @param completion 完成的回调
*/
- (void)updateApnsSetting:(NIMPushNotificationSetting *)setting
completion:(nullable NIMApnsHandler)completion;
/**
* 获取当前推送自定义配置信息
*
* @return 推送自定义配置
*/
- (nullable NIMPushNotificationMultiportConfig *)currentMultiportConfig;
/**
* 更推送自定义配置信息
*
* @param config 推送自定义配置
* @param completion 完成的回调
*/
- (void)updateApnsMultiportConfig:(NIMPushNotificationMultiportConfig *)config
completion:(nullable NIMApnsHandler)completion;
/**
* 注册获取 badge 数量的回调函数
*
* @param handler 获取 badge 回调
* @discussion 默认场景下,云信会将所有未读数量统一汇报给服务器,包括需要提醒和不需要提醒的会话未读数,上层可以通过注册该接口进行调整
*/
- (void)registerBadgeCountHandler:(NIMBadgeHandler)handler;
/**
* 添加委托
*
* @param delegate 委托
*/
- (void)addDelegate:(id<NIMApnsManagerDelegate>)delegate;
/**
* 移除委托
*
* @param delegate 委托
*/
- (void)removeDelegate:(id<NIMApnsManagerDelegate>)delegate;
@end
NS_ASSUME_NONNULL_END
//
// NIMAsymEncryptionOption.h
// NIMSDK
//
// Created by Netease on 2019/10/14.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/// SM2加密配置类
@interface NIMSM2Option : NSObject
/// 密钥版本
@property (nonatomic, assign) NSInteger version;
/// SM2 X值
@property (nonatomic, copy) NSString *SM2X;
/// SM2 Y值
@property (nonatomic, copy) NSString *SM2Y;
@end
/// RSA加密配置类
@interface NIMRSAOption : NSObject
/// 密钥版本
@property (nonatomic, assign) NSInteger version;
/// RSA module
@property (nonatomic, copy) NSString *module;
/// RSA exp
@property (nonatomic, assign) NSUInteger exp;
@end
NS_ASSUME_NONNULL_END
//
// NIMAudioObject.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015年 Netease. All rights reserved.
//
#import "NIMMessageObjectProtocol.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 语音实例对象
*/
@interface NIMAudioObject : NSObject<NIMMessageObject>
/**
* 语音对象初始化方法
*
* @param sourcePath 语音路径
*
* @return 语音实例对象
*/
- (instancetype)initWithSourcePath:(NSString *)sourcePath;
/**
* 语音对象初始化方法
*
* @param data 语音数据
* @param extension 语音数据文件后缀名
*
* @return 语音实例对象
*/
- (instancetype)initWithData:(NSData *)data
extension:(NSString *)extension;
/**
* 语音对象初始化方法
*
* @param sourcePath 语音路径
* @param scene 场景类别
*
* @return 语音实例对象
*/
- (instancetype)initWithSourcePath:(NSString *)sourcePath scene:(NSString *)scene;
/**
* 语音对象初始化方法
*
* @param data 语音数据
* @param extension 语音数据文件后缀名
* @param scene 场景类别
*
* @return 语音实例对象
*/
- (instancetype)initWithData:(NSData *)data
extension:(NSString *)extension
scene:(NSString *)scene;
/**
* 语音的本地路径
*/
@property (nullable, nonatomic, copy, readonly) NSString *path;
/**
* 语音的远程路径
*/
@property (nullable, nonatomic, copy, readonly) NSString *url;
/**
* 语音时长,毫秒为单位
* @discussion SDK会根据传入文件信息自动解析出duration,但上层也可以自己设置这个值
*/
@property (nonatomic, assign) NSInteger duration;
/**
* 音频MD5
*/
@property (nullable,nonatomic, copy, readonly) NSString *md5;
@end
NS_ASSUME_NONNULL_END
//
// NIMBatchDeleteMessagesOption.h
// NIMLib
//
// Created by He on 2019/6/25.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 批量删除本地消息选项
*/
@interface NIMBatchDeleteMessagesOption : NSObject
/**
* 起始时间, 默认 0, 单位s
* @discussion 小于等于0表示之前全部消息
*/
@property(nonatomic,assign) NSTimeInterval start;
/**
* 截止时间, 默认 0, 单位s
* @discussion 小于等于0表示当前时间
*/
@property(nonatomic,assign) NSTimeInterval end;
@end
NS_ASSUME_NONNULL_END
//
// NIMBroadcastManagerProtocol.h
// NIMLib
//
// Created by Netease.
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class NIMBroadcastMessage;
/**
* 广播消息委托
*/
@protocol NIMBroadcastManagerDelegate <NSObject>
/**
* 收到广播消息回调
*
* @param broadcastMessage 广播消息
*/
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage;
@end
/**
* 广播消息协议
*/
@protocol NIMBroadcastManager <NSObject>
/**
* 添加广播消息委托
*
* @param delegate 广播通知回调
*/
- (void)addDelegate:(id<NIMBroadcastManagerDelegate>)delegate;
/**
* 移除广播消息委托
*
* @param delegate 广播通知回调
*/
- (void)removeDelegate:(id<NIMBroadcastManagerDelegate>)delegate;
@end
NS_ASSUME_NONNULL_END
//
// NIMBroadcastMessage.h
// NIMLib
//
// Created by Netease.
// Copyright © 2017年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 系统广播
*/
@interface NIMBroadcastMessage : NSObject
/**
* 系统广播 id,全局唯一
*/
@property (nonatomic,assign,readonly) int64_t broadcastId;
/**
* 发起者 id
*/
@property (nullable,nonatomic,copy,readonly) NSString *sender;
/**
* 时间
*/
@property (nonatomic,assign,readonly) NSTimeInterval timestamp;
/**
* 内容
*/
@property (nullable,nonatomic,copy,readonly) NSString *content;
@end
NS_ASSUME_NONNULL_END
//
// NIMCacheQuery.h
// NIMLib
//
// Created by Netease.
// Copyright © 2018年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* SDK 缓存查询选项
*/
@interface NIMResourceQueryOption : NSObject
/**
* 查询的缓存文件类型,类型为文件后缀的集合。
* 默认为 nil ,不分类型查询所有文件缓存。
*/
@property (nonatomic, copy, nullable) NSArray<NSString *> *extensions;
/**
* 当前时间往前多少时间之前所有的消息,默认为 7 天之前。
*/
@property (nonatomic, assign) NSTimeInterval timeInterval;
@end
/**
* SDK 缓存查询结果
*/
@interface NIMCacheQueryResult : NSObject
/**
* 文件路径
*/
@property (nonatomic, copy, readonly) NSString *path;
/**
* 文件的创建日期
*/
@property (nonatomic, strong, readonly) NSDate *creationDate;
/**
* 文件的大小,单位为 bytes
*/
@property (nonatomic, assign, readonly) long long fileLength;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatManagerProtocol.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
@class NIMMessage;
@class NIMSession;
@class NIMMessageReceipt;
@class NIMRevokeMessageNotification;
@class NIMTeamMessageReceiptDetail;
NS_ASSUME_NONNULL_BEGIN
/**
* P2P 发送已读回执 Block
*
* @param error 错误信息,如果成功,error 为 nil
*/
typedef void(^NIMSendMessageReceiptBlock)(NSError * __nullable error);
/**
* Team 发送已读回执 Block
*
* @param error 错误信息,如果成功,error 为 nil
* @param failedReceipts 失败的回执
*/
typedef void(^NIMSendTeamMessageReceiptsBlock)(NSError * __nullable error,NSArray<NIMMessageReceipt *> * __nullable failedReceipts);
/**
* 撤回消息Block
*
* @param error 错误信息,如果成功,error 为 nil
*/
typedef void(^NIMRevokeMessageBlock)(NSError * __nullable error);
/**
* 查询群组消息回执详情Block
*
* @param error 错误,如果成功则error为nil
* @param detail 已读回执详情
*/
typedef void(^NIMQueryReceiptDetailBlock)(NSError * __nullable error,NIMTeamMessageReceiptDetail * __nullable detail);
/**
* 聊天委托
*/
@protocol NIMChatManagerDelegate <NSObject>
@optional
/**
* 即将发送消息回调
* @discussion 因为发消息之前可能会有个准备过程,所以需要在收到这个回调时才将消息加入到 Datasource 中
* @param message 当前发送的消息
*/
- (void)willSendMessage:(NIMMessage *)message;
/**
* 上传资源文件成功的回调
* @discussion 对于需要上传资源的消息(图片,视频,音频等),SDK 将在上传资源成功后通过这个接口进行回调,上层可以在收到该回调后进行推送信息的重新配置 (APNS payload)
* @param urlString 当前消息资源获得的 url 地址
* @param message 当前发送的消息
*/
- (void)uploadAttachmentSuccess:(NSString *)urlString
forMessage:(NIMMessage *)message;
/**
* 发送消息进度回调
*
* @param message 当前发送的消息
* @param progress 进度
*/
- (void)sendMessage:(NIMMessage *)message
progress:(float)progress;
/**
* 发送消息完成回调
*
* @param message 当前发送的消息
* @param error 失败原因,如果发送成功则error为nil
*/
- (void)sendMessage:(NIMMessage *)message
didCompleteWithError:(nullable NSError *)error;
/**
* 收到消息回调
*
* @param messages 消息列表,内部为NIMMessage
*/
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages;
/**
* 收到消息回执
*
* @param receipts 消息回执数组
* @discussion 当上层收到此消息时所有的存储和 model 层业务都已经更新,只需要更新 UI 即可。
*/
- (void)onRecvMessageReceipts:(NSArray<NIMMessageReceipt *> *)receipts;
/**
* 收到消息被撤回的通知
*
* @param notification 被撤回的消息信息
* @discusssion 云信在收到消息撤回后,会先从本地数据库中找到对应消息并进行删除,之后通知上层消息已删除
*/
- (void)onRecvRevokeMessageNotification:(NIMRevokeMessageNotification *)notification;
/**
* 收取消息附件回调
* @param message 当前收取的消息
* @param progress 进度
* @discussion 附件包括:图片,视频的缩略图,语音文件
*/
- (void)fetchMessageAttachment:(NIMMessage *)message
progress:(float)progress;
/**
* 收取消息附件完成回调
*
* @param message 当前收取的消息
* @param error 错误返回,如果收取成功,error为nil
*/
- (void)fetchMessageAttachment:(NIMMessage *)message
didCompleteWithError:(nullable NSError *)error;
@end
/**
* 聊天协议
*/
@protocol NIMChatManager <NSObject>
/**
* 发送消息
*
* @param message 消息
* @param session 接受方
* @param error 错误 如果在准备发送消息阶段发生错误,这个error会被填充相应的信息
*
* @return 是否调用成功,这里返回的 result 只是表示当前这个函数调用是否成功,需要后续的回调才能够判断消息是否已经发送至服务器
*/
- (BOOL)sendMessage:(NIMMessage *)message
toSession:(NIMSession *)session
error:(NSError * __nullable *)error;
/**
* 异步发送消息
*
* @param message 消息
* @param session 接收方
* @param completion 发送完成后的回调,这里的回调完成只表示当前这个函数调用完成,需要后续的回调才能判断消息是否已经发送至服务器
*/
- (void)sendMessage:(NIMMessage *)message
toSession:(NIMSession *)session
completion:(nullable void(^)(NSError * __nullable error))completion;
/**
* 取消正在发送的消息
*
* @param message 目标消息
* @return 是否调用成功
*/
- (BOOL)cancelSendingMessage:(NIMMessage *)message;
/**
* 重发消息
*
* @param message 重发消息
* @param error 错误 如果在准备发送消息阶段发生错误,这个error会被填充相应的信息
*
* @return 是否调用成功,这里返回的 result 只是表示当前这个函数调用是否成功,需要后续的回调才能够判断消息是否已经发送至服务器
*/
- (BOOL)resendMessage:(NIMMessage *)message
error:(NSError * __nullable *)error;
/**
* 转发消息
*
* @param message 消息
* @param session 接收方
* @param error 错误 如果在准备发送消息阶段发生错误,这个error会被填充相应的信息
*
* @return 是否调用成功,这里返回的 result 只是表示当前这个函数调用是否成功,需要后续的回调才能够判断消息是否已经发送至服务器
*/
- (BOOL)forwardMessage:(NIMMessage *)message
toSession:(NIMSession *)session
error:(NSError * __nullable *)error;
/**
* 发送已读回执 (P2P)
*
* @param receipt 已读回执
* @param completion 完成回调
* @discussion 此接口仅适用于 P2P 消息,群消息已读回执使用 sendTeamMessageReceipts:completion 如果已有比当前已读回执时间戳更大的已读回执已确认,则接口返回成功。
*/
- (void)sendMessageReceipt:(NIMMessageReceipt *)receipt
completion:(nullable NIMSendMessageReceiptBlock)completion;
/**
* 发送已读回执 (Team 批量接口)
*
* @param receipts 已读回执
* @param completion 完成回调
* @discussion 此接口仅适用于 Team 消息。
*/
- (void)sendTeamMessageReceipts:(NSArray<NIMMessageReceipt *> *)receipts
completion:(nullable NIMSendTeamMessageReceiptsBlock)completion;
/**
* 刷新群组消息已读、未读数量
*
* @param messages 要查询的消息集合
* @discussion 消息已读变化后,会通过 NIMChatManager 的代理 onRecvMessageReceipts: 回调给上层
* 刷新的消息必须为群组消息
*/
- (void)refreshTeamMessageReceipts:(NSArray<NIMMessage *> *)messages;
/**
* 查询群组消息回执详情
*
* @param message 要查询的消息
* @param completion 完成后的回调
* @discussion 详情包括已读人数的 id 列表和未读人数的 id 列表
* 查询详情对象不会跟着回执人数变化而变化,如果要获取最新的详情,必须再次调用此接口
*
*/
- (void)queryMessageReceiptDetail:(NIMMessage *)message
completion:(NIMQueryReceiptDetailBlock)completion;
/**
* 撤回消息
*
* @param message 需要被撤回的消息
* @param completion 完成回调
*/
- (void)revokeMessage:(NIMMessage *)message
completion:(nullable NIMRevokeMessageBlock)completion;
/**
* 收取消息附件
*
* @param message 需要收取附件的消息
* @param error 错误
*
* @return 是否调用成功
* @discussion 附件包括:图片消息的图片缩略图,视频消息的视频缩略图,音频消息的音频文件,文件消息的文件以及自定义消息中的自定义文件
* 个人和群组消息 SDK 会在收到该消息时自动调用本接口,自动下载除 "文件消息的文件" 外的所有附件内容
*
*/
- (BOOL)fetchMessageAttachment:(NIMMessage *)message
error:(NSError * __nullable *)error;
/**
* 取消收取消息附件
*
* @param message 需要取消收取附件的消息
*
* @discussion 附件包括:图片消息的图片缩略图,视频消息的视频缩略图,音频消息的音频文件,文件消息的文件以及自定义消息中的自定义文件
* 个人和群组消息。SDK 不会触发任何下载回调
*/
- (void)cancelFetchingMessageAttachment:(NIMMessage *)message;
/**
* 消息是否正在传输 (发送/接受附件)
*
* @param message 消息
*
* @return 是否正在传输
*/
- (BOOL)messageInTransport:(NIMMessage *)message;
/**
* 传输消息的进度 (发送/接受附件)
*
* @param message 消息
*
* @return 正在传输的消息进度,如果消息不在传输,则返回0
*/
- (float)messageTransportProgress:(NIMMessage *)message;
/**
* 添加聊天委托
*
* @param delegate 聊天委托
*/
- (void)addDelegate:(id<NIMChatManagerDelegate>)delegate;
/**
* 移除聊天委托
*
* @param delegate 聊天委托
*/
- (void)removeDelegate:(id<NIMChatManagerDelegate>)delegate;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroom.h
// NIMLib
//
// Created by Netease.
// Copyright © 2015 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室队列修改权限
*/
typedef NS_ENUM(NSInteger, NIMChatroomQueueModificationLevel){
/**
* 所有人都可以修改聊天室队列
*/
NIMChatroomQueueModificationLevelAnyone,
/**
* 只有管理员可以修改聊天室队列
*/
NIMChatroomQueueModificationLevelManager,
};
/**
* 聊天室
*/
@interface NIMChatroom : NSObject
/**
* 聊天室Id
*/
@property (nullable,nonatomic,copy) NSString *roomId;
/**
* 聊天室名
*/
@property (nullable,nonatomic,copy) NSString *name;
/**
* 公告
*/
@property (nullable,nonatomic,copy) NSString *announcement;
/**
* 创建者
*/
@property (nullable,nonatomic,copy) NSString *creator;
/**
* 第三方扩展字段,长度限制4K
*/
@property (nullable,nonatomic,copy) NSString *ext;
/**
* 当前在线用户数量
*/
@property (nonatomic,assign) NSInteger onlineUserCount;
/**
* 直播拉流地址
*/
@property (nullable,nonatomic,copy) NSString *broadcastUrl;
/**
* 聊天室队列修改权限等级
*/
@property (nonatomic,assign) NIMChatroomQueueModificationLevel queueModificationLevel;
/**
* 聊天室是否正在全员禁言标记,禁言后只有管理员可以发言
*/
- (BOOL)inAllMuteMode;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomBeKickedResult.h
// NIMLib
//
// Created by Netease.
// Copyright © 2018年 Netease. All rights reserved.
//
#import "NIMChatroomManagerProtocol.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室被踢结果
*/
@interface NIMChatroomBeKickedResult : NSObject
/**
* 被踢的聊天室 Id
*/
@property (nonatomic, copy) NSString *roomId;
/**
* 被踢的原因
*/
@property (nonatomic, assign) NIMChatroomKickReason reason;
/**
* 被踢的扩展字段
*/
@property (nonatomic, copy) NSString *ext;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomEnterRequest.h
// NIMLib
//
// Created by Netease.
// Copyright © 2015 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 获取聊天室地址回调
*/
typedef void(^NIMRequestChatroomAddressesCallback)(NSError * __nullable error,NSArray<NSString *> * __nullable addresses);
/**
* 获取聊天室地址方法
*/
typedef void(^NIMRequestChatroomAddressesHandler)(NSString *roomId,NIMRequestChatroomAddressesCallback callback);
/**
* 聊天室独立模式
*/
@interface NIMChatroomIndependentMode : NSObject
/**
* 独立模式下的用户名
* @discussion 设置为 nil 情况下,SDK 将使用匿名账号进行登录。在匿名模式下,NIMChatroomEnterRequest 必须设置昵称和头像信息
*/
@property (nullable,nonatomic,copy) NSString *username;
/**
* 独立模式下的 Token
* @discussion 当用户名为空时,token 无效
*/
@property (nullable,nonatomic,copy) NSString *token;
/**
* 聊天室 AppKey, 可选填, 如果不填则使用云信IM AppKey
*/
@property (nullable,nonatomic,copy) NSString *chatroomAppKey;
/**
* 注册获取聊天室地址的回调方法
*
* @param handler 获取聊天室地址信息的方法
* @discussion 在进入聊天室和刷新聊天室 IP 时,SDK 都会主动调用这个回调方法,并传入相应的两个参数 `roomId` 和 `callback`。
* 当前回调接口要求上层使用 `roomId` 走自己的网络请求获取对应聊天室地址并通过 callback 回调给 SDK。
* 需要注意的是无论请求是否成功,都需要通过 callback 进行回调,否则进入聊天室请求将会一直等待。同时此接口只需注册一次即可,多次注册将使用后者覆盖前者。
*
* 参考代码:
*
* [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback _Nonnull callback) {
* [YourHTTPService request:roomId completion:^(NSError *error,NSArray *addresses)
* {
* //无论请求是否成功,都需要进行回调
* if(callback)
* {
* callback(error,addresses);
* }
* }];
* }];
*
*/
+ (void)registerRequestChatroomAddressesHandler:(NIMRequestChatroomAddressesHandler)handler;
@end
/**
* 进入聊天室请求
*/
@interface NIMChatroomEnterRequest : NSObject
/**
* 聊天室Id
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 聊天室昵称
* @discussion 上层可以自主设置在聊天室内的昵称,没有设置则使用用户本身的信息
*/
@property (nullable,nonatomic,copy) NSString *roomNickname;
/**
* 聊天室头像
* @discussion 上层可以自主设置在聊天室内的头像,没有设置则使用用户本身的信息
*/
@property (nullable,nonatomic,copy) NSString *roomAvatar;
/**
* 本人的聊天室成员信息拓展字段,仅对当次进入有效
*/
@property (nullable,nonatomic,copy) NSString *roomExt;
/**
* 聊天室事件通知拓展字段
*/
@property (nullable,nonatomic,copy) NSString *roomNotifyExt;
/**
* 聊天室重连次数,默认为三次
* @discussion 设置成 0 后一旦一次连接失败后,SDK 将不在重试。 APP 可以根据自己的需求进行设置
*/
@property (nonatomic,assign) NSInteger retryCount;
/**
* 聊天室独立模式
* @discussion 默认为 nil,即聊天室登录需要依赖 IM 登录,只有 IM 登录后才能够登录聊天室。设置后可以在不依赖 IM 通道的情况下进行登录
*/
@property (nullable,nonatomic,strong) NIMChatroomIndependentMode *mode;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomMember.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室用户类型
*/
typedef NS_ENUM(NSInteger, NIMChatroomMemberType) {
/**
* 普通游客
*/
NIMChatroomMemberTypeGuest = -2,
/**
* 受限用户
*/
NIMChatroomMemberTypeLimit = -1,
/**
* 普通用户
*/
NIMChatroomMemberTypeNormal = 0,
/**
* 创建者
*/
NIMChatroomMemberTypeCreator = 1,
/**
* 管理员
*/
NIMChatroomMemberTypeManager = 2,
/**
* 匿名游客
*/
NIMChatroomMemberTypeAnonymousGuest = 4,
};
/**
* 聊天室用户
*/
@interface NIMChatroomMember : NSObject
/**
* 用户ID
*/
@property (nullable,nonatomic,copy) NSString *userId;
/**
* 聊天室内的昵称字段,由用户进聊天室时提交。
*/
@property (nullable,nonatomic,copy) NSString *roomNickname;
/**
* 聊天室内的头像字段,由用户进聊天室时提交。
*/
@property (nullable,nonatomic,copy) NSString *roomAvatar;
/**
* 用户在聊天室内的头像缩略图
* @discussion 仅适用于使用云信上传服务进行上传的资源,否则无效。
*/
@property (nullable,nonatomic,copy,readonly) NSString *roomAvatarThumbnail;
/**
* 聊天室内预留给开发者的扩展字段,由用户进聊天室时提交。
*/
@property (nullable,nonatomic,copy) NSString *roomExt;
/**
* 用户类型
*/
@property (nonatomic,assign) NIMChatroomMemberType type;
/**
* 是否被禁言
*/
@property (nonatomic,assign) BOOL isMuted;
/**
* 是否被临时禁言
* @discussion 临时禁言和禁言属性无相关性
*/
@property (nonatomic,assign) BOOL isTempMuted;
/**
* 临时禁言剩余时长
*/
@property (nonatomic,assign) unsigned long long tempMuteDuration;
/**
* 是否被拉黑
*/
@property (nonatomic,assign) BOOL isInBlackList;
/**
* 是否在线, 仅特殊成员才可能离线, 对游客用户而言只能是在线
*/
@property (nonatomic,assign) BOOL isOnline;
/**
* 进入聊天室的时间点
*/
@property (nonatomic,assign) NSTimeInterval enterTimeInterval;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomMemberRequest.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class NIMChatroomMember;
/**
* 聊天室成员类型
*/
typedef NS_ENUM(NSInteger, NIMChatroomFetchMemberType){
/**
* 聊天室固定成员,包括创建者,管理员,普通等级用户,受限用户(禁言+黑名单),有数量上限
*/
NIMChatroomFetchMemberTypeRegular,
/**
* 聊天室临时成员,只有在线时才能在列表中看到,数量无上限
*/
NIMChatroomFetchMemberTypeTemp,
/**
* 聊天室在线的固定成员
*/
NIMChatroomFetchMemberTypeRegularOnline,
};
/**
* 聊天室成员信息修改字段
*/
typedef NS_ENUM(NSInteger, NIMChatroomMemberInfoUpdateTag) {
/**
* 聊天室成员昵称信息
*/
NIMChatroomMemberInfoUpdateTagNick = 5,
/**
* 聊天室成员头像信息
*/
NIMChatroomMemberInfoUpdateTagAvatar = 6,
/**
* 聊天室成员扩展信息
*/
NIMChatroomMemberInfoUpdateTagExt = 7,
};
/**
* 聊天室获取成员请求
*/
@interface NIMChatroomMemberRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 聊天室成员类型
*/
@property (nonatomic,assign) NIMChatroomFetchMemberType type;
/**
* 最后一位成员锚点,不包括此成员。填nil会使用当前服务器最新时间开始查询,即第一页。
*/
@property (nullable,nonatomic,strong) NIMChatroomMember *lastMember;
/**
* 获取聊天室成员个数
*/
@property (nonatomic,assign) NSUInteger limit;
@end
/**
* 根据用户ID获取聊天室成员请求
*/
@interface NIMChatroomMembersByIdsRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 用户ID列表,最多20个
*/
@property (nonatomic,copy) NSArray<NSString *> *userIds;
@end
/**
* 聊天室成员标记请求
*/
@interface NIMChatroomMemberUpdateRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 用户ID
*/
@property (nonatomic,copy) NSString *userId;
/**
* 标记是否有效
*/
@property (nonatomic,assign) BOOL enable;
/**
* 操作通知事件扩展
*/
@property (nullable,nonatomic,copy) NSString *notifyExt;
@end
/**
* 聊天室成员信息修改请求
*/
@interface NIMChatroomMemberInfoUpdateRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 需要更新的信息,修改传入的数据键值对是 {@(NIMChatroomMemberInfoUpdateTag) : NSString},无效数据将被过滤
*/
@property (nonatomic,copy) NSDictionary *updateInfo;
/**
* 是否需要通知
*/
@property (nonatomic,assign) BOOL needNotify;
/**
* 操作通知事件扩展
*/
@property (nullable,nonatomic,copy) NSString *notifyExt;
/**
* 更新的信息是否需要在服务器做持久化,只对固定成员生效,默认为 NO
*/
@property (nonatomic,assign) BOOL needSave;
@end
/**
* 聊天室踢人请求
*/
@interface NIMChatroomMemberKickRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 用户ID,仅管理员可以踢人;如userId是管理员仅创建者可以踢.
*/
@property (nonatomic,copy) NSString *userId;
/**
* 被踢通知扩展字段
*/
@property (nullable,nonatomic,copy) NSString *notifyExt;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomNotificationContent.h
// NIMLib
//
// Created by Netease
// Copyright © 2016年 Netease. All rights reserved.
//
#import "NIMNotificationContent.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室操作类型
*/
typedef NS_ENUM(NSInteger, NIMChatroomEventType){
/**
* 成员进入聊天室
*/
NIMChatroomEventTypeEnter = 301,
/**
* 成员离开聊天室
*/
NIMChatroomEventTypeExit = 302,
/**
* 成员被拉黑
*/
NIMChatroomEventTypeAddBlack = 303,
/**
* 成员被取消拉黑
*/
NIMChatroomEventTypeRemoveBlack = 304,
/**
* 成员被设置禁言
*/
NIMChatroomEventTypeAddMute = 305,
/**
* 成员被取消禁言
*/
NIMChatroomEventTypeRemoveMute = 306,
/**
* 设置为管理员
*/
NIMChatroomEventTypeAddManager = 307,
/**
* 移除管理员
*/
NIMChatroomEventTypeRemoveManager = 308,
/**
* 设置为固定成员
*/
NIMChatroomEventTypeAddCommon = 309,
/**
* 取消固定成员
*/
NIMChatroomEventTypeRemoveCommon = 310,
/**
* 聊天室被关闭
*/
NIMChatroomEventTypeClosed = 311,
/**
* 聊天室信息更新
*/
NIMChatroomEventTypeInfoUpdated = 312,
/**
* 聊天室成员被踢
*/
NIMChatroomEventTypeKicked = 313,
/**
* 聊天室成员被临时禁言
*/
NIMChatroomEventTypeAddMuteTemporarily = 314,
/**
* 聊天室成员被解除临时禁言
*/
NIMChatroomEventTypeRemoveMuteTemporarily = 315,
/**
* 聊天室成员主动更新了聊天室的角色信息
*/
NIMChatroomEventTypeMemberUpdateInfo = 316,
/**
* 聊天室通用队列变更的通知
*/
NIMChatroomEventTypeQueueChange = 317,
/**
* 聊天室被禁言了,只有管理员可以发言,其他人都处于禁言状态
*/
NIMChatroomEventTypeRoomMuted = 318,
/**
* 聊天室不在禁言状态
*/
NIMChatroomEventTypeRoomUnMuted = 319,
/**
* 聊天室通用队列批量变更的通知
*/
NIMChatroomEventTypeQueueBatchChange = 320,
};
/**
* 聊天室队列变更类型
*/
typedef NS_ENUM(NSInteger, NIMChatroomQueueChangeType){
/**
* 无效或未知变更类型
*/
NIMChatroomQueueChangeTypeInvalid = 0,
/**
* 新增元素
*/
NIMChatroomQueueChangeTypeOffer = 1,
/**
* 取出元素
*/
NIMChatroomQueueChangeTypePoll = 2,
/**
* 清空元素
*/
NIMChatroomQueueChangeTypeDrop = 3,
/**
* 更新元素
*/
NIMChatroomQueueChangeTypeUpdate = 5,
};
/**
* 聊天室队列批量变更类型
*/
typedef NS_ENUM(NSInteger, NIMChatroomQueueBatchChangeType){
/**
* 无效或未知变更类型
*/
NIMChatroomQueueBatchChangeTypeInvalid = 0,
/**
* 部分批量清理操作(发生在提交元素的用户掉线时,清理这个用户对应的key)
*/
NIMChatroomQueueBatchChangeTypePartClear = 4,
};
/**
* 通知事件包含的聊天室成员
*/
@interface NIMChatroomNotificationMember : NSObject
/**
* 聊天室成员ID
*/
@property (nullable,nonatomic,copy,readonly) NSString *userId;
/**
* 聊天室成员昵称
*/
@property (nullable,nonatomic,copy,readonly) NSString *nick;
@end
/**
* 聊天室通知内容
*/
@interface NIMChatroomNotificationContent : NIMNotificationContent
/**
* 聊天室通知事件类型
*/
@property (nonatomic,assign,readonly) NIMChatroomEventType eventType;
/**
* 操作者
*/
@property (nullable,nonatomic,copy,readonly) NIMChatroomNotificationMember *source;
/**
* 被操作者
*/
@property (nullable,nonatomic,copy,readonly) NSArray<NIMChatroomNotificationMember *> *targets;
/**
* 通知信息
*/
@property (nullable,nonatomic,copy,readonly) NSString *notifyExt;
/**
* 拓展信息
* @discusssion 不同的聊天室通知有不同的扩展信息
* NIMChatroomEventTypeAddMuteTemporarily/NIMChatroomEventTypeRemoveMuteTemporarily 类型: 拓展信息为NSNumber,表示临时禁言时长
*
* NIMChatroomEventTypeEnter 类型: 扩展信息为 NSDictionary , KEY 值为 NIMChatroomEventInfoMutedKey ,NIMChatroomEventInfoTempMutedKey, NIMChatroomEventInfoTempMutedDurationKey
*
* NIMChatroomEventTypeQueueChange 类型: 扩展信息为 NSDictionary, KEY 值为 NIMChatroomEventInfoQueueChangeTypeKey , NIMChatroomEventInfoQueueChangeItemKey, NIMChatroomEventInfoQueueChangeItemValueKey
*/
@property (nullable,nonatomic,copy,readonly) id ext;
@end
/**
* 是否是禁言状态
*/
extern NSString *const NIMChatroomEventInfoMutedKey;
/**
* 是否为临时禁言状态
*/
extern NSString *const NIMChatroomEventInfoTempMutedKey;
/**
* 临时禁言时长
*/
extern NSString *const NIMChatroomEventInfoTempMutedDurationKey;
/**
* 聊天室变更类型
*/
extern NSString *const NIMChatroomEventInfoQueueChangeTypeKey;
/**
* 聊天室变更元素
*/
extern NSString *const NIMChatroomEventInfoQueueChangeItemKey;
/**
* 聊天室批量变更元素,为包含多个键值对的字典
*/
extern NSString *const NIMChatroomEventInfoQueueChangeItemsKey;
/**
* 聊天室变更元素的值
*/
extern NSString *const NIMChatroomEventInfoQueueChangeItemValueKey;
NS_ASSUME_NONNULL_END
//
// NIMChatroomQueueRequest.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室通用队列更新请求
*/
@interface NIMChatroomQueueUpdateRequest : NSObject
/**
* 聊天室 ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 更新元素的 Key 值,如果 key 在队列中存在则更新,不存在则放到队列尾部 ,长度限制为 32 字节
*/
@property (nonatomic,copy) NSString *key;
/**
* 更新元素的 Value 值,长度限制为 4096 字节
*/
@property (nonatomic,copy) NSString *value;
/**
* 当提交这个新元素的用户从聊天室掉线或退出的时候,是否需要删除这个元素,默认为 NO 不删除。
*/
@property (nonatomic,assign) BOOL transient;
@end
/**
* 聊天室通用队列取出请求
*/
@interface NIMChatroomQueueRemoveRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 拉去元素的Key值,如果要拉取第一个元素,则传空
*/
@property (nullable,nonatomic,copy) NSString *key;
@end
/**
* 聊天室通用队列批量更新请求
*/
@interface NIMChatroomQueueBatchUpdateRequest : NSObject
/**
* 聊天室 ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 批量更新元素的key-value对,key/value分别是elementKey和elementValue(elementKey限制128字节,elementValue限制4096字节),一次最多更新100个
*/
@property (nonatomic,copy) NSDictionary *elements;
/**
* 是否需要发送广播通知
*/
@property (nonatomic,assign) BOOL needNotify;
/**
* 通知中的自定义字段,长度限制2048
*/
@property (nonatomic,copy) NSString* notifyExt;
@end
NS_ASSUME_NONNULL_END
//
// NIMChatroomUpdateRequest.h
// NIMLib
//
// Created by Netease.
// Copyright © 2016年 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 聊天室信息修改字段
* @discussion 等级枚举见 `NIMChatroomQueueModificationLevel`
*/
typedef NS_ENUM(NSInteger, NIMChatroomUpdateTag){
/**
* 聊天室名称
*/
NIMChatroomUpdateTagName = 3,
/**
* 聊天室公告
*/
NIMChatroomUpdateTagAnnouncement = 4,
/**
* 聊天室直播拉流地址
*/
NIMChatroomUpdateTagBroadcastUrl = 5,
/**
* 聊天室扩展字段
*/
NIMChatroomUpdateTagExt = 12,
/**
* 聊天室队列修改等级,只有管理员和房主可以修改
*/
NIMChatroomUpdateTagQueueModificationLevel = 16
};
/**
* 聊天室信息更新请求
*/
@interface NIMChatroomUpdateRequest : NSObject
/**
* 聊天室ID
*/
@property (nonatomic,copy) NSString *roomId;
/**
* 修改信息字段,修改传入的数据键值对是 {@(NIMChatroomUpdateTag) : NSString 或 NSNumber},无效数据将被过滤
*/
@property (nonatomic,copy) NSDictionary *updateInfo;
/**
* 是否需要通知, 默认NO
*/
@property (nonatomic,assign) BOOL needNotify;
/**
* 放到事件通知里的扩展字段
*/
@property (nullable,nonatomic,copy) NSString *notifyExt;
@end
NS_ASSUME_NONNULL_END
//
// NIMClearMessagesOption.h
// NIMLib
//
// Created by He on 2019/3/20.
// Copyright © 2019 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
* 清空消息选项
*/
@interface NIMClearMessagesOption : NSObject
/**
* 是否同时删除服务端漫游消息, 默认为 YES
*/
@property (nonatomic,assign) BOOL removeRoam;
@end
NS_ASSUME_NONNULL_END
//
// NIMCreateTeamOption.h
// NIMLib
//
// Created by Netease
// Copyright © 2016 Netease. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NIMTeamDefs.h"
NS_ASSUME_NONNULL_BEGIN
/**
* 创建群选项
*/
@interface NIMCreateTeamOption : NSObject
/**
* 群名
*/
@property (nullable,nonatomic,copy) NSString *name;
/**
* 群类型
* @discussion 默认为普通群
*/
@property (nonatomic,assign) NIMTeamType type;
/**
* 群头像
*/
@property (nullable,nonatomic,copy) NSString *avatarUrl;
/**
* 群简介
*/
@property (nullable,nonatomic,copy) NSString *intro;
/**
* 群公告
*/
@property (nullable,nonatomic,copy) NSString *announcement;
/**
* 客户端自定义信息
*/
@property (nullable,nonatomic,copy) NSString *clientCustomInfo;
/**
* 邀请他人的附言
* @discussion 高级群有效,普通群无需附言
*/
@property (nullable,nonatomic,copy) NSString *postscript;
/**
* 群验证模式
* @discussion 只有高级群有效,默认为 NIMTeamJoinModeNoAuth
*/
@property (nonatomic,assign) NIMTeamJoinMode joinMode;
/**
* 群邀请权限
* @discussion 只有高级群有效,默认为 NIMTeamInviteModeManager
*/
@property (nonatomic,assign) NIMTeamInviteMode inviteMode;
/**
* 被邀请模式
* @discussion 只有高级群有效,默认为 NIMTeamBeInviteModeNeedAuth
*/
@property (nonatomic,assign) NIMTeamBeInviteMode beInviteMode;
/**
* 修改群信息权限
* @discussion 只有高级群有效,默认为 NIMTeamUpdateInfoModeManager
*/
@property (nonatomic,assign) NIMTeamUpdateInfoMode updateInfoMode;
/**
* 修改群客户端自定义字段权限
* @discussion 只有高级群有效,默认为 NIMTeamUpdateClientCustomModeManager
*/
@property (nonatomic,assign) NIMTeamUpdateClientCustomMode updateClientCustomMode;
/**
* 设置群最大人数上限
* @discussion 默认为0,表示使用默认人数上限
*/
@property (nonatomic,assign) NSUInteger maxMemberCountLimitation;
@end
NS_ASSUME_NONNULL_END
//
// NIMCustomObject.h
// NIMLib
//
// Created by Netease.
// Copyright (c) 2015年 Netease. All rights reserved.
//
#import "NIMMessageObjectProtocol.h"
NS_ASSUME_NONNULL_BEGIN
/*
除了 SDK 预定义的几种消息类型,上层APP开发者如果想要实现更多的消息类型,不可避免需要使用自定义消息这种类型
由于 SDK 并不能预测上层 APP 的应用场景,所以 NIMCustomObject 采取消息透传的方式以提供给上层开发者最大的自由度
即 SDK 只负责发送和收取由 NIMCustomObject 中 id<NIMCustomAttachment> attachment 序列化和反序列化后的字节流
在发送端,SDK 获取 encodeAttachment 后得到的字节流发送至对面端
在接收端,SDK 读取字节流,并通过上层 APP 设置的反序列化对象进行解析 (registerCustomDecoder:)
文件上传:
为了方便 APP 在自定义消息类型中进行文件的上传,SDK 也提供了三个接口文件上传
即只要 APP 实现上传相关的接口,资源的上传就可以由 SDK 自动完成
如需要上传资源需要实现的接口有:
1. - (BOOL)attachmentNeedsUpload 是否有文件需要上传,在有文件且文件没有上传成功时返回YES
2. - (NSString *)attachmentPathForUploading 返回需要上传的文件路径
3. - (void)updateAttachmentURL:(NSString *)urlString 上传成功后SDK会调用这个接口,APP 需要实现这个接口来保存上传后的URL
具体可以参考 DEMO 中阅后即焚的实现
*/
/**
* 自定义消息对象附件协议
*/
@protocol NIMCustomAttachment <NSObject>
@required
/**
* 序列化attachment
*
* @return 序列化后的结果,将用于透传
*/
- (NSString *)encodeAttachment;
@optional
#pragma mark - 上传相关接口
/**
* 是否需要上传附件
*
* @return 是否需要上传附件
*/
- (BOOL)attachmentNeedsUpload;
/**
* 需要上传的附件路径
*
* @return 路径
*/
- (NSString *)attachmentPathForUploading;
/**
* 更新附件URL
*
* @param urlString 附件url
*/
- (void)updateAttachmentURL:(NSString *)urlString;
#pragma mark - 下载相关接口
/**
* 是否需要下载附件
*
* @return 是否需要上传附件
*/
- (BOOL)attachmentNeedsDownload;
/**
* 需要下载的附件url
*
* @return 附件url
* @discussion 如果当前字段是云信的 http url 地址,那么需要调用 id<NIMResourceManager> 中 normalizeURLString: 方法将这个地址进行转 https 和 cdn 加速格式
*/
- (NSString *)attachmentURLStringForDownloading;
/**
* 需要下载的附件本地路径
*
* @return 附件本地路径
* @discussion 上层需要保证路径的
*/
- (NSString *)attachmentPathForDownloading;
@end
/**
* 自定义消息对象附件序列化协议
*/
@protocol NIMCustomAttachmentCoding<NSObject>
@required
/**
* 反序列化
*
* @param content 透传的自定义消息
*
* @return 自定义消息附件
*/
- (nullable id<NIMCustomAttachment>)decodeAttachment:(nullable NSString *)content;
@end
/**
* 用户自定义消息对象
*/
@interface NIMCustomObject : NSObject<NIMMessageObject>
/**
* 用户自定义附件
* @discussion SDK负责将attachment通过encodeAttachment接口序列化后的结果进行透传
*/
@property(nullable, nonatomic, strong) id<NIMCustomAttachment> attachment;
/**
* 注册自定义消息解析器
*
* @param decoder 自定义消息解析器
* @disucssion 如果用户使用自定义消息类型,就需要注册自定义消息解析器,负责将透传过来的自定义消息反序列化成上层应用可识别的对象
*/
+ (void)registerCustomDecoder:(id<NIMCustomAttachmentCoding>)decoder;
@end
NS_ASSUME_NONNULL_END
差异被折叠。 点击展开。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册登录 后发表评论