UserInfoManager.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. //
  2. // UserInfoManager.m
  3. // KulexiuForTeacher
  4. //
  5. // Created by Kyle on 2022/3/20.
  6. //
  7. #import "UserInfoManager.h"
  8. #import "ArchiveTools.h"
  9. #import "JPUSHService.h"
  10. #import <Bugly/Bugly.h>
  11. #import "RCConnectionManager.h"
  12. #import "AppDelegate.h"
  13. #import "KSTipsAlert.h"
  14. @interface UserInfoManager ()
  15. @property (nonatomic, copy) UserInfoCallback callback;
  16. @property (nonatomic, copy) ConnectIMCallback IMConnCallback;
  17. @end
  18. @implementation UserInfoManager
  19. + (instancetype)shareInstance {
  20. static UserInfoManager *manager = nil;
  21. static dispatch_once_t onceToken;
  22. dispatch_once(&onceToken, ^{
  23. manager = [[UserInfoManager alloc] init];
  24. });
  25. return manager;
  26. }
  27. - (instancetype)init {
  28. if (self = [super init]) {
  29. self.userInfo = [[UserInfo alloc] init];
  30. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(otherLogin) name:@"otherLogin" object:nil];
  31. }
  32. return self;
  33. }
  34. - (void)otherLogin {
  35. dispatch_main_async_safe(^{
  36. UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
  37. if ([vc.presentedViewController isKindOfClass:NSClassFromString(@"NewClassRoomViewController")]) {
  38. [self checkTokenEnableCallback:^(BOOL enable) {
  39. if (enable) {
  40. [[NSNotificationCenter defaultCenter] postNotificationName:@"classroomQuit" object:nil];
  41. NSLog(@"-----classroomQuit");
  42. }
  43. else {
  44. [[NSNotificationCenter defaultCenter] postNotificationName:@"classroomLogout" object:nil];
  45. NSLog(@"-----classroomLogout");
  46. }
  47. }];
  48. }
  49. else if ([vc isKindOfClass:[UITabBarController class]]) {
  50. if ([vc.presentedViewController isKindOfClass:NSClassFromString(@"CustomNavViewController")]) {
  51. CustomNavViewController *nav = (CustomNavViewController *)vc.presentedViewController;
  52. if ([nav.visibleViewController isKindOfClass:NSClassFromString(@"LiveRoomViewController")]) {
  53. [self checkTokenEnableCallback:^(BOOL enable) {
  54. if (enable) {
  55. [[NSNotificationCenter defaultCenter] postNotificationName:@"liveroomQuit" object:nil];
  56. NSLog(@"-----liveroomQuit");
  57. }
  58. else {
  59. [[NSNotificationCenter defaultCenter] postNotificationName:@"liveroomLogout" object:nil];
  60. NSLog(@"-----liveroomLogout");
  61. }
  62. }];
  63. return;
  64. }
  65. }
  66. [self checkTokenEnableCallback:^(BOOL enable) {
  67. if (enable) {
  68. [self showTipsAlert];
  69. }
  70. else {
  71. [self showMessage:@"登录过期,请重新登录"];
  72. [KSNetworkingManager logoutAction];
  73. }
  74. }];
  75. }
  76. });
  77. }
  78. - (void)showTipsAlert {
  79. [KSTipsAlert shareInstanceWithTitle:@"提示" descMessage:@"聊天功能已断开,是否重新连接?" leftTitle:@"取消" rightTitle:@"连接" callback:^(BOOL isSure) {
  80. if (isSure) {
  81. [USER_MANAGER connectRongCloud];
  82. }
  83. }];
  84. }
  85. // 提示信息
  86. - (void)showMessage:(NSString *)message {
  87. MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[[UIApplication sharedApplication].windows lastObject] animated:YES];
  88. hud.removeFromSuperViewOnHide =YES;
  89. hud.mode = MBProgressHUDModeText;
  90. hud.label.text = message;
  91. hud.minSize = CGSizeMake(132.f, 60.0f);
  92. hud.label.textColor = [UIColor whiteColor];
  93. hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
  94. hud.bezelView.backgroundColor = [UIColor colorWithHexString:@"#000000" alpha:0.8];
  95. [hud hideAnimated:YES afterDelay:2];
  96. }
  97. // 获取信息回调
  98. - (void)queryUserInfoCallback:(UserInfoCallback)callback {
  99. if (callback) {
  100. self.callback = callback;
  101. }
  102. [self queryUserInfoConnectRongCloud:NO];
  103. }
  104. - (void)checkTokenEnableCallback:(void(^)(BOOL enable))checkCallback {
  105. [KSNetworkingManager checkTokenRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
  106. if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
  107. checkCallback(YES);
  108. }
  109. else {
  110. checkCallback(NO);
  111. }
  112. } faliure:^(NSError * _Nonnull error) {
  113. checkCallback(NO);
  114. }];
  115. }
  116. - (void)queryUserInfoConnectRongCloud:(BOOL)connectRM {
  117. [KSNetworkingManager queryUserInfo:KS_GET success:^(NSDictionary * _Nonnull dic) {
  118. if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
  119. // 保存用户信息
  120. self.userInfo = [[UserInfo alloc] initWithDictionary:[dic dictionaryValueForKey:@"data"]];
  121. // 判断是否实名
  122. if (![NSString isEmptyString:self.userInfo.realName] && ![NSString isEmptyString:self.userInfo.idCardNo]) {
  123. self.hasAuth = YES;
  124. }
  125. else {
  126. self.hasAuth = NO;
  127. }
  128. NSString *uid = self.userInfo.userId;
  129. UserDefaultSet(uid, UIDKey);
  130. NSString *rongToken = UserDefault(RongTokenKey);
  131. BOOL needConnect = NO;
  132. if ([NSString isEmptyString:rongToken]) {
  133. needConnect = YES;
  134. }
  135. UserDefaultSet(self.userInfo.imToken, RongTokenKey);
  136. UserDefaultSet(self.userInfo.username, NicknameKey);
  137. UserDefaultSet(self.userInfo.avatar, AvatarUrlKey);
  138. [[NSUserDefaults standardUserDefaults] synchronize];
  139. if (connectRM) {
  140. // 设置推送别名
  141. [JPUSHService setAlias:UserDefault(UIDKey) completion:nil seq:0];
  142. [Bugly setUserIdentifier:UserDefault(UIDKey)];
  143. [self connectRongCloud];
  144. }
  145. else if (self.callback) {
  146. if (needConnect) {
  147. [self connectRongCloud];
  148. }
  149. self.callback(self.userInfo);
  150. self.callback = nil;
  151. }
  152. }
  153. else {
  154. if (self.callback) {
  155. self.callback(self.userInfo);
  156. self.callback = nil;
  157. }
  158. }
  159. } faliure:^(NSError * _Nonnull error) {
  160. if (self.callback) {
  161. self.callback(self.userInfo);
  162. self.callback = nil;
  163. }
  164. }];
  165. }
  166. - (void)checkTokenEnableConnectRongCloud {
  167. [self checkTokenEnableCallback:^(BOOL enable) {
  168. if (enable) {
  169. [self connectRongCloud];
  170. }
  171. }];
  172. }
  173. - (BOOL)checkIMConnected {
  174. RCConnectionStatus connStatus = [[RCIM sharedRCIM] getConnectionStatus];
  175. if (connStatus == ConnectionStatus_Connected) {
  176. return YES;
  177. }
  178. else {
  179. return NO;
  180. }
  181. }
  182. - (void)connectionIMCallback:(ConnectIMCallback)callback {
  183. if (callback) {
  184. self.IMConnCallback = callback;
  185. }
  186. [self delayCheckIMConnection];
  187. }
  188. - (void)delayCheckIMConnection {
  189. __block BOOL isConnected = [self checkIMConnected];
  190. if (isConnected) {
  191. if (self.IMConnCallback) {
  192. self.IMConnCallback(YES);
  193. }
  194. return;
  195. }
  196. else {
  197. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  198. isConnected = [self checkIMConnected];
  199. if (isConnected) {
  200. if (self.IMConnCallback) {
  201. self.IMConnCallback(YES);
  202. }
  203. }
  204. else {
  205. [self delayCheckIMConnection];
  206. }
  207. });
  208. }
  209. }
  210. - (void)connectRongCloud {
  211. NSString *rongToken = UserDefault(RongTokenKey);
  212. if ([NSString isEmptyString:rongToken]) {
  213. return;
  214. }
  215. // 融云登录
  216. [[RCIM sharedRCIM] connectWithToken:UserDefault(RongTokenKey) dbOpened:^(RCDBErrorCode code) {
  217. } success:^(NSString *userId) {
  218. [RCConnectionManager shareManager].isConnected = YES;
  219. // 设置个人信息
  220. RCUserInfo *currentUserInfo =
  221. [[RCUserInfo alloc] initWithUserId:userId name:UserDefault(NicknameKey) portrait:UserDefault(AvatarUrlKey)];
  222. [RCIM sharedRCIM].currentUserInfo = currentUserInfo;
  223. } error:^(RCConnectErrorCode errorCode) {
  224. if (errorCode == RC_CONN_TOKEN_INCORRECT) {
  225. dispatch_async(dispatch_get_main_queue(), ^{
  226. // 再次获取token
  227. AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
  228. [appDelegate requestRongCloudToken];
  229. });
  230. }
  231. else {
  232. if (errorCode == RC_CONNECTION_EXIST) {
  233. [RCConnectionManager shareManager].isConnected = YES;
  234. return;
  235. }
  236. NSString *message = [NSString stringWithFormat:@"IM连接错误%zd",errorCode];
  237. dispatch_main_async_safe(^{
  238. [self showMessage:message];
  239. });
  240. }
  241. }];
  242. }
  243. - (NSString *)getCurrentVersion {
  244. return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  245. }
  246. - (void)requsetconfigCallback:(void(^)(BOOL success))callback {
  247. [KSNetworkingManager appVersionInfoRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
  248. if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
  249. NSString *serviceVersion = [[dic dictionaryValueForKey:@"data"] stringValueForKey:@"version"];
  250. NSString *currentVersion = [self getCurrentVersion];
  251. if ([self isLowerVersionCompareLocalVersion:currentVersion serviceVersion:serviceVersion]) {
  252. callback(YES);
  253. }
  254. else {
  255. callback(NO);
  256. }
  257. }
  258. else {
  259. callback(NO);
  260. }
  261. } faliure:^(NSError * _Nonnull error) {
  262. callback(NO);
  263. }];
  264. }
  265. - (BOOL)isLowerVersionCompareLocalVersion:(NSString *)localVersion serviceVersion:(NSString *)version {
  266. localVersion = [localVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
  267. if (localVersion.length == 3) {
  268. localVersion = [localVersion stringByAppendingString:@"0"];
  269. }
  270. else if (localVersion.length==2) {
  271. localVersion = [localVersion stringByAppendingString:@"00"];
  272. }else if (localVersion.length==1){
  273. localVersion = [localVersion stringByAppendingString:@"000"];
  274. }
  275. version = [version stringByReplacingOccurrencesOfString:@"." withString:@""];
  276. if (version.length == 3) {
  277. version = [version stringByAppendingString:@"0"];
  278. }
  279. else if (version.length==2) {
  280. version = [version stringByAppendingString:@"00"];
  281. }else if (version.length==1){
  282. version = [version stringByAppendingString:@"000"];
  283. }
  284. if (([localVersion floatValue] > [version floatValue])) {
  285. return NO;
  286. }
  287. else {
  288. return YES;
  289. }
  290. }
  291. - (void)dealloc {
  292. [[NSNotificationCenter defaultCenter] removeObserver:self];
  293. }
  294. @end