LCTools.m 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802
  1. //
  2. // LCTools.m
  3. // LiveChat
  4. //
  5. // Created by 张灿 on 2018/4/10.
  6. // Copyright © 2018年 caicai. All rights reserved.
  7. //
  8. #import "LCTools.h"
  9. #import "WHKeyChain.h"
  10. #import "YOUPAILCTabBarVC.h"
  11. #import "YOUPAILCMessageVC.h"
  12. #import <CommonCrypto/CommonHMAC.h>
  13. #import <CommonCrypto/CommonDigest.h>
  14. #import <sys/utsname.h>
  15. #import "AppDelegate.h"
  16. #import "YOUPAIZYFirstVC.h"
  17. #import "YOUPAIRealPersonFaceVC.h"
  18. #import "YOUPAILZLiveVerifyResultVC.h"
  19. #import "YOUPAIRealPersonFaceVC.h"
  20. #import <RPSDK/RPSDK.h>
  21. #import "YOUPAILZLiveVerifyResultVC.h"
  22. #import "LZAlertWindow.h"
  23. #import "YOUPAILCBigCastProtocolVC.h"
  24. #import "UIViewController+TFPresent.h"
  25. #import "YMPasswordLoginViewController.h"
  26. #import "YOUPAILCUploadCameraAuditVC.h"
  27. #define KEY_DEVICE_UUID_KEYCHAIN @"KEY_DEVICE_UUID_KEYCHAIN" //keyChain存档的uuid
  28. #define KEY_LOAD_UUID_TABLENAME @"KEY_LOAD_UUID_TABLENAME" //读取字典对象的健名
  29. @implementation YOUPAILZRichTextStyle
  30. + (instancetype)richTextStyleWithText:(NSString *)text font:(UIFont *)font color:(UIColor *)color{
  31. return [[self alloc] initWithText:text font:font color:color];
  32. }
  33. - (instancetype)initWithText:(NSString *)text font:(UIFont *)font color:(UIColor *)color{
  34. if (self = [super init]) {
  35. self.text = text;
  36. self.font = font;
  37. self.color = color;
  38. }
  39. return self;
  40. }
  41. @end
  42. static LCTools *function = nil;
  43. @implementation LCTools
  44. +(id)share
  45. {
  46. if (function ==nil) {
  47. function = [[self alloc]init];
  48. }
  49. return function;
  50. }
  51. + (CGFloat)getStatusBarHight {
  52. CGFloat statusBarHeight = 0;
  53. if (@available(iOS 13.0, *)) {
  54. statusBarHeight = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
  55. } else {
  56. statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
  57. }
  58. return statusBarHeight;
  59. }
  60. + (NSString*)getPasteString{
  61. NSString *text = @"invite_code=";
  62. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  63. if([pasteboard.string hasPrefix:text]){
  64. NSString* caicaiNumStr = [pasteboard.string substringFromIndex:text.length];//截取前八个字符----每次换包必须改
  65. return caicaiNumStr;
  66. }else{
  67. return @"";
  68. }
  69. }
  70. /// 提取粘贴板数据
  71. + (void)extractPasteboardSource:(void(^)(NSString *extractSource))handle{
  72. //获取全局队列
  73. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){
  74. //iOS14及以上,先检测剪切板内容,符合规则再读取剪切板
  75. if (@available(iOS 14.0, *)) {
  76. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  77. NSSet *pasteDetectionPatternSet = [NSSet setWithObjects:UIPasteboardDetectionPatternNumber,
  78. UIPasteboardDetectionPatternProbableWebURL,
  79. UIPasteboardDetectionPatternProbableWebSearch,
  80. nil];
  81. [pasteboard detectPatternsForPatterns: pasteDetectionPatternSet
  82. completionHandler:^(NSSet<UIPasteboardDetectionPattern> *foundPattenSet, NSError *e) {
  83. BOOL isNumber = NO, isUrl = NO, isWebSearch = NO;
  84. for (UIPasteboardDetectionPattern pattern in foundPattenSet) {
  85. if ([pattern isEqualToString: UIPasteboardDetectionPatternNumber]) {
  86. isNumber = YES;
  87. }
  88. if ([pattern isEqualToString: UIPasteboardDetectionPatternProbableWebURL]) {
  89. isUrl = YES;
  90. }
  91. if ([pattern isEqualToString: UIPasteboardDetectionPatternProbableWebSearch]) {
  92. isWebSearch = YES;
  93. }
  94. }
  95. if (isNumber || isUrl || isWebSearch) {
  96. //符合规则,在下一个runloop读取剪切板
  97. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
  98. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  99. NSString *string = [pasteboard.string copy];
  100. handle(string);
  101. });
  102. }
  103. }];
  104. } else {
  105. //iOS14以下,直接读剪切板
  106. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  107. NSString *string = [pasteboard.string copy];
  108. handle(string);
  109. }
  110. });
  111. }
  112. + (UIImage*)giftImgWithGiftUrlStr:(NSString*)giftUrlStr{
  113. UIImage* image;
  114. NSString* giftName = [[giftUrlStr componentsSeparatedByString:@"/"]lastObject];
  115. NSString* giftCanchesPath= [[NSString alloc]initWithFormat:@"%@/%@/",CachesPath,@"Gift"];
  116. image = [UIImage imageNamed:[giftCanchesPath stringByAppendingPathComponent:giftName]];
  117. if (!image) {
  118. if (![[NSFileManager defaultManager] fileExistsAtPath:giftCanchesPath])
  119. {
  120. [[NSFileManager defaultManager] createDirectoryAtPath:giftCanchesPath
  121. withIntermediateDirectories:NO
  122. attributes:nil
  123. error:nil];
  124. }
  125. NSString *imagePath =[giftCanchesPath stringByAppendingPathComponent:giftName];
  126. if (![[NSFileManager defaultManager] fileExistsAtPath:imagePath]){
  127. NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,giftUrlStr];
  128. NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
  129. image = [UIImage imageWithData:data];
  130. [UIImagePNGRepresentation([UIImage imageWithData:data]) writeToFile:imagePath atomically:YES];
  131. }
  132. }
  133. return image;
  134. }
  135. + (NSData*)giftSVGAWithSvgaUrlStr:(NSString*)svgaUrlStr
  136. {
  137. NSData *data;
  138. NSString* svgaName = [[svgaUrlStr componentsSeparatedByString:@"/"]lastObject];
  139. NSString* svgaCanchesPath= [[NSString alloc]initWithFormat:@"%@/%@/",CachesPath,@"SVGA"];
  140. data = [NSData dataWithContentsOfFile:[svgaCanchesPath stringByAppendingPathComponent:svgaName]];
  141. if (!data) {
  142. if (![[NSFileManager defaultManager] fileExistsAtPath:svgaCanchesPath])
  143. {
  144. [[NSFileManager defaultManager] createDirectoryAtPath:svgaCanchesPath
  145. withIntermediateDirectories:NO
  146. attributes:nil
  147. error:nil];
  148. }
  149. NSString *svgaPath =[svgaCanchesPath stringByAppendingPathComponent:svgaName];
  150. if (![[NSFileManager defaultManager] fileExistsAtPath:svgaPath]){
  151. dispatch_queue_t queue = dispatch_queue_create("SvgaCache", NULL);
  152. dispatch_async(queue, ^{
  153. NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,svgaUrlStr];
  154. NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
  155. [data writeToFile:svgaPath atomically:YES];
  156. });
  157. // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  158. // NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,svgaUrlStr];
  159. // NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];
  160. // [data writeToFile:svgaPath atomically:YES];
  161. // });
  162. }
  163. }
  164. return data;
  165. }
  166. + (UIViewController *)getCurrentVC {
  167. // UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
  168. // if (!window) {
  169. // return nil;
  170. // }
  171. // UIView *tempView;
  172. // for (UIView *subview in window.subviews) {
  173. // if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) {
  174. // tempView = subview;
  175. // break;
  176. // }
  177. // }
  178. // if (!tempView) {
  179. // tempView = [window.subviews lastObject];
  180. // }
  181. //
  182. // id nextResponder = [tempView nextResponder];
  183. // while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) {
  184. // tempView = [tempView.subviews firstObject];
  185. //
  186. // if (!tempView) {
  187. // return nil;
  188. // }
  189. // nextResponder = [tempView nextResponder];
  190. // }
  191. // return (UIViewController *)nextResponder;
  192. UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
  193. UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
  194. return currentVC;
  195. }
  196. + (UIViewController *)getContainNavigationControllerCurrentVC{
  197. UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
  198. UIViewController *currentVC = [self getContainNavigationControllerCurrentVCFrom:rootViewController];
  199. return currentVC;
  200. }
  201. + (UIViewController *)getContainNavigationControllerCurrentVCFrom:(UIViewController *)rootVC{
  202. UIViewController *currentVC;
  203. if ([rootVC isKindOfClass:[UITabBarController class]]) {
  204. // 根视图为UITabBarController
  205. currentVC = [self getContainNavigationControllerCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
  206. } else if ([rootVC isKindOfClass:[UINavigationController class]]){
  207. // 根视图为UINavigationController
  208. currentVC = [self getContainNavigationControllerCurrentVCFrom:[(UINavigationController *)rootVC viewControllers].lastObject];
  209. } else {
  210. // 根视图为非导航类
  211. currentVC = rootVC;
  212. }
  213. return currentVC;
  214. }
  215. + (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
  216. {
  217. UIViewController *currentVC;
  218. if ([rootVC presentedViewController]) {
  219. // 视图是被presented出来的
  220. rootVC = [rootVC presentedViewController];
  221. }
  222. if ([rootVC isKindOfClass:[UITabBarController class]]) {
  223. // 根视图为UITabBarController
  224. currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
  225. } else if ([rootVC isKindOfClass:[UINavigationController class]]){
  226. // 根视图为UINavigationController
  227. currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
  228. } else {
  229. // 根视图为非导航类
  230. currentVC = rootVC;
  231. }
  232. return currentVC;
  233. }
  234. +(UIViewController *)getNilPresentationController:(UIViewController *)viewController{
  235. UIViewController *vc = viewController;
  236. while (vc.presentedViewController) {
  237. vc = vc.presentedViewController;
  238. }
  239. return vc;
  240. }
  241. + (NSString*)getUUIDString{
  242. NSMutableDictionary *readKeyChainUUID = (NSMutableDictionary *)[WHKeyChain load:KEY_DEVICE_UUID_KEYCHAIN];
  243. if(!readKeyChainUUID){
  244. //需要写入
  245. NSString *uuidStr = [[NSUUID UUID] UUIDString];
  246. NSString *uuid = [[uuidStr stringByReplacingOccurrencesOfString:@"0" withString:@""] stringByReplacingOccurrencesOfString:@"-" withString:@""];
  247. // 保存自己生成的
  248. NSDictionary *dict = [NSDictionary dictionaryWithObject:uuid forKey:KEY_LOAD_UUID_TABLENAME];
  249. [WHKeyChain save:KEY_DEVICE_UUID_KEYCHAIN data:dict];
  250. return uuid;
  251. }
  252. return readKeyChainUUID[@"KEY_LOAD_UUID_TABLENAME"];
  253. }
  254. + (UIColor*)getBkgRandomColor{
  255. NSArray* bkgColorArray = @[HexColorFromRGB(0xe5c9c9),HexColorFromRGB(0xc9d8e5),HexColorFromRGB(0xc9d3c1),HexColorFromRGB(0xcbcbc8),HexColorFromRGB(0xd3cbe4),HexColorFromRGB(0xcdd1d6)];
  256. int index = arc4random() % 6;
  257. return bkgColorArray[index];
  258. }
  259. + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation
  260. {
  261. long double rotate = 0.0;
  262. CGRect rect;
  263. float translateX = 0;
  264. float translateY = 0;
  265. float scaleX = 1.0;
  266. float scaleY = 1.0;
  267. switch (orientation) {
  268. case UIImageOrientationLeft:
  269. rotate = M_PI_2;
  270. rect = CGRectMake(0, 0, image.size.height, image.size.width);
  271. translateX = 0;
  272. translateY = -rect.size.width;
  273. scaleY = rect.size.width/rect.size.height;
  274. scaleX = rect.size.height/rect.size.width;
  275. break;
  276. case UIImageOrientationRight:
  277. rotate = 3 * M_PI_2;
  278. rect = CGRectMake(0, 0, image.size.height, image.size.width);
  279. translateX = -rect.size.height;
  280. translateY = 0;
  281. scaleY = rect.size.width/rect.size.height;
  282. scaleX = rect.size.height/rect.size.width;
  283. break;
  284. case UIImageOrientationDown:
  285. rotate = M_PI;
  286. rect = CGRectMake(0, 0, image.size.width, image.size.height);
  287. translateX = -rect.size.width;
  288. translateY = -rect.size.height;
  289. break;
  290. default:
  291. rotate = 0.0;
  292. rect = CGRectMake(0, 0, image.size.width, image.size.height);
  293. translateX = 0;
  294. translateY = 0;
  295. break;
  296. }
  297. // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
  298. if (CGSizeEqualToSize(rect.size, CGSizeZero)) {
  299. return nil;
  300. }
  301. UIGraphicsBeginImageContext(rect.size);
  302. CGContextRef context = UIGraphicsGetCurrentContext();
  303. //做CTM变换
  304. CGContextTranslateCTM(context, 0.0, rect.size.height);
  305. CGContextScaleCTM(context, 1.0, -1.0);
  306. CGContextRotateCTM(context, rotate);
  307. CGContextTranslateCTM(context, translateX, translateY);
  308. CGContextScaleCTM(context, scaleX, scaleY);
  309. //绘制图片
  310. CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
  311. UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
  312. return newPic;
  313. }
  314. //获取当前时间戳
  315. + (NSString*)getCurrentTimestamp{
  316. NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
  317. [formatter setDateStyle:NSDateFormatterMediumStyle];
  318. [formatter setTimeStyle:NSDateFormatterShortStyle];
  319. [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
  320. NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
  321. [formatter setTimeZone:timeZone];
  322. NSDate *datenow = [NSDate date];//现在时间,你可以输出来看下是什么格式
  323. NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
  324. return timeSp;
  325. }
  326. //获取当前时间戳 豪秒
  327. + (NSString*)getCurrentMillisecondTimestamp{
  328. NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
  329. NSTimeInterval a = [dat timeIntervalSince1970];
  330. NSString *timeSp = [NSString stringWithFormat:@"%0.f", a * 1000];//转为字符型
  331. return timeSp;
  332. }
  333. + (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
  334. {
  335. const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
  336. const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
  337. unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
  338. CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
  339. NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
  340. const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
  341. NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
  342. for (int i = 0; i < HMACData.length; ++i){
  343. [HMAC appendFormat:@"%02x", buffer[i]];
  344. }
  345. return HMAC;
  346. }
  347. + (void)updateTabCenter{
  348. }
  349. + (void)changeRootToTabbar{
  350. NSLog(@"!!!changeRootToTabbar, 刷新控制器");
  351. AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate;
  352. YOUPAILCTabBarVC* tabbar = [[YOUPAILCTabBarVC alloc]init];
  353. app.window.rootViewController = tabbar;
  354. //切换的动画效果
  355. CATransition *animation = [CATransition animation];
  356. [animation setDuration:0.5];//设置动画时间
  357. // animation.type = kCATransitionReveal;//设置动画类型
  358. animation.type = @"oglFlip";
  359. animation.subtype = kCATransitionFromLeft;
  360. [app.window.layer addAnimation:animation forKey:nil];
  361. }
  362. + (void)changeRootToLogin{
  363. [LCSaveData saveIsspecial:NO];
  364. [LCSaveData saveLoginMark:NO];
  365. [LCSaveModel saveUserModel:nil];
  366. [LCSaveData saveTokenString:nil];
  367. [LCSaveData saveYoungNoticeTime:nil];
  368. [OCUserDefaults removeObjectForKey:kUSER_ID];
  369. [OCUserDefaults removeObjectForKey:kIS_FEMALE_GENDER];
  370. [OCUserDefaults removeObjectForKey:kIS_GODDESS_CERTIFIED];
  371. [OCUserDefaults removeObjectForKey:kIS_VIP];
  372. [OCUserDefaults synchronize];
  373. [[YOUPAILCIMLoginManager sharedCenter] youpaifIMLogout:^{
  374. }];
  375. AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate;
  376. YMPasswordLoginViewModel *loginVM = [[YMPasswordLoginViewModel alloc]initWithParams:@{}];
  377. YMPasswordLoginViewController* loginVC = [[YMPasswordLoginViewController alloc]initWithViewModel:loginVM];
  378. ZCBaseNavigationVC* naviLogin = [[ZCBaseNavigationVC alloc]initWithRootViewController:loginVC];
  379. app.window.rootViewController = naviLogin;
  380. //切换的动画效果
  381. CATransition *animation = [CATransition animation];
  382. [animation setDuration:0.5];//设置动画时间
  383. // animation.type = kCATransitionReveal;//设置动画类型
  384. animation.type = @"oglFlip";
  385. animation.subtype = kCATransitionFromLeft;
  386. [app.window.layer addAnimation:animation forKey:nil];
  387. }
  388. + (UIImage*) ColorImage:(CGSize)size FromColors:(NSArray*)colors ByGradientType:(GradientType)gradientType{
  389. NSMutableArray *ar = [NSMutableArray array];
  390. for(UIColor *c in colors) {
  391. [ar addObject:(id)c.CGColor];
  392. }
  393. // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
  394. if (CGSizeEqualToSize(size, CGSizeZero)) {
  395. return nil;
  396. }
  397. UIGraphicsBeginImageContextWithOptions(size, YES, 1);
  398. CGContextRef context = UIGraphicsGetCurrentContext();
  399. CGContextSaveGState(context);
  400. CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]);
  401. CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)ar, NULL);
  402. CGPoint start;
  403. CGPoint end;
  404. switch (gradientType) {
  405. case 0:
  406. start = CGPointMake(0.0, 0.0);
  407. end = CGPointMake(0.0, size.height);
  408. break;
  409. case 1:
  410. start = CGPointMake(0.0, 0.0);
  411. end = CGPointMake(size.width, 0.0);
  412. break;
  413. case 2:
  414. start = CGPointMake(0.0, 0.0);
  415. end = CGPointMake(size.width, size.height);
  416. break;
  417. case 3:
  418. start = CGPointMake(size.width, 0.0);
  419. end = CGPointMake(0.0, size.height);
  420. break;
  421. default:
  422. break;
  423. }
  424. CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
  425. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  426. CGGradientRelease(gradient);
  427. CGContextRestoreGState(context);
  428. CGColorSpaceRelease(colorSpace);
  429. UIGraphicsEndImageContext();
  430. return image;
  431. }
  432. + (UIImage *)imageForSize:(CGSize)size colors:(NSArray*)colors locations:(NSArray *)locas ByGradientType:(GradientType)gradientType{
  433. NSMutableArray *ar = [NSMutableArray array];
  434. for(UIColor *c in colors) {
  435. [ar addObject:(id)c.CGColor];
  436. }
  437. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  438. gradientLayer.frame = CGRectMake(0, 0, size.width, size.height); // 设置显示的frame
  439. gradientLayer.colors = ar;
  440. gradientLayer.locations = locas; // 颜色的起点位置,递增,并且数量跟颜色数量相等
  441. CGPoint startPoint;
  442. CGPoint endPoint;
  443. switch (gradientType) {
  444. case GradientTopToBottom: //从上到下
  445. startPoint = CGPointMake(0.5, 0);
  446. endPoint = CGPointMake(0.5, 1);
  447. break;
  448. case GradientLeftToRight: //从左到右
  449. startPoint = CGPointMake(0.0, 0.5);
  450. endPoint = CGPointMake(1, 0.5);
  451. break;
  452. case GradientupleftTolowRight: //左上到右下
  453. startPoint = CGPointMake(0, 0);
  454. endPoint = CGPointMake(1, 1);
  455. break;
  456. case GradientUprightTolowLeft: //右上到左下
  457. startPoint = CGPointMake(1, 0);
  458. endPoint = CGPointMake(0, 1);
  459. break;
  460. default:
  461. break;
  462. }
  463. gradientLayer.startPoint = startPoint;
  464. gradientLayer.endPoint = endPoint;
  465. return [self imageFromLayer:gradientLayer];
  466. }
  467. + (UIImage *)imageFromLayer:(CALayer *)layer{
  468. UIGraphicsImageRenderer *render = [[UIGraphicsImageRenderer alloc] initWithSize:layer.bounds.size];
  469. return [render imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
  470. [layer renderInContext:rendererContext.CGContext];
  471. }];
  472. }
  473. +(CAGradientLayer*)getGradientLayerWithSize:(CGSize)size twoColors:(NSArray*)twoColors gradientType:(GradientType)gradientType{
  474. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  475. gradientLayer.frame = CGRectMake(0, 0, size.width, size.height); // 设置显示的frame
  476. gradientLayer.colors = @[(id)((UIColor*)twoColors[0]).CGColor,(id)((UIColor*)twoColors[1]).CGColor]; // 设置渐变颜色
  477. gradientLayer.locations = @[@0.0, @1.0]; // 颜色的起点位置,递增,并且数量跟颜色数量相等
  478. switch (gradientType) {
  479. case 0:
  480. gradientLayer.startPoint = CGPointMake(0, 0);
  481. gradientLayer.endPoint = CGPointMake(0, 1);
  482. break;
  483. case 1:
  484. gradientLayer.startPoint = CGPointMake(0, 0);
  485. gradientLayer.endPoint = CGPointMake(1, 0);
  486. break;
  487. case 2:
  488. gradientLayer.startPoint = CGPointMake(0, 0);
  489. gradientLayer.endPoint = CGPointMake(1, 1);
  490. break;
  491. case 3:
  492. gradientLayer.startPoint = CGPointMake(1, 0);
  493. gradientLayer.endPoint = CGPointMake(0, 1);
  494. break;
  495. default:
  496. break;
  497. }
  498. return gradientLayer;
  499. }
  500. + (NSURL*)getImageUrlWithAddress:(NSString*)address{
  501. if (address.length == 0) {
  502. return [NSURL URLWithString:@""];
  503. }
  504. return [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,address]];
  505. }
  506. + (void)kickBackToLogin{
  507. [self changeRootToLogin];
  508. }
  509. + (void)updateMessageUnread{
  510. AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate;
  511. if ([app.window.rootViewController isKindOfClass:[YOUPAILCTabBarVC class]]) {
  512. YOUPAILCTabBarVC* tabbar = (YOUPAILCTabBarVC*)app.window.rootViewController;
  513. [tabbar youpaifupdateUnread];
  514. }
  515. }
  516. // 设置富文本
  517. + (NSAttributedString *)setRichTextFormat:(NSArray<YOUPAILZRichTextStyle *> *)richTextStyles{
  518. NSMutableAttributedString *mAttibutedString = [[NSMutableAttributedString alloc] init];
  519. for (YOUPAILZRichTextStyle *style in richTextStyles) {
  520. NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:style.text attributes:@{NSFontAttributeName:style.font, NSForegroundColorAttributeName:style.color}];
  521. [mAttibutedString appendAttributedString:attributedString];
  522. }
  523. return mAttibutedString;
  524. }
  525. + (NSAttributedString *)setRichTextWithTitle:(NSString *)title subTitle:(NSString *)subTitle titleColor:(UIColor *)titleColor subTitleColor:(UIColor *)subTitleColor titleFontSize:(CGFloat)size subTitleFontSize:(CGFloat)subSize {
  526. NSMutableAttributedString *mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size], NSForegroundColorAttributeName:titleColor}];
  527. NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:subTitle attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:subSize], NSForegroundColorAttributeName:subTitleColor}];
  528. [mAttibutedString appendAttributedString:attributedString];
  529. return mAttibutedString;
  530. }
  531. + (NSAttributedString *)setRichTextWithTitle:(NSString *)title subTitle:(NSString *)subTitle titleColor:(UIColor *)titleColor subTitleColor:(UIColor *)subTitleColor titleFontSize:(CGFloat)size subTitleFontSize:(CGFloat)subSize IsfirstFontBlod:(BOOL)isfirstFontBlod{
  532. NSMutableAttributedString *mAttibutedString;
  533. if (isfirstFontBlod) {
  534. mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:LCBoldFont(size), NSForegroundColorAttributeName:titleColor}];
  535. }else{
  536. mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size], NSForegroundColorAttributeName:titleColor}];
  537. }
  538. NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:subTitle attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:subSize], NSForegroundColorAttributeName:subTitleColor}];
  539. [mAttibutedString appendAttributedString:attributedString];
  540. return mAttibutedString;
  541. }
  542. //// 行首缩进-行尾缩进
  543. //+ (NSAttributedString *)attributedString:(NSAttributedString *)attrStr headIndent:(CGFloat)headIndent tailIndent:(CGFloat)tailIndent{
  544. // NSMutableAttributedString *muattrStr = attrStr.mutableCopy;
  545. // NSMutableParagraphStyle *paraStyle01 = [[NSMutableParagraphStyle alloc] init];
  546. // paraStyle01.headIndent = headIndent;//行首缩进
  547. // paraStyle01.tailIndent = tailIndent;//行尾缩进
  548. // [muattrStr addAttribute:NSParagraphStyleAttributeName value:paraStyle01 range:NSMakeRange(0, attrStr.length)];
  549. // return muattrStr.copy;
  550. //}
  551. //数据统计转换
  552. + (NSString*)integralChange:(NSInteger)integral{
  553. if (integral>=10000) {
  554. NSInteger num=(int)floorf(integral/1000.0);
  555. return [NSString stringWithFormat:@"%.1f万",num/10.0];
  556. }else{
  557. return [NSString stringWithFormat:@"%zd",integral];
  558. }
  559. }
  560. //切除边角
  561. + (void)clipCorner:(UIRectCorner)corner View:(UIView*)view size:(CGSize)size {
  562. UIBezierPath* maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corner cornerRadii:size]
  563. ;
  564. CAShapeLayer *maskLayer = [CAShapeLayer layer];
  565. maskLayer.frame = view.bounds;
  566. maskLayer.path = maskPath.CGPath;
  567. view.layer.mask = maskLayer;
  568. }
  569. //返回初始化是否提示更新版本
  570. + (BOOL)canShowNoticationTip{
  571. NSString* updateTime = [LCSaveData getUpdateNotiTime];
  572. NSDate * newData = [NSDate date];
  573. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  574. [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  575. if (!updateTime) {
  576. NSString* dataString = [dateFormatter stringFromDate:newData];
  577. [LCSaveData saveUpdateNotiTime:dataString];
  578. return YES;
  579. }else{
  580. //获取与当前的时间差
  581. NSDate *timeDate = [dateFormatter dateFromString:updateTime];
  582. NSTimeInterval timeInterval = [timeDate timeIntervalSinceNow];
  583. timeInterval = -timeInterval;
  584. //超过1天
  585. if (timeInterval>60*60*24*1) {
  586. NSString* dataString = [dateFormatter stringFromDate:newData];
  587. [LCSaveData saveUpdateNotiTime:dataString];
  588. return YES;
  589. }else{
  590. return NO;
  591. }
  592. }
  593. }
  594. //是否显示评分弹框
  595. + (BOOL)canShowAppraise{
  596. NSString* updateTime = [LCSaveData getAppraiseTime];
  597. NSDate * newData = [NSDate date];
  598. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  599. [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  600. if (!updateTime) {
  601. NSString* dataString = [dateFormatter stringFromDate:newData];
  602. [LCSaveData saveAppraiseTime:dataString];
  603. return YES;
  604. }else{
  605. //获取与当前的时间差
  606. NSDate *timeDate = [dateFormatter dateFromString:updateTime];
  607. NSTimeInterval timeInterval = [timeDate timeIntervalSinceNow];
  608. timeInterval = -timeInterval;
  609. //超过30天
  610. if (timeInterval>60*60*24*30) {
  611. NSString* dataString = [dateFormatter stringFromDate:newData];
  612. [LCSaveData saveAppraiseTime:dataString];
  613. return YES;
  614. }else{
  615. return NO;
  616. }
  617. }
  618. }
  619. //设置阴影
  620. + (void)setShadow:(CALayer*)layer Color:(UIColor*)color{
  621. layer.shadowOpacity = 0.5;
  622. layer.shadowColor = color.CGColor;
  623. layer.shadowOffset = CGSizeMake(0, 5);
  624. layer.shadowRadius= 7;
  625. }
  626. + (NSString*)getCityIDWithCityName:(NSString*)name{
  627. NSDictionary* cityDict = [LCSaveData getCityDict];
  628. NSArray *keys = [cityDict allKeys];
  629. for (int i = 0; i < keys.count; i++)
  630. {
  631. if ([cityDict[keys[i]] isEqualToString:name]) {
  632. return keys[i];
  633. }
  634. }
  635. return @"";
  636. }
  637. + (NSString*)iphoneType {
  638. struct utsname systemInfo;
  639. uname(&systemInfo);
  640. NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
  641. if([platform isEqualToString:@"iPhone1,1"]) return@"iPhone 2G";
  642. if([platform isEqualToString:@"iPhone1,2"]) return@"iPhone 3G";
  643. if([platform isEqualToString:@"iPhone2,1"]) return@"iPhone 3GS";
  644. if([platform isEqualToString:@"iPhone3,1"]) return@"iPhone 4";
  645. if([platform isEqualToString:@"iPhone3,2"]) return@"iPhone 4";
  646. if([platform isEqualToString:@"iPhone3,3"]) return@"iPhone 4";
  647. if([platform isEqualToString:@"iPhone4,1"]) return@"iPhone 4S";
  648. if([platform isEqualToString:@"iPhone5,1"]) return@"iPhone 5";
  649. if([platform isEqualToString:@"iPhone5,2"]) return@"iPhone 5";
  650. if([platform isEqualToString:@"iPhone5,3"]) return@"iPhone 5c";
  651. if([platform isEqualToString:@"iPhone5,4"]) return@"iPhone 5c";
  652. if([platform isEqualToString:@"iPhone6,1"]) return@"iPhone 5s";
  653. if([platform isEqualToString:@"iPhone6,2"]) return@"iPhone 5s";
  654. if([platform isEqualToString:@"iPhone7,1"]) return@"iPhone 6 Plus";
  655. if([platform isEqualToString:@"iPhone7,2"]) return@"iPhone 6";
  656. if([platform isEqualToString:@"iPhone8,1"]) return@"iPhone 6s";
  657. if([platform isEqualToString:@"iPhone8,2"]) return@"iPhone 6s Plus";
  658. if([platform isEqualToString:@"iPhone8,4"]) return@"iPhone SE";
  659. if([platform isEqualToString:@"iPhone9,1"]) return@"iPhone 7";
  660. if([platform isEqualToString:@"iPhone9,2"]) return@"iPhone 7 Plus";
  661. if([platform isEqualToString:@"iPhone9,4"]) return@"iPhone 7 Plus";
  662. if([platform isEqualToString:@"iPhone10,1"]) return@"iPhone 8";
  663. if([platform isEqualToString:@"iPhone10,4"]) return@"iPhone 8";
  664. if([platform isEqualToString:@"iPhone10,2"]) return@"iPhone 8 Plus";
  665. if([platform isEqualToString:@"iPhone10,5"]) return@"iPhone 8 Plus";
  666. if([platform isEqualToString:@"iPhone10,3"]) return@"iPhone X";
  667. if([platform isEqualToString:@"iPhone10,6"]) return@"iPhone X";
  668. if([platform isEqualToString:@"iPhone11,8"])return@"iPhoneXR";
  669. if([platform isEqualToString:@"iPhone11,2"])return@"iPhone XS";
  670. if([platform isEqualToString:@"iPhone11,6"])return@"iPhone XS Max";
  671. if([platform isEqualToString:@"iPhone12,1"])return@"iPhone 11";
  672. if([platform isEqualToString:@"iPhone12,3"])return@"iPhone 11 Pro Max";
  673. if([platform isEqualToString:@"iPhone12,5"])return@"iPhone 11 Pro";
  674. if([platform isEqualToString:@"iPod1,1"]) return@"iPod Touch 1G";
  675. if([platform isEqualToString:@"iPod2,1"]) return@"iPod Touch 2G";
  676. if([platform isEqualToString:@"iPod3,1"]) return@"iPod Touch 3G";
  677. if([platform isEqualToString:@"iPod4,1"]) return@"iPod Touch 4G";
  678. if([platform isEqualToString:@"iPod5,1"]) return@"iPod Touch 5G";
  679. if([platform isEqualToString:@"iPad1,1"]) return@"iPad 1G";
  680. if([platform isEqualToString:@"iPad2,1"]) return@"iPad 2";
  681. if([platform isEqualToString:@"iPad2,2"]) return@"iPad 2";
  682. if([platform isEqualToString:@"iPad2,3"]) return@"iPad 2";
  683. if([platform isEqualToString:@"iPad2,4"]) return@"iPad 2";
  684. if([platform isEqualToString:@"iPad2,5"]) return@"iPad Mini 1G";
  685. if([platform isEqualToString:@"iPad2,6"]) return@"iPad Mini 1G";
  686. if([platform isEqualToString:@"iPad2,7"]) return@"iPad Mini 1G";
  687. if([platform isEqualToString:@"iPad3,1"]) return@"iPad 3";
  688. if([platform isEqualToString:@"iPad3,2"]) return@"iPad 3";
  689. if([platform isEqualToString:@"iPad3,3"]) return@"iPad 3";
  690. if([platform isEqualToString:@"iPad3,4"]) return@"iPad 4";
  691. if([platform isEqualToString:@"iPad3,5"]) return@"iPad 4";
  692. if([platform isEqualToString:@"iPad3,6"]) return@"iPad 4";
  693. if([platform isEqualToString:@"iPad4,1"]) return@"iPad Air";
  694. if([platform isEqualToString:@"iPad4,2"]) return@"iPad Air";
  695. if([platform isEqualToString:@"iPad4,3"]) return@"iPad Air";
  696. if([platform isEqualToString:@"iPad4,4"]) return@"iPad Mini 2G";
  697. if([platform isEqualToString:@"iPad4,5"]) return@"iPad Mini 2G";
  698. if([platform isEqualToString:@"iPad4,6"]) return@"iPad Mini 2G";
  699. if([platform isEqualToString:@"iPad4,7"]) return@"iPad Mini 3";
  700. if([platform isEqualToString:@"iPad4,8"]) return@"iPad Mini 3";
  701. if([platform isEqualToString:@"iPad4,9"]) return@"iPad Mini 3";
  702. if([platform isEqualToString:@"iPad5,1"]) return@"iPad Mini 4";
  703. if([platform isEqualToString:@"iPad5,2"]) return@"iPad Mini 4";
  704. if([platform isEqualToString:@"iPad5,3"]) return@"iPad Air 2";
  705. if([platform isEqualToString:@"iPad5,4"]) return@"iPad Air 2";
  706. if([platform isEqualToString:@"iPad6,3"]) return@"iPad Pro 9.7";
  707. if([platform isEqualToString:@"iPad6,4"]) return@"iPad Pro 9.7";
  708. if([platform isEqualToString:@"iPad6,7"]) return@"iPad Pro 12.9";
  709. if([platform isEqualToString:@"iPad6,8"]) return@"iPad Pro 12.9";
  710. if([platform isEqualToString:@"i386"]) return@"iPhone Simulator";
  711. if([platform isEqualToString:@"x86_64"]) return@"iPhone Simulator";
  712. return platform;
  713. }
  714. + (NSString *)getNetworkType_old
  715. {
  716. UIApplication *app = [UIApplication sharedApplication];
  717. id statusBar = [app valueForKeyPath:@"statusBar"];
  718. NSString *network = @"";
  719. if (Is_iPhoneX) {
  720. id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
  721. UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
  722. NSArray *subviews = [[foregroundView subviews][2] subviews];
  723. for (id subview in subviews) {
  724. if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
  725. network = @"WIFI";
  726. }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
  727. network = [subview valueForKeyPath:@"originalText"];
  728. }
  729. }
  730. }else {
  731. // 非 iPhone X
  732. UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
  733. NSArray *subviews = [foregroundView subviews];
  734. for (id subview in subviews) {
  735. if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
  736. int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
  737. switch (networkType) {
  738. case 0:
  739. network = @"none";
  740. break;
  741. case 1:
  742. network = @"2G";
  743. break;
  744. case 2:
  745. network = @"3G";
  746. break;
  747. case 3:
  748. network = @"4G";
  749. break;
  750. case 5:
  751. network = @"WIFI";
  752. break;
  753. default:
  754. break;
  755. }
  756. }
  757. }
  758. }
  759. if ([network isEqualToString:@""]) {
  760. network = @"none";
  761. }
  762. return network;
  763. }
  764. + (NSString *)getNetworkType
  765. {
  766. //modify by leo -fix ios13 -20191008
  767. UIApplication *app = [UIApplication sharedApplication];
  768. // id statusBar = [app valueForKeyPath:@"statusBar"];
  769. __block id statusBar = nil;
  770. __block NSString *network = @"";
  771. dispatch_async(dispatch_get_main_queue(), ^{
  772. if (@available(iOS 13.0, *)) {
  773. #pragma clang diagnostic push
  774. #pragma clang diagnostic ignored "-Wundeclared-selector"
  775. UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
  776. if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) {
  777. UIView *_localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)];
  778. if ([_localStatusBar respondsToSelector:@selector(statusBar)]) {
  779. statusBar = [_localStatusBar performSelector:@selector(statusBar)];
  780. }
  781. }
  782. #pragma clang diagnostic pop
  783. if (statusBar) {
  784. // _UIStatusBarDataCellularEntry
  785. id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"];
  786. id _wifiEntry = [currentData valueForKeyPath:@"wifiEntry"];
  787. id _cellularEntry = [currentData valueForKeyPath:@"cellularEntry"];
  788. if (_wifiEntry && [[_wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  789. // If wifiEntry is enabled, is WiFi.
  790. network = @"WIFI";
  791. } else if (_cellularEntry && [[_cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) {
  792. NSNumber *type = [_cellularEntry valueForKeyPath:@"type"];
  793. if (type) {
  794. switch (type.integerValue) {
  795. case 5:
  796. network = @"4G";;
  797. break;
  798. case 4:
  799. network = @"3G";;
  800. break;
  801. // case 1: // Return 1 when 1G.
  802. // break;
  803. case 0:
  804. // Return 0 when no sim card.
  805. network = @"none";;
  806. default:
  807. network = @"4G";;
  808. break;
  809. }
  810. }
  811. }
  812. }
  813. }
  814. else
  815. {
  816. statusBar = [app valueForKeyPath:@"statusBar"];
  817. if (Is_iPhoneX) {
  818. id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
  819. UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
  820. NSArray *subviews = [[foregroundView subviews][2] subviews];
  821. for (id subview in subviews) {
  822. if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
  823. network = @"WIFI";
  824. }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
  825. network = [subview valueForKeyPath:@"originalText"];
  826. }
  827. }
  828. }else {
  829. // 非 iPhone X
  830. UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
  831. NSArray *subviews = [foregroundView subviews];
  832. for (id subview in subviews) {
  833. if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
  834. int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
  835. switch (networkType) {
  836. case 0:
  837. network = @"none";
  838. break;
  839. case 1:
  840. network = @"2G";
  841. break;
  842. case 2:
  843. network = @"3G";
  844. break;
  845. case 3:
  846. network = @"4G";
  847. break;
  848. case 5:
  849. network = @"WIFI";
  850. break;
  851. default:
  852. break;
  853. }
  854. }
  855. }
  856. }
  857. }
  858. });
  859. if ([network isEqualToString:@""]) {
  860. network = @"none";
  861. }
  862. return network;
  863. }
  864. +(void)checkUpdateNeedTip:(BOOL)need{
  865. // NSOperationQueue * queue = [[NSOperationQueue alloc] init];
  866. // [queue addOperation:[NSBlockOperation blockOperationWithBlock:^{
  867. // NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"https://img.caicaicp.cn/app/livechat.plist"]];
  868. // if (dict) {
  869. // NSString* newVersion = [[[[dict objectForKey:@"items"] objectAtIndex:0] objectForKey:@"metadata"] objectForKey:@"bundle-version"];
  870. // NSString* tip = [[[[dict objectForKey:@"items"] objectAtIndex:0] objectForKey:@"metadata"] objectForKey:@"tip"];
  871. // NSString *myVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
  872. // if (![newVersion isEqualToString:myVersion]) {
  873. // UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tip message:@"是否更新版本" preferredStyle:UIAlertControllerStyleAlert];
  874. // [alertController addAction:[UIAlertAction actionWithTitle:@"不了" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  875. //
  876. // }]];
  877. // [alertController addAction:[UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-services://?action=download-manifest&url=https://img.caicaicp.cn/app/livechat.plist"]];
  878. //
  879. // }]];
  880. // [[LCTools getCurrentVC] presentViewController:alertController animated:YES completion:nil];
  881. //
  882. // }else{
  883. // if (need) {
  884. // [ZCHUDHelper showTitle:@"已经是最新版本"];
  885. // }
  886. //
  887. // }
  888. // }
  889. // }]];
  890. }
  891. ///// 获取vip标记
  892. //+ (UIImage *)getVipImageWithLevel:(NSInteger)level{
  893. // NSString *str = [self getVipImageStringWithLevel:level];
  894. // if (str != nil) {
  895. // return [UIImage imageNamed:str];
  896. // }else{
  897. // return nil;
  898. // }
  899. //}
  900. ///// 获取vip标记 带有VIP名字的图片
  901. //+ (UIImage *)getVipNameImageWithLevel:(NSInteger)level{
  902. // NSString *str = [self getVipImageStringWithLevel:level];
  903. // if (str != nil) {
  904. // NSString *imgName = [NSString stringWithFormat:@"%@_name",str];
  905. // return [UIImage imageNamed:imgName];
  906. // }else{
  907. // return nil;
  908. // }
  909. //}
  910. //
  911. ///// 获取vip标记 带有VIP名字的Size
  912. //+ (CGSize)getVipNameSizeWithLevel:(NSInteger)level{
  913. // CGSize size;
  914. // switch (level) {
  915. // case 0:
  916. // size = CGSizeMake(79.0f, 20.0f);
  917. // break;
  918. // case 1:
  919. // size = CGSizeMake(79.0f, 20.0f);
  920. // break;
  921. // case 3:
  922. // size = CGSizeMake(79.0f, 20.0f);
  923. // break;
  924. // case 4:
  925. // size = CGSizeMake(85.0f, 24.0f);
  926. // break;
  927. // case 5:
  928. // size = CGSizeMake(90.0f, 25.5f);
  929. // break;
  930. //
  931. // default:
  932. // size = CGSizeZero;
  933. // break;
  934. // }
  935. // return size;
  936. //}
  937. //
  938. ///// 获取vip标记 带有VIP的Size
  939. //+ (CGSize)getVipSizeWithLevel:(NSInteger)level{
  940. // CGSize size;
  941. // switch (level) {
  942. // case 0:
  943. // size = CGSizeMake(28.0f, 26.0f);
  944. // break;
  945. // case 1:
  946. // size = CGSizeMake(32.0f, 26.0f);
  947. // break;
  948. // case 3:
  949. // size = CGSizeMake(34.0f, 26.0f);
  950. // break;
  951. // case 4:
  952. // size = CGSizeMake(38.0f, 26.0f);
  953. // break;
  954. // case 5:
  955. // size = CGSizeMake(43.0f, 26.0f);
  956. // break;
  957. //
  958. // default:
  959. // size = CGSizeZero;
  960. // break;
  961. // }
  962. // return size;
  963. //}
  964. //
  965. //+ (NSString *)getVipImageStringWithLevel:(NSInteger)level{
  966. // NSString *imgName = nil;
  967. // switch (level) {
  968. // case 0:
  969. // imgName = @"vqu_images_ic_vip_zj";
  970. // break;
  971. // case 1:
  972. // imgName = @"vqu_images_ic_vip_bj";
  973. // break;
  974. // case 3:
  975. // imgName = @"vqu_images_ic_vip_gj";
  976. // break;
  977. // case 4:
  978. // imgName = @"vqu_images_ic_vip_gw";
  979. // break;
  980. // case 5:
  981. // imgName = @"vqu_images_ic_vip_hd";
  982. // break;
  983. //
  984. // default:
  985. // break;
  986. // }
  987. // return imgName;
  988. //}
  989. //
  990. ///// 获取vip飘窗背景颜色
  991. //+ (NSArray <UIColor *> *)getVipBgColorWithLevel:(NSInteger)level{
  992. // NSArray <UIColor *> *colors;
  993. // switch (level) {
  994. // case 0:
  995. // colors = @[HexColorFromRGB(0x5669EF),HexColorFromRGB(0xACB7FF)];
  996. // break;
  997. // case 1:
  998. // colors = @[HexColorFromRGB(0xFF6DBB),HexColorFromRGB(0xFFB39A)];
  999. // break;
  1000. // case 3:
  1001. // colors = @[HexColorFromRGB(0xFFCA71),HexColorFromRGB(0xFF6DBB)];
  1002. // break;
  1003. // case 4:
  1004. // colors = @[HexColorFromRGB(0xBAD2FF),HexColorFromRGB(0xFC7ABF)];
  1005. // break;
  1006. // case 5:
  1007. // colors = @[HexColorFromRGB(0xFF7070),HexColorFromRGB(0xFFCA71)];
  1008. // break;
  1009. //
  1010. // default:
  1011. // colors = @[LCGradientTwoColor,LCGradientOneColor];
  1012. // break;
  1013. // }
  1014. // return colors;
  1015. //}
  1016. /// 获取VIP名字
  1017. + (NSString *)getVipNameWithLevel:(NSInteger)level{
  1018. NSString *name = nil;
  1019. switch (level) {
  1020. case 0:
  1021. name = @"子爵贵族";
  1022. break;
  1023. case 1:
  1024. name = @"伯爵贵族";
  1025. break;
  1026. case 3:
  1027. name = @"公爵贵族";
  1028. break;
  1029. case 4:
  1030. name = @"国王贵族";
  1031. break;
  1032. case 5:
  1033. name = @"皇帝贵族";
  1034. break;
  1035. default:
  1036. name = @"";
  1037. break;
  1038. }
  1039. return name;
  1040. }
  1041. /// 生成随机文件名
  1042. + (NSString *)randomFilename{
  1043. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  1044. // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制
  1045. [formatter setDateFormat:@"YYYY_MM_dd_HH_mm_ss"];
  1046. //现在时间,你可以输出来看下是什么格式
  1047. NSDate *datenow = [NSDate date];
  1048. //----------将nsdate按formatter格式转成nsstring
  1049. NSString *currentTimeString = [formatter stringFromDate:datenow];
  1050. NSString *filename = [NSString stringWithFormat:@"%@_%@",currentTimeString,[self randomNumberWithLength:6]];
  1051. return filename;
  1052. }
  1053. /// 生成随机数
  1054. /// @param length 长度
  1055. /// @return 随机数
  1056. + (NSString *)randomNumberWithLength:(NSInteger)length{
  1057. NSString *strRandom = @"";
  1058. for(int i = 0; i < length; i ++){
  1059. strRandom = [strRandom stringByAppendingFormat:@"%i",(arc4random() % 9)];
  1060. }
  1061. return strRandom;
  1062. }
  1063. + (UIImage *)createQRCodeImageHaveCenterIMG:(NSString *)codeStr centerIMG:(UIImage *)centerIMG {
  1064. //1.生成coreImage框架中的滤镜来生产二维码
  1065. CIFilter *filter=[CIFilter filterWithName:@"CIQRCodeGenerator"];
  1066. [filter setDefaults];
  1067. [filter setValue:[codeStr dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
  1068. //4.获取生成的图片
  1069. CIImage *ciImg=filter.outputImage;
  1070. //放大ciImg,默认生产的图片很小
  1071. //5.设置二维码的前景色和背景颜色
  1072. CIFilter *colorFilter=[CIFilter filterWithName:@"CIFalseColor"];
  1073. //5.1设置默认值
  1074. [colorFilter setDefaults];
  1075. [colorFilter setValue:ciImg forKey:@"inputImage"];
  1076. [colorFilter setValue:[CIColor colorWithRed:0 green:0 blue:0] forKey:@"inputColor0"];
  1077. [colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor1"];
  1078. //5.3获取生存的图片
  1079. ciImg=colorFilter.outputImage;
  1080. CGAffineTransform scale=CGAffineTransformMakeScale(10, 10);
  1081. ciImg=[ciImg imageByApplyingTransform:scale];
  1082. // self.imgView.image=[UIImage imageWithCIImage:ciImg];
  1083. //6.在中心增加一张图片
  1084. UIImage *img=[UIImage imageWithCIImage:ciImg];
  1085. // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
  1086. if (CGSizeEqualToSize(img.size, CGSizeZero)) {
  1087. return nil;
  1088. }
  1089. //7.生存图片
  1090. //7.1开启图形上下文
  1091. UIGraphicsBeginImageContext(img.size);
  1092. //7.2将二维码的图片画入
  1093. //BSXPCMessage received error for message: Connection interrupted why??
  1094. // [img drawInRect:CGRectMake(10, 10, img.size.width-20, img.size.height-20)];
  1095. [img drawInRect:CGRectMake(0, 0, img.size.width, img.size.height)];
  1096. //7.3在中心划入其他图片
  1097. UIImage *centerImg= centerIMG;
  1098. CGFloat centerW= img.size.width*0.2;
  1099. CGFloat centerH= img.size.width*0.2;
  1100. CGFloat centerX=(img.size.width-centerW)*0.5;
  1101. CGFloat centerY=(img.size.height -centerH)*0.5;
  1102. [centerImg drawInRect:CGRectMake(centerX, centerY, centerW, centerH)];
  1103. //7.4获取绘制好的图片
  1104. UIImage *finalImg=UIGraphicsGetImageFromCurrentImageContext();
  1105. //7.5关闭图像上下文
  1106. UIGraphicsEndImageContext();
  1107. return finalImg;
  1108. }
  1109. #pragma mark-照片相关
  1110. -(void)readFromAlum:(id)viewController block:(ImageFinishBlock)ImageBlock
  1111. {
  1112. if ((YES == [UIImagePickerController isSourceTypeAvailable:
  1113. UIImagePickerControllerSourceTypeSavedPhotosAlbum])
  1114. )
  1115. {
  1116. _imgblock = ImageBlock;
  1117. _VC = viewController;
  1118. UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
  1119. self.cameraUI = cameraUI;
  1120. self.cameraUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
  1121. if (self.onlyShowImage) {
  1122. self.cameraUI.mediaTypes = [NSArray arrayWithObjects:@"public.image", nil];
  1123. } else {
  1124. self.cameraUI.mediaTypes =
  1125. [UIImagePickerController availableMediaTypesForSourceType:
  1126. UIImagePickerControllerSourceTypePhotoLibrary];
  1127. }
  1128. [self.cameraUI setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
  1129. self.cameraUI.allowsEditing = YES;
  1130. self.cameraUI.delegate = self;
  1131. [viewController presentViewController:self.cameraUI animated:YES completion:nil];
  1132. }
  1133. }
  1134. -(void)readFromcamera:(id)viewController block:(ImageFinishBlock)ImageBlock
  1135. {
  1136. NSString *mediaType = AVMediaTypeVideo;
  1137. AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
  1138. if(authStatus == AVAuthorizationStatusDenied){
  1139. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"相机权限" message:@"请在iPhone的\"设置->隐私->相机\"选项中,允许\"APP\"访问您的相机." delegate:nil cancelButtonTitle:@"好" otherButtonTitles:nil];
  1140. [alert show];
  1141. }
  1142. if ((YES == [UIImagePickerController isSourceTypeAvailable:
  1143. UIImagePickerControllerSourceTypeCamera])
  1144. )
  1145. {
  1146. _imgblock = ImageBlock;
  1147. _VC = viewController;
  1148. UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
  1149. cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
  1150. cameraUI.mediaTypes =
  1151. [UIImagePickerController availableMediaTypesForSourceType:
  1152. UIImagePickerControllerSourceTypeCamera];
  1153. cameraUI.allowsEditing =YES ;
  1154. cameraUI.delegate = self;
  1155. [viewController presentViewController:cameraUI animated:YES completion:nil];
  1156. }
  1157. else{
  1158. UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"打开照相机失败了" message:@"请检查照相机是否已损坏" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil];
  1159. [alert show];
  1160. }
  1161. }
  1162. #pragma mark UIImagePickerDelegate
  1163. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
  1164. {
  1165. NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
  1166. UIImage *originalImage, *editedImage;
  1167. if ([mediaType isEqualToString:@"public.image"]){
  1168. NSLog(@" image == %@",info);
  1169. editedImage = (UIImage *) [info objectForKey:
  1170. UIImagePickerControllerEditedImage];//截图之后的
  1171. originalImage = (UIImage *) [info objectForKey:
  1172. UIImagePickerControllerOriginalImage];//原图
  1173. // NSData *imageData= UIImageJPEGRepresentation(editedImage, 100);
  1174. // NSData* imageData = UIImagePNGRepresentation(editedImage);
  1175. // photoImageView.image = [UIImage imageWithData:imageData];
  1176. }
  1177. if (_imgblock)
  1178. {
  1179. _imgblock(editedImage);
  1180. }
  1181. if (_originalImage)
  1182. {
  1183. _originalImage(originalImage);
  1184. }
  1185. [_VC dismissViewControllerAnimated: YES completion:nil];
  1186. }
  1187. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
  1188. [picker setNeedsStatusBarAppearanceUpdate];
  1189. [picker dismissViewControllerAnimated:YES completion:nil];
  1190. }
  1191. + (CGFloat)widthWithString:(NSString *)string withFont:(UIFont *)font{
  1192. return [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:NULL].size.width;
  1193. }
  1194. +(NSDate *)stringToDate:(NSString *)dateStr:(BOOL)type
  1195. {
  1196. //type== yes (年月日) 否则年月
  1197. NSString *dateType;
  1198. if (type) {
  1199. dateType = @"yyyy-MM-dd";
  1200. }else{
  1201. dateType = @"yyyy-MM";
  1202. }
  1203. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  1204. [dateFormatter setDateFormat:dateType];
  1205. NSDate *date = [dateFormatter dateFromString:dateStr];
  1206. return date;
  1207. }
  1208. //获取某月的最后一天字符串
  1209. +(NSString *)getMonthLastDayWithDate:(NSDate *)date format:(NSString *)aformat{
  1210.     NSDate * newDate = date;
  1211.     double interval = 0;
  1212.     NSDate * firstDate = nil;
  1213.     NSDate * lastDate = nil;
  1214.     NSCalendar * calendar = [NSCalendar currentCalendar];
  1215.     BOOL bl = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDate interval:&interval forDate:newDate];
  1216.     if(bl) {
  1217.         lastDate = [firstDate dateByAddingTimeInterval:interval -1];
  1218.         NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc]init];
  1219.         [myDateFormatter setDateFormat:aformat];
  1220.         NSString * lastString = [myDateFormatter stringFromDate:lastDate];
  1221.         return lastString;
  1222.     }
  1223.     return @"";
  1224. }
  1225. //获取某月的第一天字符串
  1226. +(NSString *)getMonthFirstDayWithDate:(NSDate *)date format:(NSString *)aformat{
  1227.     NSDate * newDate = date;
  1228.     double interval = 0;
  1229.     NSDate * firstDate = nil;
  1230.     NSCalendar * calendar = [NSCalendar currentCalendar];
  1231.     BOOL bl = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDate interval:&interval forDate:newDate];
  1232.     if(bl) {
  1233.         NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc]init];
  1234.         [myDateFormatter setDateFormat:aformat];
  1235.         NSString * firstString = [myDateFormatter stringFromDate: firstDate];
  1236.         return firstString;
  1237.     }
  1238.     return @"";
  1239. }
  1240. /**
  1241. 是否属于同一月
  1242. @param time1 time1
  1243. @param time2 time2
  1244. @return 同一月为真,否则为假
  1245. */
  1246. + (BOOL)isInSameMonth:(int64_t)time1 time2:(int64_t)time2
  1247. {
  1248. NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:time1];
  1249. NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:time2];
  1250. NSCalendar *calendar = [NSCalendar currentCalendar];
  1251. int unit = NSCalendarUnitMonth | NSCalendarUnitYear;
  1252. NSDateComponents *nowCmps = [calendar components:unit fromDate:date1];
  1253. NSDateComponents *selfCmps = [calendar components:unit fromDate:date2];
  1254. return (nowCmps.year == selfCmps.year)&&(nowCmps.month == selfCmps.month);
  1255. }
  1256. //openInstall的动态参数操作
  1257. +(void)saveBindData:(NSString*)bindData{
  1258. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  1259. [defaults setValue:bindData forKey:@"bindData"];
  1260. [defaults synchronize];
  1261. }
  1262. +(NSString*)getbindData{
  1263. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  1264. NSString *result = [defaults objectForKey:@"bindData"];
  1265. return result;
  1266. }
  1267. +(BOOL)isIdCard:(NSString *)idcard{
  1268. if(!idcard)
  1269. return 0;
  1270. NSString *regex = @"^[1-9]{1}[0-9]{16}([0-9]|[xX])$";
  1271. return [self predicateMatchWithString:idcard regex:regex];
  1272. }
  1273. +(BOOL)predicateMatchWithString:(NSString *)str regex:(NSString *)regex{
  1274. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
  1275. return [predicate evaluateWithObject:str];
  1276. }
  1277. //openInstall的渠道编号操作
  1278. +(void)saveChannelCode:(NSString*)channelCode{
  1279. NSUserDefaults *defualts = [NSUserDefaults standardUserDefaults];
  1280. [defualts setValue:channelCode forKey:@"channelCode"];
  1281. [defualts synchronize];
  1282. }
  1283. +(NSString*)getchannelCode{
  1284. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  1285. NSString *result = [defaults objectForKey:@"channelCode"];
  1286. return result;
  1287. }
  1288. + (BOOL)isGirlsRealNameAuthentication{
  1289. YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo;
  1290. BOOL isGoddessCertified = [OCUserDefaults boolForKey:kIS_GODDESS_CERTIFIED];
  1291. if (userinfo.youpaipgender == 1){//女
  1292. if (isGoddessCertified) {
  1293. return YES;
  1294. }else{
  1295. @weakify(self)
  1296. [self showAuthAlertWithConfirmBlock:^{
  1297. @strongify(self);
  1298. YOUPAILCBigCastProtocolVC* vc = [[YOUPAILCBigCastProtocolVC alloc]init];
  1299. [vc setAgreeProtocolBlock:^{
  1300. @strongify(self);
  1301. [self youpaifrealNameAuthentication];
  1302. }];
  1303. // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES];
  1304. [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES];
  1305. }];
  1306. return NO;
  1307. }
  1308. }
  1309. return YES;
  1310. }
  1311. /// 是否实名认证
  1312. + (BOOL)isRealNameAuthentication{
  1313. YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo;
  1314. if (userinfo.youpaipgender == 1){//女
  1315. BOOL isGoddessCertified = [OCUserDefaults boolForKey:kIS_GODDESS_CERTIFIED];
  1316. if (isGoddessCertified) { //是否通过女神认证 0未通过 1已通过
  1317. return YES;
  1318. }else{
  1319. @weakify(self)
  1320. [self showAuthAlertWithConfirmBlock:^{
  1321. @strongify(self);
  1322. YOUPAILCBigCastProtocolVC *vc = [[YOUPAILCBigCastProtocolVC alloc]init];
  1323. [vc setAgreeProtocolBlock:^{
  1324. @strongify(self);
  1325. [self youpaifrealNameAuthentication];
  1326. }];
  1327. [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES];
  1328. // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES];
  1329. }];
  1330. }
  1331. }else{//男
  1332. // if (userinfo.youpaipis_auth == 1) {
  1333. return YES;
  1334. // }else{
  1335. // @weakify(self)
  1336. // [self showAuthAlertWithConfirmBlock:^{
  1337. // @strongify(self);
  1338. // YOUPAIRealPersonFaceVC *vc = [YOUPAIRealPersonFaceVC new];
  1339. // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES];
  1340. // }];
  1341. // }
  1342. }
  1343. return NO;
  1344. }
  1345. /// 去认证页面
  1346. + (void)goRealNamePage{
  1347. YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo;
  1348. if (userinfo.youpaipgender == 1){//女
  1349. @weakify(self);
  1350. YOUPAILCBigCastProtocolVC* vc = [[YOUPAILCBigCastProtocolVC alloc]init];
  1351. [vc setAgreeProtocolBlock:^{
  1352. @strongify(self);
  1353. [self youpaifrealNameAuthentication];
  1354. }];
  1355. // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES];
  1356. [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES];
  1357. }else{//男
  1358. YOUPAIRealPersonFaceVC *vc = [YOUPAIRealPersonFaceVC new];
  1359. [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES];
  1360. }
  1361. }
  1362. + (void)showAuthAlertWithConfirmBlock:(void(^)(void))block{
  1363. LZAlertAction *cancelAction = [LZAlertAction actionWithTitle:@"暂不认证" handler:^(LZAlertAction *action) {
  1364. }];
  1365. cancelAction.cornerRadius = 24;
  1366. cancelAction.bgColor = LZF5F4F7Color;
  1367. cancelAction.color = LZ273145Color;
  1368. LZAlertAction *confimAction = [LZAlertAction actionWithTitle:@"去认证" handler:^(LZAlertAction *action) {
  1369. if (block != nil) {
  1370. block();
  1371. }
  1372. }];
  1373. confimAction.cornerRadius = 24.0f;
  1374. confimAction.bgColor = [UIColor colorWithPatternImage:[LCTools ColorImage:CGSizeMake((KScreenWidth - 108.0f)/2, 48.0f) FromColors:@[LZBFB6FFColor,LZ7C69FEColor] ByGradientType:GradientLeftToRight]];
  1375. LZAlertWindow *alert = [LZAlertWindow alertWithTitle:@"真人认证" content:@"相语欢颜提倡真实交友,真人认证通过后即可心动交友啦~" action:@[cancelAction,confimAction]];
  1376. alert.contentTextAlignment = NSTextAlignmentCenter;
  1377. [[LCTools getCurrentVC] TFPresentVC:alert completion:^{}];
  1378. }
  1379. /// 阿里实名认证
  1380. + (void)youpaifrealNameAuthentication{
  1381. [UCAuthorityManager cameraAuthority:^{
  1382. YMCustomCameraViewModel *customCameraVM = [[YMCustomCameraViewModel alloc]initWithParams:@{}];
  1383. [YMRouter openURL:stringFormat(@"%@%@",YM_ROUTER_URL_PREFIX,YM_ROUTER_CUSTOM_CAMERA) withUserInfo:@{
  1384. RouterViewModel:customCameraVM
  1385. } completion:nil];
  1386. } denied:^{
  1387. YMTipsPopupView *customView = [[YMTipsPopupView alloc]init];
  1388. [customView configutationWithTips:@"请在iphone的“设置-隐私-相机”选项中,允许APP访问您的相机。" TipsAlignment:NSTextAlignmentCenter IsHideTitle:NO IsHideSingleButton:NO];
  1389. YMPopupView *popupView = [YMPopupView initWithCustomView:customView parentView:[YMGlobalUtils getCurrentVC].view popStyle:YMPopupStyleFade dismissStyle:YMDismissStyleFade];
  1390. popupView.priority = 999;
  1391. popupView.cornerRadius = adapt(10);
  1392. popupView.rectCorners = UIRectCornerAllCorners;
  1393. popupView.positionStyle = YMPositionStyleCenter;
  1394. popupView.isHideBg = NO;
  1395. popupView.bgAlpha = 0.3;
  1396. @weakify(popupView)
  1397. customView.buttonBlock = ^(BOOL isConfirm) {
  1398. @strongify(popupView)
  1399. if (isConfirm) {
  1400. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
  1401. }
  1402. [popupView dismissWithStyle:YMDismissStyleFade duration:2.0];
  1403. };
  1404. [popupView pop];
  1405. }];
  1406. // @weakify(self);
  1407. // [LCHttpHelper requestWithURLString:GetLiveVerifyToken parameters:@{} needToken:YES type:HttpRequestTypePost success:^(id responseObject) {
  1408. // @strongify(self);
  1409. // NSDictionary* dict = (NSDictionary*)responseObject;
  1410. // NSInteger code = [[dict objectForKey:@"code"] integerValue];
  1411. // if (code == 0) {
  1412. // NSString *token = dict[@"data"][@"VerifyToken"];
  1413. // NSString *BizId = dict[@"data"][@"BizId"];
  1414. // [self youpaifpushToAliSdk:token BizId:BizId];
  1415. //
  1416. // }else{
  1417. //
  1418. // [ZCHUDHelper showTitle:[dict objectForKey:@"message"]];
  1419. // }
  1420. //
  1421. //
  1422. //
  1423. // } failure:^(NSError *error) {
  1424. // [ZCHUDHelper showTitle:error.localizedDescription];
  1425. //
  1426. // }];
  1427. }
  1428. + (void)youpaifpushToAliSdk:(NSString*)token BizId:(NSString*)bizIdStr{
  1429. RPConfiguration *configuration = [RPConfiguration configuration];
  1430. NSString *filePath1 = [[NSBundle mainBundle] pathForResource:@"RPCustomUI" ofType:@"bundle"];
  1431. configuration.customUIPath = filePath1;
  1432. [RPSDK startWithVerifyToken:token viewController:[LCTools getContainNavigationControllerCurrentVC] configuration:configuration completion:^(RPResult * _Nonnull result) {
  1433. NSLog(@"实人认证结果:%@==%@", result,result.message);
  1434. switch (result.state) {
  1435. case RPStatePass:
  1436. // 认证通过。
  1437. [self youpaifpostBizId:bizIdStr];
  1438. break;
  1439. case RPStateFail:
  1440. // 认证不通过。
  1441. [ZCHUDHelper showTitle:@"认证失败,请重新认证"];
  1442. break;
  1443. case RPStateNotVerify:
  1444. // 未认证。
  1445. // 通常是用户主动退出或者姓名身份证号实名校验不匹配等原因导致。
  1446. // 具体原因可通过result.errorCode来区分(详见文末错误码说明表格)。
  1447. break;
  1448. }
  1449. }];
  1450. }
  1451. + (void)youpaifpostBizId:(NSString*)ID{
  1452. NSMutableDictionary *dict = [NSMutableDictionary new];
  1453. [dict setObject:ID forKey:@"BizId"];
  1454. [LCHttpHelper requestWithURLString:LiveVerifyTokenSuccess parameters:dict needToken:YES type:HttpRequestTypePost success:^(id responseObject) {
  1455. NSDictionary* dict = (NSDictionary*)responseObject;
  1456. NSInteger code = [[dict objectForKey:@"code"] integerValue];
  1457. if (code == 0) {
  1458. YOUPAILZLiveVerifyResultVC *vc = [[YOUPAILZLiveVerifyResultVC alloc] init];
  1459. vc.youpaipstate = LZLiveVerifyStateWithInReview;
  1460. vc.youpaipcontent_str = [dict objectForKey:@"message"];
  1461. [[LCTools getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES];
  1462. }else{
  1463. [ZCHUDHelper showTitle:[dict objectForKey:@"message"]];
  1464. }
  1465. } failure:^(NSError *error) {
  1466. [ZCHUDHelper showTitle:error.localizedDescription];
  1467. }];
  1468. }
  1469. @end