Files
real-e-party-iOS/YuMi/Modules/YMMessage/Tool/NIMSDKManager.m
edwinQQQ a35a711be6 chore: Initial clean commit
- Removed YuMi/Library/ (138 MB, not tracked)
- Removed YuMi/Resources/ (23 MB, not tracked)
- Removed old version assets (566 files, not tracked)
- Excluded Pods/, xcuserdata/ and other build artifacts
- Clean repository optimized for company server deployment
2025-10-09 16:19:14 +08:00

411 lines
12 KiB
Objective-C

//
// NIMSDKManager.m
// YUMI
//
// Created by YUMI on 2024/12/19.
//
#import "NIMSDKManager.h"
#import "CustomAttachmentDecoder.h"
#import "YUMIConstant.h"
@interface NIMSDKManager () <NIMLoginManagerDelegate, NIMChatManagerDelegate, NIMSystemNotificationManagerDelegate, NIMBroadcastManagerDelegate>
@property (nonatomic, strong) NIMSDKConfigModel *config;
@property (nonatomic, assign) NIMSDKLoginStatus loginStatus;
@property (nonatomic, strong) NSMutableArray<id<NIMSDKManagerDelegate>> *delegates;
@property (nonatomic, copy) NIMSDKStatusChangeBlock statusChangeBlock;
@property (nonatomic, assign) BOOL isInitialized;
@end
@implementation NIMSDKManager
#pragma mark - 单例方法
+ (instancetype)sharedManager {
static NIMSDKManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NIMSDKManager alloc] init];
});
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
_delegates = [NSMutableArray array];
_loginStatus = NIMSDKLoginStatusNotLogin;
_isInitialized = NO;
}
return self;
}
#pragma mark - 配置和初始化
- (void)configureWithConfig:(NIMSDKConfigModel *)config {
self.config = config;
}
- (void)initializeWithCompletion:(void(^)(NSError * _Nullable error))completion {
if (self.isInitialized) {
if (completion) {
completion(nil);
}
return;
}
// 检查配置
if (!self.config || !self.config.appKey) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-1
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK配置不完整"}];
if (completion) {
completion(error);
}
return;
}
// 创建SDK选项
NIMSDKOption *option = [NIMSDKOption optionWithAppKey:self.config.appKey];
if (self.config.apnsCername) {
option.apnsCername = self.config.apnsCername;
}
// 注册SDK
[[NIMSDK sharedSDK] registerWithOption:option];
// 注册自定义解码器
[self registerCustomDecoder:[[CustomAttachmentDecoder alloc] init]];
// 配置SDK参数
[NIMSDKConfig sharedConfig].shouldConsiderRevokedMessageUnreadCount = self.config.shouldConsiderRevokedMessageUnreadCount;
[[NIMSDKConfig sharedConfig] setShouldSyncStickTopSessionInfos:self.config.shouldSyncStickTopSessionInfos];
[NIMSDKConfig sharedConfig].enabledHttpsForInfo = self.config.enabledHttpsForInfo;
[NIMSDKConfig sharedConfig].enabledHttpsForMessage = self.config.enabledHttpsForMessage;
// 添加代理
[[NIMSDK sharedSDK].loginManager addDelegate:self];
[[NIMSDK sharedSDK].chatManager addDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
[[NIMSDK sharedSDK].broadcastManager addDelegate:self];
self.isInitialized = YES;
if (completion) {
completion(nil);
}
}
- (void)registerCustomDecoder:(id<NIMCustomAttachmentCoding>)decoder {
[NIMCustomObject registerCustomDecoder:decoder];
}
#pragma mark - 登录管理
- (void)loginWithAccount:(NSString *)account
token:(NSString *)token
completion:(NIMSDKLoginCompletion)completion {
if (!self.isInitialized) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-2
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK未初始化"}];
if (completion) {
completion(error);
}
return;
}
self.loginStatus = NIMSDKLoginStatusLogging;
[self notifyStatusChange];
[[NIMSDK sharedSDK].loginManager login:account
token:token
completion:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
self.loginStatus = NIMSDKLoginStatusNotLogin;
} else {
self.loginStatus = NIMSDKLoginStatusLogined;
}
[self notifyStatusChange];
if (completion) {
completion(error);
}
});
}];
}
- (void)autoLoginWithData:(NSDictionary *)data
completion:(NIMSDKLoginCompletion)completion {
if (!self.isInitialized) {
NSError *error = [NSError errorWithDomain:@"NIMSDKManager"
code:-2
userInfo:@{NSLocalizedDescriptionKey: @"NIMSDK未初始化"}];
if (completion) {
completion(error);
}
return;
}
self.loginStatus = NIMSDKLoginStatusLogging;
[self notifyStatusChange];
[[NIMSDK sharedSDK].loginManager autoLogin:data];
// 注意:自动登录的结果通过代理方法回调
// 这里暂时返回成功,实际结果通过代理通知
if (completion) {
completion(nil);
}
}
- (void)logoutWithCompletion:(NIMSDKLogoutCompletion)completion {
[[NIMSDK sharedSDK].loginManager logout:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!error) {
self.loginStatus = NIMSDKLoginStatusLogout;
[self notifyStatusChange];
}
if (completion) {
completion(error);
}
});
}];
}
- (void)forceLogoutWithCompletion:(NIMSDKLogoutCompletion)completion {
// 强制登出,清理所有状态
[[NIMSDK sharedSDK].loginManager logout:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusLogout;
[self notifyStatusChange];
if (completion) {
completion(error);
}
});
}];
}
#pragma mark - 状态查询
- (NIMSDKLoginStatus)currentLoginStatus {
return self.loginStatus;
}
- (BOOL)isLogined {
return [[NIMSDK sharedSDK].loginManager isLogined];
}
- (NSString *)currentAccount {
return [[NIMSDK sharedSDK].loginManager currentAccount];
}
#pragma mark - 推送管理
- (void)updateApnsToken:(NSData *)deviceToken {
[[NIMSDK sharedSDK] updateApnsToken:deviceToken];
}
- (BOOL)handlePushNotification:(NSDictionary *)userInfo {
// 处理推送消息的逻辑
// 这里可以根据具体的推送格式进行解析和处理
return YES;
}
#pragma mark - 代理管理
- (void)addDelegate:(id<NIMSDKManagerDelegate>)delegate {
if (delegate && ![self.delegates containsObject:delegate]) {
[self.delegates addObject:delegate];
}
}
- (void)removeDelegate:(id<NIMSDKManagerDelegate>)delegate {
[self.delegates removeObject:delegate];
}
- (void)setLoginStatusChangeBlock:(NIMSDKStatusChangeBlock)block {
self.statusChangeBlock = block;
}
#pragma mark - 消息管理
- (void)sendMessage:(NIMMessage *)message
toSession:(NIMSession *)session
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatManager sendMessage:message
toSession:session
error:nil];
// 注意:实际发送结果通过代理方法回调
if (completion) {
completion(nil);
}
}
- (NSInteger)unreadMessageCount {
return [[NIMSDK sharedSDK].conversationManager allUnreadCount];
}
- (NSArray<NIMRecentSession *> *)allRecentSessions {
return [[NIMSDK sharedSDK].conversationManager allRecentSessions];
}
#pragma mark - 用户管理
- (NIMUser *)userInfo:(NSString *)userId {
return [[NIMSDK sharedSDK].userManager userInfo:userId];
}
- (void)fetchUserInfos:(NSArray<NSString *> *)userIds
completion:(void(^)(NSArray<NIMUser *> * _Nullable users, NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].userManager fetchUserInfos:userIds
completion:completion];
}
#pragma mark - 聊天室管理
- (void)enterChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatroomManager enterChatroom:roomId
completion:completion];
}
- (void)exitChatroom:(NSString *)roomId
completion:(void(^)(NSError * _Nullable error))completion {
[[NIMSDK sharedSDK].chatroomManager exitChatroom:roomId
completion:completion];
}
#pragma mark - 工具方法
- (NIMMessage *)createCustomMessageWithAttachment:(id<NIMCustomAttachment>)attachment {
NIMCustomObject *customObject = [[NIMCustomObject alloc] init];
customObject.attachment = attachment;
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = customObject;
return message;
}
- (NIMMessage *)createTextMessage:(NSString *)text {
return [[NIMMessage alloc] initWithText:text];
}
- (NIMMessage *)createImageMessage:(UIImage *)image {
NIMImageObject *imageObject = [[NIMImageObject alloc] initWithImage:image];
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = imageObject;
return message;
}
- (NIMMessage *)createAudioMessage:(NSString *)filePath duration:(NSTimeInterval)duration {
NIMAudioObject *audioObject = [[NIMAudioObject alloc] initWithSourcePath:filePath];
audioObject.duration = duration;
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = audioObject;
return message;
}
#pragma mark - 清理方法
- (void)cleanup {
// 移除代理
[[NIMSDK sharedSDK].loginManager removeDelegate:self];
[[NIMSDK sharedSDK].chatManager removeDelegate:self];
[[NIMSDK sharedSDK].systemNotificationManager removeDelegate:self];
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
// 清理状态
self.loginStatus = NIMSDKLoginStatusNotLogin;
self.isInitialized = NO;
[self.delegates removeAllObjects];
self.statusChangeBlock = nil;
}
#pragma mark - 私有方法
- (void)notifyStatusChange {
// 通知代理
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didChangeLoginStatus:)]) {
[delegate nimSDKManager:self didChangeLoginStatus:self.loginStatus];
}
}
// 通知block
if (self.statusChangeBlock) {
self.statusChangeBlock(self.loginStatus);
}
}
#pragma mark - NIMLoginManagerDelegate
- (void)onAutoLoginFailed:(NSError *)error {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusAutoLoginFailed;
[self notifyStatusChange];
// 通知代理
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didAutoLoginFailed:)]) {
[delegate nimSDKManager:self didAutoLoginFailed:error];
}
}
});
}
- (void)onKickout:(NIMLoginKickoutResult *)result {
dispatch_async(dispatch_get_main_queue(), ^{
self.loginStatus = NIMSDKLoginStatusKickout;
[self notifyStatusChange];
// 通知代理
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didKickout:)]) {
[delegate nimSDKManager:self didKickout:result];
}
}
});
}
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
dispatch_async(dispatch_get_main_queue(), ^{
// 通知代理
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didReceiveMessages:)]) {
[delegate nimSDKManager:self didReceiveMessages:messages];
}
}
});
}
#pragma mark - NIMBroadcastManagerDelegate
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage {
dispatch_async(dispatch_get_main_queue(), ^{
// 通知代理
for (id<NIMSDKManagerDelegate> delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(nimSDKManager:didReceiveBroadcastMessage:)]) {
[delegate nimSDKManager:self didReceiveBroadcastMessage:broadcastMessage];
}
}
});
}
@end