LCTools.m 67 KB

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