| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- //
- // TCLoginModel.m
- // TCLVBIMDemo
- //
- // Created by dackli on 16/8/3.
- // Copyright © 2016年 tencent. All rights reserved.
- //
- #import "TCLoginModel.h"
- #import "TCUserInfoModel.h"
- #import "TCLiveListModel.h"
- #import "TCConstants.h"
- #import "TCUtil.h"
- #ifndef APP_EXT
- #import "AppDelegate.h"
- #endif
- #import "AFNetworking.h"
- #import "NSString+Common.h"
- #import "TCLiveListModel.h"
- #define kAutoLoginKey @"kAutoLoginKey"
- #define kEachKickErrorCode 6208 //互踢下线错误码
- static NSString * const UserNameRegex = @"^[a-zA-Z][a-zA-Z0-9_]{3,23}$";
- static NSString * const UserNameDesc = @"TCRegisterView.UserNameRule";
- static NSString * const PasswordRegex = @"^[a-zA-Z0-9_]+$";
- static NSString * const PasswordDesc = @"TCRegisterView.PasswordRule";
- @interface TCLoginModel()
- {
- TCLoginParam *_loginParam;
- NSTimer *_refreshTimer;
- }
- @property (nonatomic, copy) NSString* sign;
- @property (nonatomic, copy) NSString* txTime;
- @property (nonatomic, copy) NSString* accountType;
- @property (nonatomic, assign) int sdkAppID;
- @end
- @implementation TCLoginModel
- static TCLoginModel *_sharedInstance = nil;
- + (instancetype)sharedInstance {
- static dispatch_once_t predicate;
- dispatch_once(&predicate, ^{
- _sharedInstance = [[TCLoginModel alloc] init];
- });
- return _sharedInstance;
- }
- -(instancetype)init{
- self = [super init];
- if (self) {
- _loginParam = [TCLoginParam shareInstance];
- }
- return self;
- }
- + (BOOL)isAutoLogin {
- NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP];
- if (defaults == nil) {
- defaults = [NSUserDefaults standardUserDefaults];
- }
- NSNumber *num = [defaults objectForKey:kAutoLoginKey];
- return [num boolValue];
- }
- + (void)setAutoLogin:(BOOL)autoLogin {
- NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP];
- if (defaults == nil) {
- defaults = [NSUserDefaults standardUserDefaults];
- }
- [defaults setObject:@(autoLogin) forKey:kAutoLoginKey];
- }
- - (void)refreshLogin {
- NSDate *expireDate = [_loginParam expireDate];
- if (expireDate) {
- if ([expireDate timeIntervalSinceNow] < 3600) {
- [self _doRefresh];
- } else {
- [self scheduleRefreshLoginForExpireDate:expireDate];
- }
- }
- }
- - (void)onRefreshTimer:(NSTimer *)timer {
- [self _doRefresh];
- }
- - (void)_doRefresh {
- [self refreshLoginWithParam:_loginParam completion:^(TCLoginParam *param, int code, NSString *msg) {
- if (code == 0) {
- [param saveToLocal];
- _loginParam = param;
- [[TCLoginParam shareInstance] loadFromLocal];
- [self scheduleRefreshLoginForExpireDate:param.expireDate];
- }
- }];
- }
- - (void)scheduleRefreshLoginForExpireDate:(NSDate *)date {
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- if (_refreshTimer) {
- [_refreshTimer invalidate];
- _refreshTimer = nil;
- }
- if (date == nil) {
- return;
- }
- NSDate *nextRefreshDate = [date dateByAddingTimeInterval:-3600];
- if ([nextRefreshDate compare:[NSDate date]] == NSOrderedAscending) {
- nextRefreshDate = [NSDate dateWithTimeIntervalSinceNow:10];
- }
- _refreshTimer = [NSTimer scheduledTimerWithTimeInterval:[nextRefreshDate timeIntervalSinceNow] target:self selector:@selector(onRefreshTimer:) userInfo:nil repeats:NO];
- }];
- }
- - (void)refreshLoginWithParam:(TCLoginParam *)loginParam completion:(void(^)(TCLoginParam* param, int code, NSString *msg))completion {
- [[TCLoginModel sharedInstance] login:loginParam.identifier hashPwd:loginParam.hashedPwd succ:^(NSString* userName, NSString* md5pwd ,NSString *token,NSString *refreshToken,NSInteger expires) {
- TCLoginParam *param = [[TCLoginParam alloc] init];
- param.identifier = userName;
- param.hashedPwd = loginParam.hashedPwd;
- param.token = token;
- param.tokenTime = [[NSDate date] timeIntervalSince1970];
- param.refreshToken = refreshToken;
- param.expires = expires;
- if (completion) {
- completion(param, 0, nil);
- }
- [TCUtil report:xiaoshipin_login userName:userName code:200 msg:@"自动登录成功"];
- } fail:^(NSString *userName, int errCode, NSString *errMsg) {
- if (completion) {
- completion(nil, errCode, errMsg);
- }
- [TCUtil report:xiaoshipin_login userName:userName code:errCode msg:@"自动登录失败"];
- }];
- }
- - (void)registerWithUsername:(NSString *)username password:(NSString *)password succ:(TCRegistSuccess)succ fail:(TCRegistFail)fail
- {
- NSString* pwdMD5 = [password md5];
- NSString* hashPwd = [[pwdMD5 stringByAppendingString:username] md5];
- NSDictionary* params = @{@"userid": username, @"password": hashPwd};
- [TCUtil asyncSendHttpRequest:@"register" params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
- NSLog(@"%d, %@, %@", resultCode, message, resultDict.description);
- if (resultCode == 200) {
- succ(username, hashPwd);
- }
- else {
- fail(resultCode, message);
- }
- }];
- }
- - (void)loginWithUsername:(NSString *)username password:(NSString *)password succ:(TCLoginSuccess)succ fail:(TCLoginFail)fail
- {
- NSString* pwdMD5 = [password md5];
- NSString* hashPwd = [[pwdMD5 stringByAppendingString:username] md5];
- [self login:username hashPwd:hashPwd succ:succ fail:fail];
- }
- - (void)login:(NSString*)username hashPwd:(NSString*)hashPwd succ:(TCLoginSuccess)succ fail:(TCLoginFail)fail
- {
- NSDictionary* params = @{@"userid": username, @"password": hashPwd};
- __weak typeof(self) weakSelf = self;
- [TCUtil asyncSendHttpRequest:@"login" params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
- if (resultCode == 200) {
- NSString *token = resultDict[@"token"];
- NSString *refreshToken = resultDict[@"refresh_token"];
- NSInteger expires = ((NSNumber*)resultDict[@"expires"]).unsignedLongLongValue;
- if (resultDict[@"cos_info"]) {
- [[TCUserInfoModel sharedInstance] setBucket:resultDict[@"cos_info"][@"Bucket"] secretId:resultDict[@"cos_info"][@"SecretId"]
- appid:[resultDict[@"cos_info"][@"Appid"] longLongValue] region:resultDict[@"cos_info"][@"Region"] accountType:weakSelf.accountType];
- }
- //_loginParam
- [TCLoginModel setAutoLogin:YES];
- succ(username, hashPwd ,token,refreshToken,expires);
- [[TCUserInfoModel sharedInstance] fetchUserInfo];
- }
- else {
- fail(username,resultCode, message);
- }
- }];
- }
- - (void)logout:(TCLogoutComplete)completion {
- [TCLoginModel setAutoLogin:NO];
- [[NSNotificationCenter defaultCenter] postNotificationName:logoutNotification object:nil];
- if (completion) {
- completion();
- }
- self.sign = nil;
- self.txTime = nil;
- _loginParam = nil;
- }
- - (TCLoginParam *)getLoginParam {
- if (_loginParam) {
- return _loginParam;
- }
- return [[TCLoginParam alloc] init];
- }
- - (void)getCosSign:(void (^)(int, NSString *, NSDictionary *))completion
- {
- NSDictionary* params = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
- [TCUtil asyncSendHttpRequest:@"get_cos_sign" token:_loginParam.token params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
- completion(resultCode, message, resultDict);
- }];
- }
- - (void)getVodSign:(void (^)(int, NSString *, NSDictionary *))completion
- {
- NSDictionary* params = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
- [TCUtil asyncSendHttpRequest:@"get_vod_sign" token:_loginParam.token params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
- completion(resultCode, message, resultDict);
- }];
- }
- - (void)uploadUGC:(NSDictionary *)params completion:(void (^)(int, NSString *, NSDictionary *))completion
- {
- NSDictionary* hparams = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
- NSMutableDictionary* mparams = [NSMutableDictionary dictionaryWithDictionary:hparams];
- [mparams addEntriesFromDictionary:params];
- [TCUtil asyncSendHttpRequest:@"upload_ugc" token:_loginParam.token params:mparams handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
- completion(resultCode, message, resultDict);
- }];
- }
- - (BOOL)_validateString:(NSString *)string regex:(NSString *)regexString
- {
- NSError *error = nil;
- NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:0 error:&error];
- NSAssert(error == nil, @"Username Regex is invalid: %@", [error localizedDescription]);
- NSRange stringRange = NSMakeRange(0, string.length);
- NSRange range = [regex firstMatchInString:string options:0 range:stringRange].range;
- return NSEqualRanges(stringRange, range);
- }
- - (BOOL)validateUserName:(NSString *)username failedReason:(NSString **)reason
- {
- if (username == nil || [username length] == 0) {
- if (reason) {
- *reason = NSLocalizedString(@"TCLoginView.ErrorEmptyUserName", nil);
- }
- return NO;
- }
- if (![self _validateString:username regex:UserNameRegex]) {
- if (reason) {
- *reason = NSLocalizedString(UserNameDesc, nil);
- }
- return NO;
- }
- return YES;
- }
- - (BOOL)validatePassword:(NSString *)pwd failedReason:(NSString **)reason
- {
- if (pwd == nil || [pwd length] == 0) {
- if (reason) {
- *reason = NSLocalizedString(@"TCLoginView.ErrorEmptyPassword", nil);
- }
- return NO;
- }
- if (![self _validateString:pwd regex:PasswordRegex]) {
- if (reason) {
- *reason = PasswordDesc;
- }
- return NO;
- }
- return YES;
- }
- @end
|