RQUserManager.m 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. @property (nonatomic, strong) NSArray *cityData;
  24. @property (nonatomic, strong) NSArray *cityCodeData;
  25. @end
  26. @implementation RQUserManager
  27. static id rq_userManager = nil;
  28. #pragma mark - init
  29. + (instancetype)sharedInstance {
  30. static dispatch_once_t onceToken;
  31. dispatch_once(&onceToken, ^{
  32. rq_userManager = [[self alloc] init];
  33. });
  34. return rq_userManager;
  35. }
  36. - (instancetype)init {
  37. if (self = [super init]) {
  38. }
  39. return self;
  40. }
  41. #pragma mark - Private Method
  42. - (void)saveUser:(RQUserModel *)user {
  43. /// 记录用户数据
  44. self.currentUser = user;
  45. /// 保存
  46. BOOL status = [NSKeyedArchiver archiveRootObject:user toFile:RQFilePathFromWeChatDoc(RQUserDataFileName)];
  47. NSLog(@"Save login user data, the status is %@",status?@"Success...":@"Failure...");
  48. if (_currentUser && !_isObserve) {
  49. [self beginObserveUser];
  50. }
  51. }
  52. - (void)deleteUser:(RQUserModel *)user{
  53. /// 删除
  54. self.currentUser = nil;
  55. BOOL status = [RQFileManager removeFile:RQFilePathFromWeChatDoc(RQUserDataFileName)];
  56. NSLog(@"Delete login user data , the status is %@",status?@"Success...":@"Failure...");
  57. self.currentUser = nil;
  58. _isObserve = !status;
  59. }
  60. - (RQUserModel *)currentUser {
  61. if (!_currentUser) {
  62. _currentUser = [NSKeyedUnarchiver unarchiveObjectWithFile:RQFilePathFromWeChatDoc(RQUserDataFileName) exception:nil];
  63. if (_currentUser && !_isObserve) {
  64. [self beginObserveUser];
  65. }
  66. }
  67. return _currentUser;
  68. }
  69. /// 是否登录
  70. - (BOOL)isLogin {
  71. if (RQObjectIsNil(self.currentUser)) {
  72. return NO;
  73. } else {
  74. return YES;
  75. }
  76. }
  77. /// 是否需要登录
  78. - (BOOL)isShouldLogin {
  79. if (RQObjectIsNil(self.currentUser)) {
  80. if (![RQControllerHelper.currentViewController isKindOfClass:[RQLoginViewController class]]) {
  81. [RQ_APPDELEGATE.services pushViewModel:self.loginViewModel animated:YES];
  82. }
  83. return NO;
  84. } else {
  85. return YES;
  86. }
  87. }
  88. /// 是否开启活体检测 0-不开启 1-开启
  89. - (NSInteger)isycbd {
  90. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.isycbd)? [RQ_USER_MANAGER.currentUser.isycbd integerValue] : 0) : NO;
  91. }
  92. /// 活体检测比对动作数量
  93. - (NSInteger)ycbdFaceCount {
  94. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.ycbdFaceCount)? [RQ_USER_MANAGER.currentUser.ycbdFaceCount integerValue] : 0) : NO;
  95. }
  96. - (NSInteger)scbdFaceCount {
  97. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.scbdFaceCount)? [RQ_USER_MANAGER.currentUser.scbdFaceCount integerValue] : 0) : NO;
  98. }
  99. /// sfzb 是否开启作弊 1开启 0不开启
  100. - (NSInteger)sfzb {
  101. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.sfzb)? [RQ_USER_MANAGER.currentUser.sfzb integerValue] : 0) : NO;
  102. }
  103. /// qzgx 是否强制更新 1开启 0不开启
  104. - (NSInteger)qzgx {
  105. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.qzgx)? [RQ_USER_MANAGER.currentUser.qzgx integerValue] : 0) : NO;
  106. }
  107. /// 验证等级 0 不验证 1 宽松 2 严格 3 困难
  108. - (NSInteger)verifyLevel {
  109. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.verifyLevel)? [RQ_USER_MANAGER.currentUser.verifyLevel integerValue] : 0) : NO;
  110. }
  111. /// 实操扫码验证地市 1 开启 0 关闭
  112. - (BOOL)isOpenScan {
  113. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.isOpenScan)? [RQ_USER_MANAGER.currentUser.isOpenScan boolValue] : NO) : NO;
  114. }
  115. /// qzVideo:1强制观看 0无需观看
  116. - (BOOL)isQzVideo {
  117. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.qzVideo)? [RQ_USER_MANAGER.currentUser.qzVideo boolValue] : NO) : NO;
  118. }
  119. /// 11和12类型的就是从业 其他的或者为空的就是普通
  120. - (NSInteger)busitype {
  121. return RQ_USER_MANAGER.currentUser? (RQStringIsNotEmpty(RQ_USER_MANAGER.currentUser.busitype)? [RQ_USER_MANAGER.currentUser.busitype integerValue] : 0) : 0;
  122. }
  123. - (void)setTryLookCount:(NSInteger)tryLookCount {
  124. NSString *key = [NSString stringWithFormat:@"RQTryLookCountKey-%@",RQ_USER_MANAGER.currentUser._id];
  125. [RQ_COMMON_MANAGER saveObjectWithObject:[NSNumber numberWithInteger:tryLookCount] ForKey:key];
  126. }
  127. - (NSInteger)tryLookCount {
  128. NSString *key = [NSString stringWithFormat:@"RQTryLookCountKey-%@",RQ_USER_MANAGER.currentUser._id];
  129. id object = [RQ_COMMON_MANAGER getObjectWithKey:key];
  130. if (RQObjectIsNil(object)) {
  131. return 4;
  132. } else {
  133. NSInteger tryLookCount = [object integerValue];
  134. return tryLookCount;
  135. }
  136. }
  137. /// 是否从业考核
  138. - (BOOL)isCykh {
  139. // return (self.busitype == 11 || self.busitype == 12);
  140. return ([self.currentUser.carType isEqualToString:@"A2"] || [self.currentUser.carType isEqualToString:@"B2"] ||
  141. self.busitype == 11 || self.busitype == 12); //2023-06-06 新需求
  142. }
  143. - (void)loginUser:(RQUserModel *)user{
  144. _city_dbId = nil;
  145. /// 保存用户
  146. [self saveUser:user];
  147. /// 发送登录成功的通知
  148. [self postUserDataConfigureCompleteNotification];
  149. /// 设置别名
  150. // [SBJPushService setAlias];
  151. }
  152. /// 退出登录
  153. - (void)logoutUser{
  154. RQUserModel *currentUser = [self currentUser];
  155. currentUser.channel = RQUserLoginChannelTypeDefault;
  156. [self saveUser:currentUser];
  157. /// 删除别名
  158. // [SBJPushService deleteAlias];
  159. //
  160. // /// 删除token
  161. // [self deleteToken];
  162. RQ_VIP_Module.isVip = NO;
  163. RQ_VIP_Module.isADVip = NO;
  164. RQ_VIP_Module.isSubject1Vip = NO;
  165. RQ_VIP_Module.isSubject2Vip = NO;
  166. RQ_VIP_Module.isSubject3Vip = NO;
  167. RQ_VIP_Module.isSubject4Vip = NO;
  168. RQ_VIP_Module.isSubjectAllVip = NO;
  169. RQ_VIP_Module.videoVipModel = nil;
  170. _city_dbId = nil;
  171. NSInteger localVersion = [[RQ_APP_VERSION stringByReplacingOccurrencesOfString:@"." withString:@""] integerValue];
  172. [[RQ_HTTP_Service getJsjpSet] subscribeNext:^(NSArray *setArr) {
  173. [setArr.rac_sequence.signal subscribeNext:^(RQDictInfoModel *dictInfoModel) {
  174. if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_OPEN"]) {
  175. RQ_COMMON_MANAGER.JSJP_APP_AD_OPEN = [[NSString stringWithFormat:@"%@",dictInfoModel.dictValue] isEqualToString:@"1"]? YES : NO;
  176. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_XM_AD_RATE"]) {
  177. RQ_COMMON_MANAGER.JSJP_APP_XM_AD_RATE = [dictInfoModel.dictValue integerValue];
  178. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_CYCLE"]) {
  179. RQ_COMMON_MANAGER.JSJP_APP_AD_CYCLE = [dictInfoModel.dictValue integerValue];
  180. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_iOS_PT"]) {
  181. RQ_COMMON_MANAGER.JSJP_iOS_PT = [dictInfoModel.dictValue integerValue];
  182. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_SHARE_CITY"]) {
  183. RQ_COMMON_MANAGER.JSJP_SHARE_CITY = dictInfoModel.dictValue;
  184. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_FREE_VIP"]) {
  185. RQ_COMMON_MANAGER.JSJP_FREE_VIP = dictInfoModel.dictValue;
  186. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_XCX_NAME"]) {
  187. RQ_COMMON_MANAGER.JSJP_XCX_NAME = dictInfoModel.dictValue;
  188. }else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_XCX_PAGE"]) {
  189. RQ_COMMON_MANAGER.JSJP_XCX_PAGE = dictInfoModel.dictValue;
  190. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Is_Online_Media_Image"]) {
  191. RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Image = [dictInfoModel.dictValue boolValue];
  192. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Is_Online_Media_Video"]) {
  193. RQ_COMMON_MANAGER.JSJP_Is_Online_Media_Video = [dictInfoModel.dictValue boolValue];
  194. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_Online_Version"]) {
  195. NSInteger customOnlineVersion = [[[NSString stringWithFormat:@"%@",dictInfoModel.dictValue] stringByReplacingOccurrencesOfString:@"." withString:@""] integerValue];
  196. RQ_COMMON_MANAGER.APP_SWITCH = (localVersion > customOnlineVersion);
  197. RQ_SHARE_FUNCTION.APP_SWITCH = (localVersion > customOnlineVersion);//为了启动广告
  198. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_ICON_NEED_CHANGE"]) {
  199. RQ_COMMON_MANAGER.JSJP_APP_ICON_NEED_CHANGE = [dictInfoModel.dictValue boolValue];
  200. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_AD_RATE"]) {
  201. RQ_COMMON_MANAGER.JSJP_APP_AD_RATE = [dictInfoModel.dictValue integerValue];
  202. } else if ([dictInfoModel.dictLabel isEqualToString:@"JSJP_APP_PTSC_FBL"]) {
  203. RQ_COMMON_MANAGER.JSJP_APP_PTSC_FBL = dictInfoModel.dictValue;
  204. }
  205. }];
  206. }];
  207. myDelegate.isLogin = NO;
  208. /// 删除用户数据
  209. [self deleteUser:currentUser];
  210. }
  211. /// 用户信息配置完成
  212. - (void)postUserDataConfigureCompleteNotification{
  213. RQUserModel *user = [self currentUser];
  214. [RQNotificationCenter postNotificationName:RQUserDataConfigureCompleteNotification object:nil userInfo:@{RQUserDataConfigureCompleteUserInfoKey:user}];
  215. }
  216. - (void)beginObserveUser {
  217. _isObserve = YES;
  218. [[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) {
  219. return self.currentUser;
  220. }] subscribeNext:^(RQUserModel *userModel) {
  221. [self updateUserData];
  222. }];
  223. }
  224. /// 比对本地网络数据
  225. - (void)updateUserData {
  226. // [[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) {
  227. // userModel.channel = RQ_USER_MANAGER.currentUser.channel;
  228. // [self willChangeValueForKey:@"user"];
  229. // /// user模型的数据 重置,但是user的 指针地址不变
  230. // [self.currentUser mergeValuesForKeysFromModel:userModel];
  231. // [self didChangeValueForKey:@"user"];
  232. // } error:^(NSError * _Nullable error) {
  233. // [MBProgressHUD rq_showErrorTips:error];
  234. // }];
  235. }
  236. - (void)checkVersionWithComplete:(VoidBlock_Bool)complete {
  237. /// 1: open 2: close
  238. // [[RQ_HTTP_Service getConfigKeyWithPath:RQButtonSwitchOriginalPath] subscribeNext:^(NSString *isOpenStr) {
  239. // if ([isOpenStr isEqualToString:@"1"]) {
  240. // complete(YES);
  241. // } else {
  242. // complete(NO);
  243. // }
  244. // } error:^(NSError * _Nullable error) {
  245. // complete(NO);
  246. // }];
  247. }
  248. /// 获取了dict value
  249. - (id)getParamsKey:(NSString *)key {
  250. id value = nil;
  251. if(RQ_USER_MANAGER.currentUser.params){
  252. for (ParamsItem *item in RQ_USER_MANAGER.currentUser.params) {
  253. if ([item.KEY isEqualToString:key]) {
  254. value = item.VALUE;
  255. break;
  256. }
  257. }
  258. }
  259. return value;
  260. }
  261. /// 获取了 db cityid
  262. - (id)getCityidByCode:(NSString *)code
  263. {
  264. NSString *cityid = @"0";
  265. NSString *city = @"";
  266. NSArray *cityCodeArray = self.cityCodeData;
  267. if(cityCodeArray){
  268. for (int i=0; i<cityCodeArray.count; i++) {
  269. NSString *ccode = cityCodeArray[i][@"code"];
  270. NSString *cname = cityCodeArray[i][@"name"];
  271. if ([ccode isEqualToString:code]){
  272. city = cname;
  273. break;
  274. }
  275. }
  276. }
  277. if (city.length>0){
  278. cityid = [self getCityidByName:city];
  279. }
  280. return cityid;
  281. }
  282. - (id)getCityidByName:(NSString *)name
  283. {
  284. NSString *cityid = @"0";
  285. NSArray *cityArray = self.cityData;
  286. if(cityArray){
  287. if([name containsString:@"台州"]||
  288. [name containsString:@"温州"]){ //台州-温州-取24
  289. cityid = @"24";
  290. return cityid;
  291. }
  292. NSDictionary *item = [self getRecursive:cityArray name:name];
  293. if ([item isKindOfClass:[NSDictionary class]]) {
  294. NSString *cid = item[@"id"];
  295. NSString *cname = item[@"name"];
  296. cityid = cid;
  297. }
  298. }
  299. return cityid;
  300. }
  301. - (id)getRecursive:(NSArray *)cityArray name:(NSString *)name{
  302. if(cityArray){
  303. for (int i=0; i<cityArray.count; i++) {
  304. NSString *cid = cityArray[i][@"id"];
  305. NSString *cname = cityArray[i][@"name"];
  306. NSArray *citys = cityArray[i][@"cities"];
  307. NSLog(@"cityid = %@ and cityname = %@",cid,cname);
  308. if ([cname containsString:@"市"]){
  309. if ([cname isEqualToString:name]){
  310. return cityArray[i];
  311. }
  312. }else{
  313. if (citys!=nil&&citys.count>0){
  314. id list = [self getRecursive:citys name:name];
  315. if(list){
  316. return list;
  317. }
  318. }
  319. }
  320. }
  321. }
  322. return nil;
  323. }
  324. #pragma mark - LazyLoad
  325. - (NSString *)city_dbId{
  326. if(!_city_dbId){
  327. _city_dbId = [self getCityidByCode:RQ_USER_MANAGER.currentUser.city];
  328. // _city_dbId = [self getCityidByName:RQ_USER_MANAGER.currentUser.cityName];
  329. }
  330. return _city_dbId;
  331. }
  332. - (NSArray *)cityCodeData{
  333. if(!_cityCodeData){
  334. @autoreleasepool {
  335. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cities" ofType:@"json"];
  336. if (filePath) {
  337. NSError *error = nil;
  338. NSData *jsonData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error];
  339. if (!error) {
  340. NSError *jsonError = nil;
  341. NSArray *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
  342. if (!jsonError && [jsonDictionary isKindOfClass:[NSArray class]]) {
  343. _cityCodeData = jsonDictionary;
  344. } else {
  345. NSLog(@"Error parsing JSON: %@", jsonError);
  346. }
  347. } else {
  348. NSLog(@"Error reading file: %@", error);
  349. }
  350. } else {
  351. NSLog(@"JSON file not found.");
  352. }
  353. }
  354. }
  355. return _cityCodeData;
  356. }
  357. - (NSArray *)cityData{
  358. if(!_cityData){
  359. @autoreleasepool {
  360. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DrCityInfoThree" ofType:@"json"];
  361. if (filePath) {
  362. NSError *error = nil;
  363. NSData *jsonData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error];
  364. if (!error) {
  365. NSError *jsonError = nil;
  366. NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
  367. if (!jsonError && [jsonDictionary isKindOfClass:[NSDictionary class]]) {
  368. _cityData = jsonDictionary[@"provinces"];
  369. } else {
  370. NSLog(@"Error parsing JSON: %@", jsonError);
  371. }
  372. } else {
  373. NSLog(@"Error reading file: %@", error);
  374. }
  375. } else {
  376. NSLog(@"JSON file not found.");
  377. }
  378. }
  379. }
  380. return _cityData;
  381. }
  382. - (RQLoginViewModel *)loginViewModel {
  383. if (!_loginViewModel) {
  384. _loginViewModel = [[RQLoginViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:nil];
  385. }
  386. return _loginViewModel;
  387. }
  388. @end