// // AVUserManager.m // AVDemo // #import "AVUserManager.h" #import static NSString * const kUserLoggedInKey = @"AVUserLoggedIn"; static NSString * const kUserUsernameKey = @"AVUserUsername"; @interface AVUserManager () @property (nonatomic, strong) AFHTTPSessionManager *sessionManager; @end @implementation AVUserManager + (instancetype)sharedManager { static AVUserManager *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } - (instancetype)init { self = [super init]; if (self) { // 从 UserDefaults 读取登录状态 _isLoggedIn = [[NSUserDefaults standardUserDefaults] boolForKey:kUserLoggedInKey]; _currentUsername = [[NSUserDefaults standardUserDefaults] stringForKey:kUserUsernameKey]; // 初始化网络请求管理器 self.sessionManager = [AFHTTPSessionManager manager]; self.sessionManager.responseSerializer = [AFJSONResponseSerializer serializer]; self.sessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; self.sessionManager.requestSerializer.timeoutInterval = 10; } return self; } - (void)loginWithUsername:(NSString *)username password:(NSString *)password completion:(void (^)(BOOL success, NSString * _Nullable errorMessage))completion { // 基本参数验证 if (username.length == 0) { if (completion) { completion(NO, @"用户名不能为空"); } return; } if (password.length == 0) { if (completion) { completion(NO, @"密码不能为空"); } return; } // 登录 API 端点 NSString *loginURL = @"http://rtmp.sellycloud.io:8089/live/sdk/demo/login"; // 请求参数 NSDictionary *parameters = @{ @"username": username, @"password": password }; NSLog(@"🚀 开始登录请求: %@", username); // 发起 POST 请求 [self.sessionManager POST:loginURL parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 登录成功 NSLog(@"✅ 登录成功,服务器响应: %@", responseObject); // 保存登录状态 [self saveLoginStateWithUsername:username]; // 可以根据需要保存服务器返回的其他信息(如 token、userId 等) // 例如: // if (responseObject[@"token"]) { // [[NSUserDefaults standardUserDefaults] setObject:responseObject[@"token"] forKey:@"AVUserToken"]; // } // 回调成功 if (completion) { completion(YES, nil); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 登录失败 NSLog(@"❌ 登录失败: %@", error.localizedDescription); NSString *errorMessage = @"登录失败,请检查用户名和密码"; // 尝试获取 HTTP 状态码 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response; if (httpResponse) { NSLog(@"❌ HTTP 状态码: %ld", (long)httpResponse.statusCode); } // 尝试解析服务器返回的错误信息 if (error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]) { NSData *errorData = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; NSDictionary *errorDict = [NSJSONSerialization JSONObjectWithData:errorData options:0 error:nil]; NSLog(@"❌ 服务器错误响应: %@", errorDict); // 尝试多种可能的错误信息字段 if (errorDict[@"message"]) { errorMessage = errorDict[@"message"]; } else if (errorDict[@"error"]) { errorMessage = errorDict[@"error"]; } else if (errorDict[@"msg"]) { errorMessage = errorDict[@"msg"]; } } else { // 网络错误 errorMessage = [NSString stringWithFormat:@"网络请求失败: %@", error.localizedDescription]; } // 回调失败 if (completion) { completion(NO, errorMessage); } }]; } - (void)saveLoginStateWithUsername:(NSString *)username { _isLoggedIn = YES; _currentUsername = username; // 持久化保存 [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kUserLoggedInKey]; [[NSUserDefaults standardUserDefaults] setObject:username forKey:kUserUsernameKey]; [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)logout { _isLoggedIn = NO; // 清除持久化数据 [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kUserLoggedInKey]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"✅ 用户已登出"); } @end