TCLoginModel.m 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //
  2. // TCLoginModel.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by dackli on 16/8/3.
  6. // Copyright © 2016年 tencent. All rights reserved.
  7. //
  8. #import "TCLoginModel.h"
  9. #import "TCUserInfoModel.h"
  10. #import "TCLiveListModel.h"
  11. #import "TCConstants.h"
  12. #import "TCUtil.h"
  13. #ifndef APP_EXT
  14. #import "AppDelegate.h"
  15. #endif
  16. #import "AFNetworking.h"
  17. #import "NSString+Common.h"
  18. #import "TCLiveListModel.h"
  19. #define kAutoLoginKey @"kAutoLoginKey"
  20. #define kEachKickErrorCode 6208 //互踢下线错误码
  21. static NSString * const UserNameRegex = @"^[a-zA-Z][a-zA-Z0-9_]{3,23}$";
  22. static NSString * const UserNameDesc = @"TCRegisterView.UserNameRule";
  23. static NSString * const PasswordRegex = @"^[a-zA-Z0-9_]+$";
  24. static NSString * const PasswordDesc = @"TCRegisterView.PasswordRule";
  25. @interface TCLoginModel()
  26. {
  27. TCLoginParam *_loginParam;
  28. NSTimer *_refreshTimer;
  29. }
  30. @property (nonatomic, copy) NSString* sign;
  31. @property (nonatomic, copy) NSString* txTime;
  32. @property (nonatomic, copy) NSString* accountType;
  33. @property (nonatomic, assign) int sdkAppID;
  34. @end
  35. @implementation TCLoginModel
  36. static TCLoginModel *_sharedInstance = nil;
  37. + (instancetype)sharedInstance {
  38. static dispatch_once_t predicate;
  39. dispatch_once(&predicate, ^{
  40. _sharedInstance = [[TCLoginModel alloc] init];
  41. });
  42. return _sharedInstance;
  43. }
  44. -(instancetype)init{
  45. self = [super init];
  46. if (self) {
  47. _loginParam = [TCLoginParam shareInstance];
  48. }
  49. return self;
  50. }
  51. + (BOOL)isAutoLogin {
  52. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP];
  53. if (defaults == nil) {
  54. defaults = [NSUserDefaults standardUserDefaults];
  55. }
  56. NSNumber *num = [defaults objectForKey:kAutoLoginKey];
  57. return [num boolValue];
  58. }
  59. + (void)setAutoLogin:(BOOL)autoLogin {
  60. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP];
  61. if (defaults == nil) {
  62. defaults = [NSUserDefaults standardUserDefaults];
  63. }
  64. [defaults setObject:@(autoLogin) forKey:kAutoLoginKey];
  65. }
  66. - (void)refreshLogin {
  67. NSDate *expireDate = [_loginParam expireDate];
  68. if (expireDate) {
  69. if ([expireDate timeIntervalSinceNow] < 3600) {
  70. [self _doRefresh];
  71. } else {
  72. [self scheduleRefreshLoginForExpireDate:expireDate];
  73. }
  74. }
  75. }
  76. - (void)onRefreshTimer:(NSTimer *)timer {
  77. [self _doRefresh];
  78. }
  79. - (void)_doRefresh {
  80. [self refreshLoginWithParam:_loginParam completion:^(TCLoginParam *param, int code, NSString *msg) {
  81. if (code == 0) {
  82. [param saveToLocal];
  83. _loginParam = param;
  84. [[TCLoginParam shareInstance] loadFromLocal];
  85. [self scheduleRefreshLoginForExpireDate:param.expireDate];
  86. }
  87. }];
  88. }
  89. - (void)scheduleRefreshLoginForExpireDate:(NSDate *)date {
  90. [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  91. if (_refreshTimer) {
  92. [_refreshTimer invalidate];
  93. _refreshTimer = nil;
  94. }
  95. if (date == nil) {
  96. return;
  97. }
  98. NSDate *nextRefreshDate = [date dateByAddingTimeInterval:-3600];
  99. if ([nextRefreshDate compare:[NSDate date]] == NSOrderedAscending) {
  100. nextRefreshDate = [NSDate dateWithTimeIntervalSinceNow:10];
  101. }
  102. _refreshTimer = [NSTimer scheduledTimerWithTimeInterval:[nextRefreshDate timeIntervalSinceNow] target:self selector:@selector(onRefreshTimer:) userInfo:nil repeats:NO];
  103. }];
  104. }
  105. - (void)refreshLoginWithParam:(TCLoginParam *)loginParam completion:(void(^)(TCLoginParam* param, int code, NSString *msg))completion {
  106. [[TCLoginModel sharedInstance] login:loginParam.identifier hashPwd:loginParam.hashedPwd succ:^(NSString* userName, NSString* md5pwd ,NSString *token,NSString *refreshToken,NSInteger expires) {
  107. TCLoginParam *param = [[TCLoginParam alloc] init];
  108. param.identifier = userName;
  109. param.hashedPwd = loginParam.hashedPwd;
  110. param.token = token;
  111. param.tokenTime = [[NSDate date] timeIntervalSince1970];
  112. param.refreshToken = refreshToken;
  113. param.expires = expires;
  114. if (completion) {
  115. completion(param, 0, nil);
  116. }
  117. [TCUtil report:xiaoshipin_login userName:userName code:200 msg:@"自动登录成功"];
  118. } fail:^(NSString *userName, int errCode, NSString *errMsg) {
  119. if (completion) {
  120. completion(nil, errCode, errMsg);
  121. }
  122. [TCUtil report:xiaoshipin_login userName:userName code:errCode msg:@"自动登录失败"];
  123. }];
  124. }
  125. - (void)registerWithUsername:(NSString *)username password:(NSString *)password succ:(TCRegistSuccess)succ fail:(TCRegistFail)fail
  126. {
  127. NSString* pwdMD5 = [password md5];
  128. NSString* hashPwd = [[pwdMD5 stringByAppendingString:username] md5];
  129. NSDictionary* params = @{@"userid": username, @"password": hashPwd};
  130. [TCUtil asyncSendHttpRequest:@"register" params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
  131. NSLog(@"%d, %@, %@", resultCode, message, resultDict.description);
  132. if (resultCode == 200) {
  133. succ(username, hashPwd);
  134. }
  135. else {
  136. fail(resultCode, message);
  137. }
  138. }];
  139. }
  140. - (void)loginWithUsername:(NSString *)username password:(NSString *)password succ:(TCLoginSuccess)succ fail:(TCLoginFail)fail
  141. {
  142. NSString* pwdMD5 = [password md5];
  143. NSString* hashPwd = [[pwdMD5 stringByAppendingString:username] md5];
  144. [self login:username hashPwd:hashPwd succ:succ fail:fail];
  145. }
  146. - (void)login:(NSString*)username hashPwd:(NSString*)hashPwd succ:(TCLoginSuccess)succ fail:(TCLoginFail)fail
  147. {
  148. NSDictionary* params = @{@"userid": username, @"password": hashPwd};
  149. __weak typeof(self) weakSelf = self;
  150. [TCUtil asyncSendHttpRequest:@"login" params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
  151. if (resultCode == 200) {
  152. NSString *token = resultDict[@"token"];
  153. NSString *refreshToken = resultDict[@"refresh_token"];
  154. NSInteger expires = ((NSNumber*)resultDict[@"expires"]).unsignedLongLongValue;
  155. if (resultDict[@"cos_info"]) {
  156. [[TCUserInfoModel sharedInstance] setBucket:resultDict[@"cos_info"][@"Bucket"] secretId:resultDict[@"cos_info"][@"SecretId"]
  157. appid:[resultDict[@"cos_info"][@"Appid"] longLongValue] region:resultDict[@"cos_info"][@"Region"] accountType:weakSelf.accountType];
  158. }
  159. //_loginParam
  160. [TCLoginModel setAutoLogin:YES];
  161. succ(username, hashPwd ,token,refreshToken,expires);
  162. [[TCUserInfoModel sharedInstance] fetchUserInfo];
  163. }
  164. else {
  165. fail(username,resultCode, message);
  166. }
  167. }];
  168. }
  169. - (void)logout:(TCLogoutComplete)completion {
  170. [TCLoginModel setAutoLogin:NO];
  171. [[NSNotificationCenter defaultCenter] postNotificationName:logoutNotification object:nil];
  172. if (completion) {
  173. completion();
  174. }
  175. self.sign = nil;
  176. self.txTime = nil;
  177. _loginParam = nil;
  178. }
  179. - (TCLoginParam *)getLoginParam {
  180. if (_loginParam) {
  181. return _loginParam;
  182. }
  183. return [[TCLoginParam alloc] init];
  184. }
  185. - (void)getCosSign:(void (^)(int, NSString *, NSDictionary *))completion
  186. {
  187. NSDictionary* params = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
  188. [TCUtil asyncSendHttpRequest:@"get_cos_sign" token:_loginParam.token params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
  189. completion(resultCode, message, resultDict);
  190. }];
  191. }
  192. - (void)getVodSign:(void (^)(int, NSString *, NSDictionary *))completion
  193. {
  194. NSDictionary* params = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
  195. [TCUtil asyncSendHttpRequest:@"get_vod_sign" token:_loginParam.token params:params handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
  196. completion(resultCode, message, resultDict);
  197. }];
  198. }
  199. - (void)uploadUGC:(NSDictionary *)params completion:(void (^)(int, NSString *, NSDictionary *))completion
  200. {
  201. NSDictionary* hparams = @{@"userid": _loginParam.identifier, @"timestamp":@([[NSDate date] timeIntervalSince1970] * 1000), @"expires":@(_loginParam.expires)};
  202. NSMutableDictionary* mparams = [NSMutableDictionary dictionaryWithDictionary:hparams];
  203. [mparams addEntriesFromDictionary:params];
  204. [TCUtil asyncSendHttpRequest:@"upload_ugc" token:_loginParam.token params:mparams handler:^(int resultCode, NSString *message, NSDictionary *resultDict) {
  205. completion(resultCode, message, resultDict);
  206. }];
  207. }
  208. - (BOOL)_validateString:(NSString *)string regex:(NSString *)regexString
  209. {
  210. NSError *error = nil;
  211. NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:0 error:&error];
  212. NSAssert(error == nil, @"Username Regex is invalid: %@", [error localizedDescription]);
  213. NSRange stringRange = NSMakeRange(0, string.length);
  214. NSRange range = [regex firstMatchInString:string options:0 range:stringRange].range;
  215. return NSEqualRanges(stringRange, range);
  216. }
  217. - (BOOL)validateUserName:(NSString *)username failedReason:(NSString **)reason
  218. {
  219. if (username == nil || [username length] == 0) {
  220. if (reason) {
  221. *reason = NSLocalizedString(@"TCLoginView.ErrorEmptyUserName", nil);
  222. }
  223. return NO;
  224. }
  225. if (![self _validateString:username regex:UserNameRegex]) {
  226. if (reason) {
  227. *reason = NSLocalizedString(UserNameDesc, nil);
  228. }
  229. return NO;
  230. }
  231. return YES;
  232. }
  233. - (BOOL)validatePassword:(NSString *)pwd failedReason:(NSString **)reason
  234. {
  235. if (pwd == nil || [pwd length] == 0) {
  236. if (reason) {
  237. *reason = NSLocalizedString(@"TCLoginView.ErrorEmptyPassword", nil);
  238. }
  239. return NO;
  240. }
  241. if (![self _validateString:pwd regex:PasswordRegex]) {
  242. if (reason) {
  243. *reason = PasswordDesc;
  244. }
  245. return NO;
  246. }
  247. return YES;
  248. }
  249. @end