RQUserManager.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. //
  2. // RQUserManager.m
  3. // BuckDriverStudent
  4. //
  5. // Created by 张嵘 on 2019/10/24.
  6. // Copyright © 2019 RONG. All rights reserved.
  7. //
  8. #import "RQUserManager.h"
  9. //#import "RQHTTPService+RQUpdateUser.h"
  10. #import "RQLoginViewModel.h"
  11. #include <CommonCrypto/CommonCrypto.h>
  12. /// 用户信息的名称
  13. static NSString * const RQUserDataFileName = @"senba_empty_user.data";
  14. /// 用户数据配置完成
  15. NSString *const RQUserDataConfigureCompleteNotification = @"RQUserDataConfigureCompleteNotification";
  16. /// 用户数据配置完成,取出userInfo 数据的的key
  17. NSString *const RQUserDataConfigureCompleteUserInfoKey = @"RQUserDataConfigureCompleteUserInfoKey";
  18. @interface RQUserManager ()
  19. /// currentLoginUser
  20. @property (nonatomic, readwrite, strong) RQUserModel *currentUser;
  21. @property (nonatomic, readwrite, assign) BOOL isObserve;
  22. @property (nonatomic, readwrite, strong) RQLoginViewModel *loginViewModel;
  23. @end
  24. @implementation RQUserManager
  25. static id rq_userManager = nil;
  26. #pragma mark - init
  27. + (instancetype)sharedInstance {
  28. static dispatch_once_t onceToken;
  29. dispatch_once(&onceToken, ^{
  30. rq_userManager = [[self alloc] init];
  31. });
  32. return rq_userManager;
  33. }
  34. - (instancetype)init {
  35. if (self = [super init]) {
  36. }
  37. return self;
  38. }
  39. #pragma mark - Private Method
  40. - (void)saveUser:(RQUserModel *)user {
  41. /// 记录用户数据
  42. self.currentUser = user;
  43. /// 保存
  44. BOOL status = [NSKeyedArchiver archiveRootObject:user toFile:RQFilePathFromWeChatDoc(RQUserDataFileName)];
  45. NSLog(@"Save login user data, the status is %@",status?@"Success...":@"Failure...");
  46. if (_currentUser && !_isObserve) {
  47. [self beginObserveUser];
  48. }
  49. }
  50. - (void)deleteUser:(RQUserModel *)user{
  51. /// 删除
  52. self.currentUser = nil;
  53. BOOL status = [RQFileManager removeFile:RQFilePathFromWeChatDoc(RQUserDataFileName)];
  54. NSLog(@"Delete login user data , the status is %@",status?@"Success...":@"Failure...");
  55. self.currentUser = nil;
  56. _isObserve = !status;
  57. }
  58. - (RQUserModel *)currentUser {
  59. if (!_currentUser) {
  60. _currentUser = [NSKeyedUnarchiver unarchiveObjectWithFile:RQFilePathFromWeChatDoc(RQUserDataFileName) exception:nil];
  61. if (_currentUser && !_isObserve) {
  62. [self beginObserveUser];
  63. }
  64. }
  65. return _currentUser;
  66. }
  67. /// 是否登录
  68. - (BOOL)isLogin {
  69. if (RQObjectIsNil(self.currentUser)) {
  70. return NO;
  71. } else {
  72. return YES;
  73. }
  74. }
  75. /// 是否需要登录
  76. - (BOOL)isShouldLogin {
  77. if (RQObjectIsNil(self.currentUser)) {
  78. if (![RQControllerHelper.currentViewController isKindOfClass:[RQLoginViewController class]]) {
  79. [RQ_APPDELEGATE.services pushViewModel:self.loginViewModel animated:YES];
  80. }
  81. return NO;
  82. } else {
  83. return YES;
  84. }
  85. }
  86. /// 是否开启活体检测 0-不开启 1-开启
  87. - (NSInteger)isycbd {
  88. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.isycbd)? [RQ_USER_MANAGER.currentUser.isycbd integerValue] : 0) : NO;
  89. }
  90. /// 活体检测比对动作数量
  91. - (NSInteger)ycbdFaceCount {
  92. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.ycbdFaceCount)? [RQ_USER_MANAGER.currentUser.ycbdFaceCount integerValue] : 0) : NO;
  93. }
  94. /// sfzb 是否开启作弊 1开启 0不开启
  95. - (NSInteger)sfzb {
  96. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.sfzb)? [RQ_USER_MANAGER.currentUser.sfzb integerValue] : 0) : NO;
  97. }
  98. /// qzgx 是否强制更新 1开启 0不开启
  99. - (NSInteger)qzgx {
  100. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.qzgx)? [RQ_USER_MANAGER.currentUser.qzgx integerValue] : 0) : NO;
  101. }
  102. /// 验证等级 0 不验证 1 宽松 2 严格 3 困难
  103. - (NSInteger)verifyLevel {
  104. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.verifyLevel)? [RQ_USER_MANAGER.currentUser.verifyLevel integerValue] : 0) : NO;
  105. }
  106. /// 实操扫码验证地市 1 开启 0 关闭
  107. - (BOOL)isOpenScan {
  108. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.isOpenScan)? [RQ_USER_MANAGER.currentUser.isOpenScan boolValue] : NO) : NO;
  109. }
  110. /// qzVideo:1强制观看 0无需观看
  111. - (BOOL)isQzVideo {
  112. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.qzVideo)? [RQ_USER_MANAGER.currentUser.qzVideo boolValue] : NO) : NO;
  113. }
  114. /// 11和12类型的就是从业 其他的或者为空的就是普通
  115. - (NSInteger)busitype {
  116. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.busitype)? [RQ_USER_MANAGER.currentUser.busitype integerValue] : 0) : 0;
  117. }
  118. - (void)setTryLookCount:(NSInteger)tryLookCount {
  119. NSString *key = [NSString stringWithFormat:@"RQTryLookCountKey-%@",RQ_USER_MANAGER.currentUser._id];
  120. [RQ_COMMON_MANAGER saveObjectWithObject:[NSNumber numberWithInteger:tryLookCount] ForKey:key];
  121. }
  122. - (NSInteger)tryLookCount {
  123. NSString *key = [NSString stringWithFormat:@"RQTryLookCountKey-%@",RQ_USER_MANAGER.currentUser._id];
  124. id object = [RQ_COMMON_MANAGER getObjectWithKey:key];
  125. if (RQObjectIsNil(object)) {
  126. return 5;
  127. } else {
  128. NSInteger tryLookCount = [object integerValue];
  129. return tryLookCount;
  130. }
  131. }
  132. /// 是否从业考核
  133. - (BOOL)isCykh {
  134. // return (self.busitype == 11 || self.busitype == 12);
  135. return ([self.currentUser.carType isEqualToString:@"A2"] || [self.currentUser.carType isEqualToString:@"B2"] ||
  136. self.busitype == 11 || self.busitype == 12); //2023-06-06 新需求
  137. }
  138. - (void)loginUser:(RQUserModel *)user{
  139. /// 保存用户
  140. [self saveUser:user];
  141. /// 发送登录成功的通知
  142. [self postUserDataConfigureCompleteNotification];
  143. /// 设置别名
  144. // [SBJPushService setAlias];
  145. }
  146. /// 退出登录
  147. - (void)logoutUser{
  148. RQUserModel *currentUser = [self currentUser];
  149. currentUser.channel = RQUserLoginChannelTypeDefault;
  150. [self saveUser:currentUser];
  151. /// 删除别名
  152. // [SBJPushService deleteAlias];
  153. //
  154. // /// 删除token
  155. // [self deleteToken];
  156. RQ_VIP_Module.isVip = NO;
  157. RQ_VIP_Module.isADVip = NO;
  158. RQ_VIP_Module.isSubject1Vip = NO;
  159. RQ_VIP_Module.isSubject2Vip = NO;
  160. RQ_VIP_Module.isSubject3Vip = NO;
  161. RQ_VIP_Module.isSubject4Vip = NO;
  162. RQ_VIP_Module.isSubjectAllVip = NO;
  163. RQ_VIP_Module.videoVipModel = nil;
  164. NSInteger localVersion = [[RQ_APP_VERSION stringByReplacingOccurrencesOfString:@"." withString:@""] integerValue];
  165. [[RQ_HTTP_Service getJsjpSet] subscribeNext:^(NSArray *setArr) {
  166. [setArr.rac_sequence.signal subscribeNext:^(RQDictInfoModel *dictInfoModel) {
  167. if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_OPEN"]) {
  168. RQ_COMMON_MANAGER.JSJP_APP_AD_OPEN = [[NSString stringWithFormat:@"%@",dictInfoModel.dictValue] isEqualToString:@"1"]? YES : NO;
  169. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_CYCLE"]) {
  170. RQ_COMMON_MANAGER.JSJP_APP_AD_CYCLE = [dictInfoModel.dictValue integerValue];
  171. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Is_Online_Media_Image"]) {
  172. RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image = [dictInfoModel.dictValue boolValue];
  173. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Is_Online_Media_Video"]) {
  174. RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video = [dictInfoModel.dictValue boolValue];
  175. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Online_Version"]) {
  176. NSInteger customOnlineVersion = [[[NSString stringWithFormat:@"%@",dictInfoModel.dictValue] stringByReplacingOccurrencesOfString:@"." withString:@""] integerValue];
  177. RQ_COMMON_MANAGER.APP_SWITCH = (localVersion >= customOnlineVersion);
  178. RQ_COMMON_MANAGER.APP_SWITCH = NO;
  179. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_ICON_NEED_CHANGE"]) {
  180. RQ_COMMON_MANAGER.JSJP_APP_ICON_NEED_CHANGE = [dictInfoModel.dictValue boolValue];
  181. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_RATE"]) {
  182. RQ_COMMON_MANAGER.JSJP_APP_AD_RATE = [dictInfoModel.dictValue integerValue];
  183. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_PTSC_FBL"]) {
  184. RQ_COMMON_MANAGER.JSJP_APP_PTSC_FBL = dictInfoModel.dictValue;
  185. }
  186. }];
  187. }];
  188. /// 删除用户数据
  189. [self deleteUser:currentUser];
  190. }
  191. /// 用户信息配置完成
  192. - (void)postUserDataConfigureCompleteNotification{
  193. RQUserModel *user = [self currentUser];
  194. [RQNotificationCenter postNotificationName:RQUserDataConfigureCompleteNotification object:nil userInfo:@{RQUserDataConfigureCompleteUserInfoKey:user}];
  195. }
  196. - (void)beginObserveUser {
  197. _isObserve = YES;
  198. [[RACSignal combineLatest:@[[RACObserve(self.currentUser, nickName) distinctUntilChanged], [RACObserve(self.currentUser, userName) distinctUntilChanged], [RACObserve(self.currentUser, sex) distinctUntilChanged], [RACObserve(self.currentUser, birthday) distinctUntilChanged], [RACObserve(self.currentUser, carType) distinctUntilChanged], [RACObserve(self.currentUser, email) distinctUntilChanged], [RACObserve(self.currentUser, address) distinctUntilChanged], [RACObserve(self.currentUser, password) distinctUntilChanged]] reduce:^(NSString *nickName, NSString *userName, NSString *sex, NSString *birthday, NSString *carType, NSString *email, NSString *address, NSString *password) {
  199. return self.currentUser;
  200. }] subscribeNext:^(RQUserModel *userModel) {
  201. [self updateUserData];
  202. }];
  203. }
  204. /// 比对本地网络数据
  205. - (void)updateUserData {
  206. // [[RQ_HTTP_Service updateUserWithID:self.currentUser.id userName:self.currentUser.userName sex:self.currentUser.sex birthday:self.currentUser.birthday email:self.currentUser.email address:self.currentUser.address nickName:self.currentUser.nickName password:self.currentUser.password photoContent:self.currentUser.photoContent carType:self.currentUser.carType idCard:self.currentUser.idCard] subscribeNext:^(RQUserModel *userModel) {
  207. // userModel.channel = RQ_USER_MANAGER.currentUser.channel;
  208. // [self willChangeValueForKey:@"user"];
  209. // /// user模型的数据 重置,但是user的 指针地址不变
  210. // [self.currentUser mergeValuesForKeysFromModel:userModel];
  211. // [self didChangeValueForKey:@"user"];
  212. // } error:^(NSError * _Nullable error) {
  213. // [MBProgressHUD rq_showErrorTips:error];
  214. // }];
  215. }
  216. - (void)checkVersionWithComplete:(VoidBlock_Bool)complete {
  217. /// 1: open 2: close
  218. // [[RQ_HTTP_Service getConfigKeyWithPath:RQButtonSwitchOriginalPath] subscribeNext:^(NSString *isOpenStr) {
  219. // if ([isOpenStr isEqualToString:@"1"]) {
  220. // complete(YES);
  221. // } else {
  222. // complete(NO);
  223. // }
  224. // } error:^(NSError * _Nullable error) {
  225. // complete(NO);
  226. // }];
  227. }
  228. #pragma mark - LazyLoad
  229. - (RQLoginViewModel *)loginViewModel {
  230. if (!_loginViewModel) {
  231. _loginViewModel = [[RQLoginViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:nil];
  232. }
  233. return _loginViewModel;
  234. }
  235. @end