// // LCTools.m // LiveChat // // Created by 张灿 on 2018/4/10. // Copyright © 2018年 caicai. All rights reserved. // #import "LCTools.h" #import "WHKeyChain.h" #import "YOUPAILCTabBarVC.h" #import "YOUPAILCMessageVC.h" #import #import #import #import "AppDelegate.h" #import "YOUPAIZYFirstVC.h" #import "YOUPAIRealPersonFaceVC.h" #import "YOUPAILZLiveVerifyResultVC.h" #import "YOUPAIRealPersonFaceVC.h" #import #import "YOUPAILZLiveVerifyResultVC.h" #import "LZAlertWindow.h" #import "YOUPAILCBigCastProtocolVC.h" #import "UIViewController+TFPresent.h" #import "YMPasswordLoginViewController.h" #import "YOUPAILCUploadCameraAuditVC.h" #define KEY_DEVICE_UUID_KEYCHAIN @"KEY_DEVICE_UUID_KEYCHAIN" //keyChain存档的uuid #define KEY_LOAD_UUID_TABLENAME @"KEY_LOAD_UUID_TABLENAME" //读取字典对象的健名 @implementation YOUPAILZRichTextStyle + (instancetype)richTextStyleWithText:(NSString *)text font:(UIFont *)font color:(UIColor *)color{ return [[self alloc] initWithText:text font:font color:color]; } - (instancetype)initWithText:(NSString *)text font:(UIFont *)font color:(UIColor *)color{ if (self = [super init]) { self.text = text; self.font = font; self.color = color; } return self; } @end static LCTools *function = nil; @interface LCTools() @property (nonatomic, copy ) NSString *networkStatus; @end @implementation LCTools +(id)share { if (function ==nil) { function = [[self alloc]init]; } return function; } + (CGFloat)getStatusBarHight { CGFloat statusBarHeight = 0; if (@available(iOS 13.0, *)) { statusBarHeight = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height; } else { statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height; } return statusBarHeight; } + (NSString*)getPasteString{ NSString *text = @"#vqu#"; UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; if([pasteboard.string hasPrefix:text]){ NSString* caicaiNumStr = [pasteboard.string substringFromIndex:text.length];//截取前八个字符----每次换包必须改 return caicaiNumStr; }else{ return @""; } } /// 提取粘贴板数据 + (void)extractPasteboardSource:(void(^)(NSString *extractSource))handle{ //获取全局队列 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){ //iOS14及以上,先检测剪切板内容,符合规则再读取剪切板 if (@available(iOS 14.0, *)) { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; NSSet *pasteDetectionPatternSet = [NSSet setWithObjects:UIPasteboardDetectionPatternNumber, UIPasteboardDetectionPatternProbableWebURL, UIPasteboardDetectionPatternProbableWebSearch, nil]; [pasteboard detectPatternsForPatterns: pasteDetectionPatternSet completionHandler:^(NSSet *foundPattenSet, NSError *e) { BOOL isNumber = NO, isUrl = NO, isWebSearch = NO; for (UIPasteboardDetectionPattern pattern in foundPattenSet) { if ([pattern isEqualToString: UIPasteboardDetectionPatternNumber]) { isNumber = YES; } if ([pattern isEqualToString: UIPasteboardDetectionPatternProbableWebURL]) { isUrl = YES; } if ([pattern isEqualToString: UIPasteboardDetectionPatternProbableWebSearch]) { isWebSearch = YES; } } if (isNumber || isUrl || isWebSearch) { //符合规则,在下一个runloop读取剪切板 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; NSString *string = [pasteboard.string copy]; handle(string); }); } }]; } else { //iOS14以下,直接读剪切板 UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; NSString *string = [pasteboard.string copy]; handle(string); } }); } + (UIImage*)giftImgWithGiftUrlStr:(NSString*)giftUrlStr{ UIImage* image; NSString* giftName = [[giftUrlStr componentsSeparatedByString:@"/"]lastObject]; NSString* giftCanchesPath= [[NSString alloc]initWithFormat:@"%@/%@/",CachesPath,@"Gift"]; image = [UIImage imageNamed:[giftCanchesPath stringByAppendingPathComponent:giftName]]; if (!image) { if (![[NSFileManager defaultManager] fileExistsAtPath:giftCanchesPath]) { [[NSFileManager defaultManager] createDirectoryAtPath:giftCanchesPath withIntermediateDirectories:NO attributes:nil error:nil]; } NSString *imagePath =[giftCanchesPath stringByAppendingPathComponent:giftName]; if (![[NSFileManager defaultManager] fileExistsAtPath:imagePath]){ NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,giftUrlStr]; NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; image = [UIImage imageWithData:data]; [UIImagePNGRepresentation([UIImage imageWithData:data]) writeToFile:imagePath atomically:YES]; } } return image; } + (NSData*)giftSVGAWithSvgaUrlStr:(NSString*)svgaUrlStr { NSData *data; NSString* svgaName = [[svgaUrlStr componentsSeparatedByString:@"/"]lastObject]; NSString* svgaCanchesPath= [[NSString alloc]initWithFormat:@"%@/%@/",CachesPath,@"SVGA"]; data = [NSData dataWithContentsOfFile:[svgaCanchesPath stringByAppendingPathComponent:svgaName]]; if (!data) { if (![[NSFileManager defaultManager] fileExistsAtPath:svgaCanchesPath]) { [[NSFileManager defaultManager] createDirectoryAtPath:svgaCanchesPath withIntermediateDirectories:NO attributes:nil error:nil]; } NSString *svgaPath =[svgaCanchesPath stringByAppendingPathComponent:svgaName]; if (![[NSFileManager defaultManager] fileExistsAtPath:svgaPath]){ dispatch_queue_t queue = dispatch_queue_create("SvgaCache", NULL); dispatch_async(queue, ^{ NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,svgaUrlStr]; NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; [data writeToFile:svgaPath atomically:YES]; }); // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // NSString* urlStr = [NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,svgaUrlStr]; // NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; // [data writeToFile:svgaPath atomically:YES]; // }); } } return data; } + (UIViewController *)getCurrentVC { // UIWindow *window = [[UIApplication sharedApplication].windows firstObject]; // if (!window) { // return nil; // } // UIView *tempView; // for (UIView *subview in window.subviews) { // if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) { // tempView = subview; // break; // } // } // if (!tempView) { // tempView = [window.subviews lastObject]; // } // // id nextResponder = [tempView nextResponder]; // while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) { // tempView = [tempView.subviews firstObject]; // // if (!tempView) { // return nil; // } // nextResponder = [tempView nextResponder]; // } // return (UIViewController *)nextResponder; UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *currentVC = [self getCurrentVCFrom:rootViewController]; return currentVC; } + (UIViewController *)getContainNavigationControllerCurrentVC{ UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *currentVC = [self getContainNavigationControllerCurrentVCFrom:rootViewController]; return currentVC; } + (UIViewController *)getContainNavigationControllerCurrentVCFrom:(UIViewController *)rootVC{ UIViewController *currentVC; if ([rootVC isKindOfClass:[UITabBarController class]]) { // 根视图为UITabBarController currentVC = [self getContainNavigationControllerCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]]; } else if ([rootVC isKindOfClass:[UINavigationController class]]){ // 根视图为UINavigationController currentVC = [self getContainNavigationControllerCurrentVCFrom:[(UINavigationController *)rootVC viewControllers].lastObject]; } else { // 根视图为非导航类 currentVC = rootVC; } return currentVC; } + (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC { UIViewController *currentVC; if ([rootVC presentedViewController]) { // 视图是被presented出来的 rootVC = [rootVC presentedViewController]; } if ([rootVC isKindOfClass:[UITabBarController class]]) { // 根视图为UITabBarController currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]]; } else if ([rootVC isKindOfClass:[UINavigationController class]]){ // 根视图为UINavigationController currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]]; } else { // 根视图为非导航类 currentVC = rootVC; } return currentVC; } +(UIViewController *)getNilPresentationController:(UIViewController *)viewController{ UIViewController *vc = viewController; while (vc.presentedViewController) { vc = vc.presentedViewController; } return vc; } + (NSString*)getUUIDString{ NSMutableDictionary *readKeyChainUUID = (NSMutableDictionary *)[WHKeyChain load:KEY_DEVICE_UUID_KEYCHAIN]; if(!readKeyChainUUID){ //需要写入 NSString *uuidStr = [[NSUUID UUID] UUIDString]; NSString *uuid = [[uuidStr stringByReplacingOccurrencesOfString:@"0" withString:@""] stringByReplacingOccurrencesOfString:@"-" withString:@""]; // 保存自己生成的 NSDictionary *dict = [NSDictionary dictionaryWithObject:uuid forKey:KEY_LOAD_UUID_TABLENAME]; [WHKeyChain save:KEY_DEVICE_UUID_KEYCHAIN data:dict]; return uuid; } return readKeyChainUUID[@"KEY_LOAD_UUID_TABLENAME"]; } + (UIColor*)getBkgRandomColor{ NSArray* bkgColorArray = @[HexColorFromRGB(0xe5c9c9),HexColorFromRGB(0xc9d8e5),HexColorFromRGB(0xc9d3c1),HexColorFromRGB(0xcbcbc8),HexColorFromRGB(0xd3cbe4),HexColorFromRGB(0xcdd1d6)]; int index = arc4random() % 6; return bkgColorArray[index]; } + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { long double rotate = 0.0; CGRect rect; float translateX = 0; float translateY = 0; float scaleX = 1.0; float scaleY = 1.0; switch (orientation) { case UIImageOrientationLeft: rotate = M_PI_2; rect = CGRectMake(0, 0, image.size.height, image.size.width); translateX = 0; translateY = -rect.size.width; scaleY = rect.size.width/rect.size.height; scaleX = rect.size.height/rect.size.width; break; case UIImageOrientationRight: rotate = 3 * M_PI_2; rect = CGRectMake(0, 0, image.size.height, image.size.width); translateX = -rect.size.height; translateY = 0; scaleY = rect.size.width/rect.size.height; scaleX = rect.size.height/rect.size.width; break; case UIImageOrientationDown: rotate = M_PI; rect = CGRectMake(0, 0, image.size.width, image.size.height); translateX = -rect.size.width; translateY = -rect.size.height; break; default: rotate = 0.0; rect = CGRectMake(0, 0, image.size.width, image.size.height); translateX = 0; translateY = 0; break; } // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃 if (CGSizeEqualToSize(rect.size, CGSizeZero)) { return nil; } UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); //做CTM变换 CGContextTranslateCTM(context, 0.0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextRotateCTM(context, rotate); CGContextTranslateCTM(context, translateX, translateY); CGContextScaleCTM(context, scaleX, scaleY); //绘制图片 CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage); UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext(); return newPic; } //获取当前时间戳 + (NSString*)getCurrentTimestamp{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"]; [formatter setTimeZone:timeZone]; NSDate *datenow = [NSDate date];//现在时间,你可以输出来看下是什么格式 NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]]; return timeSp; } //获取当前时间戳 豪秒 + (NSString*)getCurrentMillisecondTimestamp{ NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0]; NSTimeInterval a = [dat timeIntervalSince1970]; NSString *timeSp = [NSString stringWithFormat:@"%0.f", a * 1000];//转为字符型 return timeSp; } + (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key { const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)]; const unsigned char *buffer = (const unsigned char *)[HMACData bytes]; NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2]; for (int i = 0; i < HMACData.length; ++i){ [HMAC appendFormat:@"%02x", buffer[i]]; } return HMAC; } + (void)updateTabCenter{ } + (void)changeRootToTabbar{ NSLog(@"!!!changeRootToTabbar, 刷新控制器"); AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate; YOUPAILCTabBarVC* tabbar = [[YOUPAILCTabBarVC alloc]init]; app.window.rootViewController = tabbar; //切换的动画效果 CATransition *animation = [CATransition animation]; [animation setDuration:0.5];//设置动画时间 // animation.type = kCATransitionReveal;//设置动画类型 animation.type = @"oglFlip"; animation.subtype = kCATransitionFromLeft; [app.window.layer addAnimation:animation forKey:nil]; } + (void)changeRootToLogin{ [LCSaveData saveIsspecial:NO]; [LCSaveData saveLoginMark:NO]; [LCSaveModel saveUserModel:nil]; [LCSaveData saveTokenString:nil]; [LCSaveData saveYoungNoticeTime:nil]; [OCUserDefaults removeObjectForKey:kUSER_ID]; [OCUserDefaults removeObjectForKey:kIS_FEMALE_GENDER]; [OCUserDefaults removeObjectForKey:kIS_GODDESS_CERTIFIED]; [OCUserDefaults removeObjectForKey:kIS_VIP]; [OCUserDefaults synchronize]; [[YOUPAILCIMLoginManager sharedCenter] youpaifIMLogout:^{ }]; AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate; YMPasswordLoginViewModel *loginVM = [[YMPasswordLoginViewModel alloc]initWithParams:@{}]; YMPasswordLoginViewController* loginVC = [[YMPasswordLoginViewController alloc]initWithViewModel:loginVM]; ZCBaseNavigationVC* naviLogin = [[ZCBaseNavigationVC alloc]initWithRootViewController:loginVC]; app.window.rootViewController = naviLogin; //切换的动画效果 CATransition *animation = [CATransition animation]; [animation setDuration:0.5];//设置动画时间 // animation.type = kCATransitionReveal;//设置动画类型 animation.type = @"oglFlip"; animation.subtype = kCATransitionFromLeft; [app.window.layer addAnimation:animation forKey:nil]; } + (UIImage*) ColorImage:(CGSize)size FromColors:(NSArray*)colors ByGradientType:(GradientType)gradientType{ NSMutableArray *ar = [NSMutableArray array]; for(UIColor *c in colors) { [ar addObject:(id)c.CGColor]; } // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃 if (CGSizeEqualToSize(size, CGSizeZero)) { return nil; } UIGraphicsBeginImageContextWithOptions(size, YES, 1); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]); CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)ar, NULL); CGPoint start; CGPoint end; switch (gradientType) { case 0: start = CGPointMake(0.0, 0.0); end = CGPointMake(0.0, size.height); break; case 1: start = CGPointMake(0.0, 0.0); end = CGPointMake(size.width, 0.0); break; case 2: start = CGPointMake(0.0, 0.0); end = CGPointMake(size.width, size.height); break; case 3: start = CGPointMake(size.width, 0.0); end = CGPointMake(0.0, size.height); break; default: break; } CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); CGGradientRelease(gradient); CGContextRestoreGState(context); CGColorSpaceRelease(colorSpace); UIGraphicsEndImageContext(); return image; } + (UIImage *)imageForSize:(CGSize)size colors:(NSArray*)colors locations:(NSArray *)locas ByGradientType:(GradientType)gradientType{ NSMutableArray *ar = [NSMutableArray array]; for(UIColor *c in colors) { [ar addObject:(id)c.CGColor]; } CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = CGRectMake(0, 0, size.width, size.height); // 设置显示的frame gradientLayer.colors = ar; gradientLayer.locations = locas; // 颜色的起点位置,递增,并且数量跟颜色数量相等 CGPoint startPoint; CGPoint endPoint; switch (gradientType) { case GradientTopToBottom: //从上到下 startPoint = CGPointMake(0.5, 0); endPoint = CGPointMake(0.5, 1); break; case GradientLeftToRight: //从左到右 startPoint = CGPointMake(0.0, 0.5); endPoint = CGPointMake(1, 0.5); break; case GradientupleftTolowRight: //左上到右下 startPoint = CGPointMake(0, 0); endPoint = CGPointMake(1, 1); break; case GradientUprightTolowLeft: //右上到左下 startPoint = CGPointMake(1, 0); endPoint = CGPointMake(0, 1); break; default: break; } gradientLayer.startPoint = startPoint; gradientLayer.endPoint = endPoint; return [self imageFromLayer:gradientLayer]; } + (UIImage *)imageFromLayer:(CALayer *)layer{ UIGraphicsImageRenderer *render = [[UIGraphicsImageRenderer alloc] initWithSize:layer.bounds.size]; return [render imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) { [layer renderInContext:rendererContext.CGContext]; }]; } +(CAGradientLayer*)getGradientLayerWithSize:(CGSize)size twoColors:(NSArray*)twoColors gradientType:(GradientType)gradientType{ CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = CGRectMake(0, 0, size.width, size.height); // 设置显示的frame gradientLayer.colors = @[(id)((UIColor*)twoColors[0]).CGColor,(id)((UIColor*)twoColors[1]).CGColor]; // 设置渐变颜色 gradientLayer.locations = @[@0.0, @1.0]; // 颜色的起点位置,递增,并且数量跟颜色数量相等 switch (gradientType) { case 0: gradientLayer.startPoint = CGPointMake(0, 0); gradientLayer.endPoint = CGPointMake(0, 1); break; case 1: gradientLayer.startPoint = CGPointMake(0, 0); gradientLayer.endPoint = CGPointMake(1, 0); break; case 2: gradientLayer.startPoint = CGPointMake(0, 0); gradientLayer.endPoint = CGPointMake(1, 1); break; case 3: gradientLayer.startPoint = CGPointMake(1, 0); gradientLayer.endPoint = CGPointMake(0, 1); break; default: break; } return gradientLayer; } + (NSURL*)getImageUrlWithAddress:(NSString*)address{ if (address.length == 0) { return [NSURL URLWithString:@""]; } return [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@",[LCSaveData getImageUrl]?[LCSaveData getImageUrl]:BaseImgUrl,address]]; } + (void)kickBackToLogin{ [self changeRootToLogin]; } + (void)updateMessageUnread{ AppDelegate* app =(AppDelegate*)[UIApplication sharedApplication].delegate; if ([app.window.rootViewController isKindOfClass:[YOUPAILCTabBarVC class]]) { YOUPAILCTabBarVC* tabbar = (YOUPAILCTabBarVC*)app.window.rootViewController; [tabbar youpaifupdateUnread]; } } // 设置富文本 + (NSAttributedString *)setRichTextFormat:(NSArray *)richTextStyles{ NSMutableAttributedString *mAttibutedString = [[NSMutableAttributedString alloc] init]; for (YOUPAILZRichTextStyle *style in richTextStyles) { NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:style.text attributes:@{NSFontAttributeName:style.font, NSForegroundColorAttributeName:style.color}]; [mAttibutedString appendAttributedString:attributedString]; } return mAttibutedString; } + (NSAttributedString *)setRichTextWithTitle:(NSString *)title subTitle:(NSString *)subTitle titleColor:(UIColor *)titleColor subTitleColor:(UIColor *)subTitleColor titleFontSize:(CGFloat)size subTitleFontSize:(CGFloat)subSize { NSMutableAttributedString *mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size], NSForegroundColorAttributeName:titleColor}]; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:subTitle attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:subSize], NSForegroundColorAttributeName:subTitleColor}]; [mAttibutedString appendAttributedString:attributedString]; return mAttibutedString; } + (NSAttributedString *)setRichTextWithTitle:(NSString *)title subTitle:(NSString *)subTitle titleColor:(UIColor *)titleColor subTitleColor:(UIColor *)subTitleColor titleFontSize:(CGFloat)size subTitleFontSize:(CGFloat)subSize IsfirstFontBlod:(BOOL)isfirstFontBlod{ NSMutableAttributedString *mAttibutedString; if (isfirstFontBlod) { mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:LCBoldFont(size), NSForegroundColorAttributeName:titleColor}]; }else{ mAttibutedString = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size], NSForegroundColorAttributeName:titleColor}]; } NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:subTitle attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:subSize], NSForegroundColorAttributeName:subTitleColor}]; [mAttibutedString appendAttributedString:attributedString]; return mAttibutedString; } //// 行首缩进-行尾缩进 //+ (NSAttributedString *)attributedString:(NSAttributedString *)attrStr headIndent:(CGFloat)headIndent tailIndent:(CGFloat)tailIndent{ // NSMutableAttributedString *muattrStr = attrStr.mutableCopy; // NSMutableParagraphStyle *paraStyle01 = [[NSMutableParagraphStyle alloc] init]; // paraStyle01.headIndent = headIndent;//行首缩进 // paraStyle01.tailIndent = tailIndent;//行尾缩进 // [muattrStr addAttribute:NSParagraphStyleAttributeName value:paraStyle01 range:NSMakeRange(0, attrStr.length)]; // return muattrStr.copy; //} //数据统计转换 + (NSString*)integralChange:(NSInteger)integral{ if (integral>=10000) { NSInteger num=(int)floorf(integral/1000.0); return [NSString stringWithFormat:@"%.1f万",num/10.0]; }else{ return [NSString stringWithFormat:@"%zd",integral]; } } //切除边角 + (void)clipCorner:(UIRectCorner)corner View:(UIView*)view size:(CGSize)size { UIBezierPath* maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corner cornerRadii:size] ; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = view.bounds; maskLayer.path = maskPath.CGPath; view.layer.mask = maskLayer; } //返回初始化是否提示更新版本 + (BOOL)canShowNoticationTip{ NSString* updateTime = [LCSaveData getUpdateNotiTime]; NSDate * newData = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; if (!updateTime) { NSString* dataString = [dateFormatter stringFromDate:newData]; [LCSaveData saveUpdateNotiTime:dataString]; return YES; }else{ //获取与当前的时间差 NSDate *timeDate = [dateFormatter dateFromString:updateTime]; NSTimeInterval timeInterval = [timeDate timeIntervalSinceNow]; timeInterval = -timeInterval; //超过1天 if (timeInterval>60*60*24*1) { NSString* dataString = [dateFormatter stringFromDate:newData]; [LCSaveData saveUpdateNotiTime:dataString]; return YES; }else{ return NO; } } } //是否显示评分弹框 + (BOOL)canShowAppraise{ NSString* updateTime = [LCSaveData getAppraiseTime]; NSDate * newData = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; if (!updateTime) { NSString* dataString = [dateFormatter stringFromDate:newData]; [LCSaveData saveAppraiseTime:dataString]; return YES; }else{ //获取与当前的时间差 NSDate *timeDate = [dateFormatter dateFromString:updateTime]; NSTimeInterval timeInterval = [timeDate timeIntervalSinceNow]; timeInterval = -timeInterval; //超过30天 if (timeInterval>60*60*24*30) { NSString* dataString = [dateFormatter stringFromDate:newData]; [LCSaveData saveAppraiseTime:dataString]; return YES; }else{ return NO; } } } //设置阴影 + (void)setShadow:(CALayer*)layer Color:(UIColor*)color{ layer.shadowOpacity = 0.5; layer.shadowColor = color.CGColor; layer.shadowOffset = CGSizeMake(0, 5); layer.shadowRadius= 7; } + (NSString*)getCityIDWithCityName:(NSString*)name{ NSDictionary* cityDict = [LCSaveData getCityDict]; NSArray *keys = [cityDict allKeys]; for (int i = 0; i < keys.count; i++) { if ([cityDict[keys[i]] isEqualToString:name]) { return keys[i]; } } return @""; } + (NSString*)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding]; if([platform isEqualToString:@"iPhone1,1"]) return@"iPhone 2G"; if([platform isEqualToString:@"iPhone1,2"]) return@"iPhone 3G"; if([platform isEqualToString:@"iPhone2,1"]) return@"iPhone 3GS"; if([platform isEqualToString:@"iPhone3,1"]) return@"iPhone 4"; if([platform isEqualToString:@"iPhone3,2"]) return@"iPhone 4"; if([platform isEqualToString:@"iPhone3,3"]) return@"iPhone 4"; if([platform isEqualToString:@"iPhone4,1"]) return@"iPhone 4S"; if([platform isEqualToString:@"iPhone5,1"]) return@"iPhone 5"; if([platform isEqualToString:@"iPhone5,2"]) return@"iPhone 5"; if([platform isEqualToString:@"iPhone5,3"]) return@"iPhone 5c"; if([platform isEqualToString:@"iPhone5,4"]) return@"iPhone 5c"; if([platform isEqualToString:@"iPhone6,1"]) return@"iPhone 5s"; if([platform isEqualToString:@"iPhone6,2"]) return@"iPhone 5s"; if([platform isEqualToString:@"iPhone7,1"]) return@"iPhone 6 Plus"; if([platform isEqualToString:@"iPhone7,2"]) return@"iPhone 6"; if([platform isEqualToString:@"iPhone8,1"]) return@"iPhone 6s"; if([platform isEqualToString:@"iPhone8,2"]) return@"iPhone 6s Plus"; if([platform isEqualToString:@"iPhone8,4"]) return@"iPhone SE"; if([platform isEqualToString:@"iPhone9,1"]) return@"iPhone 7"; if([platform isEqualToString:@"iPhone9,2"]) return@"iPhone 7 Plus"; if([platform isEqualToString:@"iPhone9,4"]) return@"iPhone 7 Plus"; if([platform isEqualToString:@"iPhone10,1"]) return@"iPhone 8"; if([platform isEqualToString:@"iPhone10,4"]) return@"iPhone 8"; if([platform isEqualToString:@"iPhone10,2"]) return@"iPhone 8 Plus"; if([platform isEqualToString:@"iPhone10,5"]) return@"iPhone 8 Plus"; if([platform isEqualToString:@"iPhone10,3"]) return@"iPhone X"; if([platform isEqualToString:@"iPhone10,6"]) return@"iPhone X"; if([platform isEqualToString:@"iPhone11,8"])return@"iPhoneXR"; if([platform isEqualToString:@"iPhone11,2"])return@"iPhone XS"; if([platform isEqualToString:@"iPhone11,6"])return@"iPhone XS Max"; if([platform isEqualToString:@"iPhone12,1"])return@"iPhone 11"; if([platform isEqualToString:@"iPhone12,3"])return@"iPhone 11 Pro Max"; if([platform isEqualToString:@"iPhone12,5"])return@"iPhone 11 Pro"; if([platform isEqualToString:@"iPod1,1"]) return@"iPod Touch 1G"; if([platform isEqualToString:@"iPod2,1"]) return@"iPod Touch 2G"; if([platform isEqualToString:@"iPod3,1"]) return@"iPod Touch 3G"; if([platform isEqualToString:@"iPod4,1"]) return@"iPod Touch 4G"; if([platform isEqualToString:@"iPod5,1"]) return@"iPod Touch 5G"; if([platform isEqualToString:@"iPad1,1"]) return@"iPad 1G"; if([platform isEqualToString:@"iPad2,1"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,2"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,3"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,4"]) return@"iPad 2"; if([platform isEqualToString:@"iPad2,5"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad2,6"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad2,7"]) return@"iPad Mini 1G"; if([platform isEqualToString:@"iPad3,1"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,2"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,3"]) return@"iPad 3"; if([platform isEqualToString:@"iPad3,4"]) return@"iPad 4"; if([platform isEqualToString:@"iPad3,5"]) return@"iPad 4"; if([platform isEqualToString:@"iPad3,6"]) return@"iPad 4"; if([platform isEqualToString:@"iPad4,1"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,2"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,3"]) return@"iPad Air"; if([platform isEqualToString:@"iPad4,4"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,5"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,6"]) return@"iPad Mini 2G"; if([platform isEqualToString:@"iPad4,7"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad4,8"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad4,9"]) return@"iPad Mini 3"; if([platform isEqualToString:@"iPad5,1"]) return@"iPad Mini 4"; if([platform isEqualToString:@"iPad5,2"]) return@"iPad Mini 4"; if([platform isEqualToString:@"iPad5,3"]) return@"iPad Air 2"; if([platform isEqualToString:@"iPad5,4"]) return@"iPad Air 2"; if([platform isEqualToString:@"iPad6,3"]) return@"iPad Pro 9.7"; if([platform isEqualToString:@"iPad6,4"]) return@"iPad Pro 9.7"; if([platform isEqualToString:@"iPad6,7"]) return@"iPad Pro 12.9"; if([platform isEqualToString:@"iPad6,8"]) return@"iPad Pro 12.9"; if([platform isEqualToString:@"i386"]) return@"iPhone Simulator"; if([platform isEqualToString:@"x86_64"]) return@"iPhone Simulator"; return platform; } + (NSString *)getNetworkType_old { UIApplication *app = [UIApplication sharedApplication]; id statusBar = [app valueForKeyPath:@"statusBar"]; NSString *network = @""; if (Is_iPhoneX) { id statusBarView = [statusBar valueForKeyPath:@"statusBar"]; UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"]; NSArray *subviews = [[foregroundView subviews][2] subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) { network = @"WIFI"; }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) { network = [subview valueForKeyPath:@"originalText"]; } } }else { // 非 iPhone X UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"]; NSArray *subviews = [foregroundView subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue]; switch (networkType) { case 0: network = @"none"; break; case 1: network = @"2G"; break; case 2: network = @"3G"; break; case 3: network = @"4G"; break; case 5: network = @"WIFI"; break; default: break; } } } } if ([network isEqualToString:@""]) { network = @"none"; } return network; } + (NSString *)getNetworkType { //modify by leo -fix ios13 -20191008 UIApplication *app = [UIApplication sharedApplication]; // id statusBar = [app valueForKeyPath:@"statusBar"]; __block id statusBar = nil; __block NSString *network = @""; dispatch_async(dispatch_get_main_queue(), ^{ if (@available(iOS 13.0, *)) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager; if ([statusBarManager respondsToSelector:@selector(createLocalStatusBar)]) { UIView *_localStatusBar = [statusBarManager performSelector:@selector(createLocalStatusBar)]; if ([_localStatusBar respondsToSelector:@selector(statusBar)]) { statusBar = [_localStatusBar performSelector:@selector(statusBar)]; } } #pragma clang diagnostic pop if (statusBar) { // _UIStatusBarDataCellularEntry id currentData = [[statusBar valueForKeyPath:@"_statusBar"] valueForKeyPath:@"currentData"]; id _wifiEntry = [currentData valueForKeyPath:@"wifiEntry"]; id _cellularEntry = [currentData valueForKeyPath:@"cellularEntry"]; if (_wifiEntry && [[_wifiEntry valueForKeyPath:@"isEnabled"] boolValue]) { // If wifiEntry is enabled, is WiFi. network = @"WIFI"; } else if (_cellularEntry && [[_cellularEntry valueForKeyPath:@"isEnabled"] boolValue]) { NSNumber *type = [_cellularEntry valueForKeyPath:@"type"]; if (type) { switch (type.integerValue) { case 5: network = @"4G";; break; case 4: network = @"3G";; break; // case 1: // Return 1 when 1G. // break; case 0: // Return 0 when no sim card. network = @"none";; default: network = @"4G";; break; } } } } } else { statusBar = [app valueForKeyPath:@"statusBar"]; if (Is_iPhoneX) { id statusBarView = [statusBar valueForKeyPath:@"statusBar"]; UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"]; NSArray *subviews = [[foregroundView subviews][2] subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) { network = @"WIFI"; }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) { network = [subview valueForKeyPath:@"originalText"]; } } }else { // 非 iPhone X UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"]; NSArray *subviews = [foregroundView subviews]; for (id subview in subviews) { if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue]; switch (networkType) { case 0: network = @"none"; break; case 1: network = @"2G"; break; case 2: network = @"3G"; break; case 3: network = @"4G"; break; case 5: network = @"WIFI"; break; default: break; } } } } } }); if ([network isEqualToString:@""]) { network = @"none"; } return network; } +(void)checkUpdateNeedTip:(BOOL)need{ // NSOperationQueue * queue = [[NSOperationQueue alloc] init]; // [queue addOperation:[NSBlockOperation blockOperationWithBlock:^{ // NSDictionary* dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"https://img.caicaicp.cn/app/livechat.plist"]]; // if (dict) { // NSString* newVersion = [[[[dict objectForKey:@"items"] objectAtIndex:0] objectForKey:@"metadata"] objectForKey:@"bundle-version"]; // NSString* tip = [[[[dict objectForKey:@"items"] objectAtIndex:0] objectForKey:@"metadata"] objectForKey:@"tip"]; // NSString *myVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; // if (![newVersion isEqualToString:myVersion]) { // UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tip message:@"是否更新版本" preferredStyle:UIAlertControllerStyleAlert]; // [alertController addAction:[UIAlertAction actionWithTitle:@"不了" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { // // }]]; // [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"]]; // // }]]; // [[LCTools getCurrentVC] presentViewController:alertController animated:YES completion:nil]; // // }else{ // if (need) { // [ZCHUDHelper showTitle:@"已经是最新版本"]; // } // // } // } // }]]; } ///// 获取vip标记 //+ (UIImage *)getVipImageWithLevel:(NSInteger)level{ // NSString *str = [self getVipImageStringWithLevel:level]; // if (str != nil) { // return [UIImage imageNamed:str]; // }else{ // return nil; // } //} ///// 获取vip标记 带有VIP名字的图片 //+ (UIImage *)getVipNameImageWithLevel:(NSInteger)level{ // NSString *str = [self getVipImageStringWithLevel:level]; // if (str != nil) { // NSString *imgName = [NSString stringWithFormat:@"%@_name",str]; // return [UIImage imageNamed:imgName]; // }else{ // return nil; // } //} // ///// 获取vip标记 带有VIP名字的Size //+ (CGSize)getVipNameSizeWithLevel:(NSInteger)level{ // CGSize size; // switch (level) { // case 0: // size = CGSizeMake(79.0f, 20.0f); // break; // case 1: // size = CGSizeMake(79.0f, 20.0f); // break; // case 3: // size = CGSizeMake(79.0f, 20.0f); // break; // case 4: // size = CGSizeMake(85.0f, 24.0f); // break; // case 5: // size = CGSizeMake(90.0f, 25.5f); // break; // // default: // size = CGSizeZero; // break; // } // return size; //} // ///// 获取vip标记 带有VIP的Size //+ (CGSize)getVipSizeWithLevel:(NSInteger)level{ // CGSize size; // switch (level) { // case 0: // size = CGSizeMake(28.0f, 26.0f); // break; // case 1: // size = CGSizeMake(32.0f, 26.0f); // break; // case 3: // size = CGSizeMake(34.0f, 26.0f); // break; // case 4: // size = CGSizeMake(38.0f, 26.0f); // break; // case 5: // size = CGSizeMake(43.0f, 26.0f); // break; // // default: // size = CGSizeZero; // break; // } // return size; //} // //+ (NSString *)getVipImageStringWithLevel:(NSInteger)level{ // NSString *imgName = nil; // switch (level) { // case 0: // imgName = @"vqu_images_ic_vip_zj"; // break; // case 1: // imgName = @"vqu_images_ic_vip_bj"; // break; // case 3: // imgName = @"vqu_images_ic_vip_gj"; // break; // case 4: // imgName = @"vqu_images_ic_vip_gw"; // break; // case 5: // imgName = @"vqu_images_ic_vip_hd"; // break; // // default: // break; // } // return imgName; //} // ///// 获取vip飘窗背景颜色 //+ (NSArray *)getVipBgColorWithLevel:(NSInteger)level{ // NSArray *colors; // switch (level) { // case 0: // colors = @[HexColorFromRGB(0x5669EF),HexColorFromRGB(0xACB7FF)]; // break; // case 1: // colors = @[HexColorFromRGB(0xFF6DBB),HexColorFromRGB(0xFFB39A)]; // break; // case 3: // colors = @[HexColorFromRGB(0xFFCA71),HexColorFromRGB(0xFF6DBB)]; // break; // case 4: // colors = @[HexColorFromRGB(0xBAD2FF),HexColorFromRGB(0xFC7ABF)]; // break; // case 5: // colors = @[HexColorFromRGB(0xFF7070),HexColorFromRGB(0xFFCA71)]; // break; // // default: // colors = @[LCGradientTwoColor,LCGradientOneColor]; // break; // } // return colors; //} /// 获取VIP名字 + (NSString *)getVipNameWithLevel:(NSInteger)level{ NSString *name = nil; switch (level) { case 0: name = @"子爵贵族"; break; case 1: name = @"伯爵贵族"; break; case 3: name = @"公爵贵族"; break; case 4: name = @"国王贵族"; break; case 5: name = @"皇帝贵族"; break; default: name = @""; break; } return name; } /// 生成随机文件名 + (NSString *)randomFilename{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制 [formatter setDateFormat:@"YYYY_MM_dd_HH_mm_ss"]; //现在时间,你可以输出来看下是什么格式 NSDate *datenow = [NSDate date]; //----------将nsdate按formatter格式转成nsstring NSString *currentTimeString = [formatter stringFromDate:datenow]; NSString *filename = [NSString stringWithFormat:@"%@_%@",currentTimeString,[self randomNumberWithLength:6]]; return filename; } /// 生成随机数 /// @param length 长度 /// @return 随机数 + (NSString *)randomNumberWithLength:(NSInteger)length{ NSString *strRandom = @""; for(int i = 0; i < length; i ++){ strRandom = [strRandom stringByAppendingFormat:@"%i",(arc4random() % 9)]; } return strRandom; } + (UIImage *)createQRCodeImageHaveCenterIMG:(NSString *)codeStr centerIMG:(UIImage *)centerIMG { //1.生成coreImage框架中的滤镜来生产二维码 CIFilter *filter=[CIFilter filterWithName:@"CIQRCodeGenerator"]; [filter setDefaults]; [filter setValue:[codeStr dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"]; //4.获取生成的图片 CIImage *ciImg=filter.outputImage; //放大ciImg,默认生产的图片很小 //5.设置二维码的前景色和背景颜色 CIFilter *colorFilter=[CIFilter filterWithName:@"CIFalseColor"]; //5.1设置默认值 [colorFilter setDefaults]; [colorFilter setValue:ciImg forKey:@"inputImage"]; [colorFilter setValue:[CIColor colorWithRed:0 green:0 blue:0] forKey:@"inputColor0"]; [colorFilter setValue:[CIColor colorWithRed:1 green:1 blue:1] forKey:@"inputColor1"]; //5.3获取生存的图片 ciImg=colorFilter.outputImage; CGAffineTransform scale=CGAffineTransformMakeScale(10, 10); ciImg=[ciImg imageByApplyingTransform:scale]; // self.imgView.image=[UIImage imageWithCIImage:ciImg]; //6.在中心增加一张图片 UIImage *img=[UIImage imageWithCIImage:ciImg]; // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃 if (CGSizeEqualToSize(img.size, CGSizeZero)) { return nil; } //7.生存图片 //7.1开启图形上下文 UIGraphicsBeginImageContext(img.size); //7.2将二维码的图片画入 //BSXPCMessage received error for message: Connection interrupted why?? // [img drawInRect:CGRectMake(10, 10, img.size.width-20, img.size.height-20)]; [img drawInRect:CGRectMake(0, 0, img.size.width, img.size.height)]; //7.3在中心划入其他图片 UIImage *centerImg= centerIMG; CGFloat centerW= img.size.width*0.2; CGFloat centerH= img.size.width*0.2; CGFloat centerX=(img.size.width-centerW)*0.5; CGFloat centerY=(img.size.height -centerH)*0.5; [centerImg drawInRect:CGRectMake(centerX, centerY, centerW, centerH)]; //7.4获取绘制好的图片 UIImage *finalImg=UIGraphicsGetImageFromCurrentImageContext(); //7.5关闭图像上下文 UIGraphicsEndImageContext(); return finalImg; } #pragma mark-照片相关 -(void)readFromAlum:(id)viewController block:(ImageFinishBlock)ImageBlock { if ((YES == [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) ) { _imgblock = ImageBlock; _VC = viewController; UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; self.cameraUI = cameraUI; self.cameraUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; if (self.onlyShowImage) { self.cameraUI.mediaTypes = [NSArray arrayWithObjects:@"public.image", nil]; } else { self.cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypePhotoLibrary]; } [self.cameraUI setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; self.cameraUI.allowsEditing = YES; self.cameraUI.delegate = self; [viewController presentViewController:self.cameraUI animated:YES completion:nil]; } } -(void)readFromcamera:(id)viewController block:(ImageFinishBlock)ImageBlock { NSString *mediaType = AVMediaTypeVideo; AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType]; if(authStatus == AVAuthorizationStatusDenied){ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"相机权限" message:@"请在iPhone的\"设置->隐私->相机\"选项中,允许\"APP\"访问您的相机." delegate:nil cancelButtonTitle:@"好" otherButtonTitles:nil]; [alert show]; } if ((YES == [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) ) { _imgblock = ImageBlock; _VC = viewController; UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera]; cameraUI.allowsEditing =YES ; cameraUI.delegate = self; [viewController presentViewController:cameraUI animated:YES completion:nil]; } else{ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"打开照相机失败了" message:@"请检查照相机是否已损坏" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil]; [alert show]; } } #pragma mark UIImagePickerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; UIImage *originalImage, *editedImage; if ([mediaType isEqualToString:@"public.image"]){ NSLog(@" image == %@",info); editedImage = (UIImage *) [info objectForKey: UIImagePickerControllerEditedImage];//截图之后的 originalImage = (UIImage *) [info objectForKey: UIImagePickerControllerOriginalImage];//原图 // NSData *imageData= UIImageJPEGRepresentation(editedImage, 100); // NSData* imageData = UIImagePNGRepresentation(editedImage); // photoImageView.image = [UIImage imageWithData:imageData]; } if (_imgblock) { _imgblock(editedImage); } if (_originalImage) { _originalImage(originalImage); } [_VC dismissViewControllerAnimated: YES completion:nil]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [picker setNeedsStatusBarAppearanceUpdate]; [picker dismissViewControllerAnimated:YES completion:nil]; } + (CGFloat)widthWithString:(NSString *)string withFont:(UIFont *)font{ return [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:NULL].size.width; } +(NSDate *)stringToDate:(NSString *)dateStr:(BOOL)type { //type== yes (年月日) 否则年月 NSString *dateType; if (type) { dateType = @"yyyy-MM-dd"; }else{ dateType = @"yyyy-MM"; } NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:dateType]; NSDate *date = [dateFormatter dateFromString:dateStr]; return date; } //获取某月的最后一天字符串 +(NSString *)getMonthLastDayWithDate:(NSDate *)date format:(NSString *)aformat{     NSDate * newDate = date;     double interval = 0;     NSDate * firstDate = nil;     NSDate * lastDate = nil;     NSCalendar * calendar = [NSCalendar currentCalendar];     BOOL bl = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDate interval:&interval forDate:newDate];     if(bl) {         lastDate = [firstDate dateByAddingTimeInterval:interval -1];         NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc]init];         [myDateFormatter setDateFormat:aformat];         NSString * lastString = [myDateFormatter stringFromDate:lastDate];         return lastString;     }     return @""; } //获取某月的第一天字符串 +(NSString *)getMonthFirstDayWithDate:(NSDate *)date format:(NSString *)aformat{     NSDate * newDate = date;     double interval = 0;     NSDate * firstDate = nil;     NSCalendar * calendar = [NSCalendar currentCalendar];     BOOL bl = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDate interval:&interval forDate:newDate];     if(bl) {         NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc]init];         [myDateFormatter setDateFormat:aformat];         NSString * firstString = [myDateFormatter stringFromDate: firstDate];         return firstString;     }     return @""; } /** 是否属于同一月 @param time1 time1 @param time2 time2 @return 同一月为真,否则为假 */ + (BOOL)isInSameMonth:(int64_t)time1 time2:(int64_t)time2 { NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:time1]; NSDate *date2 = [NSDate dateWithTimeIntervalSince1970:time2]; NSCalendar *calendar = [NSCalendar currentCalendar]; int unit = NSCalendarUnitMonth | NSCalendarUnitYear; NSDateComponents *nowCmps = [calendar components:unit fromDate:date1]; NSDateComponents *selfCmps = [calendar components:unit fromDate:date2]; return (nowCmps.year == selfCmps.year)&&(nowCmps.month == selfCmps.month); } //openInstall的动态参数操作 +(void)saveBindData:(NSString*)bindData{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setValue:bindData forKey:@"bindData"]; [defaults synchronize]; } +(NSString*)getbindData{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *result = [defaults objectForKey:@"bindData"]; return result; } +(BOOL)isIdCard:(NSString *)idcard{ if(!idcard) return 0; NSString *regex = @"^[1-9]{1}[0-9]{16}([0-9]|[xX])$"; return [self predicateMatchWithString:idcard regex:regex]; } +(BOOL)predicateMatchWithString:(NSString *)str regex:(NSString *)regex{ NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; return [predicate evaluateWithObject:str]; } //openInstall的渠道编号操作 +(void)saveChannelCode:(NSString*)channelCode{ NSUserDefaults *defualts = [NSUserDefaults standardUserDefaults]; [defualts setValue:channelCode forKey:@"channelCode"]; [defualts synchronize]; } +(NSString*)getchannelCode{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *result = [defaults objectForKey:@"channelCode"]; return result; } + (BOOL)isGirlsRealNameAuthentication{ YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo; BOOL isGoddessCertified = [OCUserDefaults boolForKey:kIS_GODDESS_CERTIFIED]; if (userinfo.youpaipgender == 1){//女 if (isGoddessCertified) { return YES; }else{ @weakify(self) [self showAuthAlertWithConfirmBlock:^{ @strongify(self); YOUPAILCBigCastProtocolVC* vc = [[YOUPAILCBigCastProtocolVC alloc]init]; [vc setAgreeProtocolBlock:^{ @strongify(self); [self youpaifrealNameAuthentication]; }]; // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES]; [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES]; }]; return NO; } } return YES; } /// 是否实名认证 + (BOOL)isRealNameAuthentication{ YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo; if (userinfo.youpaipgender == 1){//女 BOOL isGoddessCertified = [OCUserDefaults boolForKey:kIS_GODDESS_CERTIFIED]; if (isGoddessCertified) { //是否通过女神认证 0未通过 1已通过 return YES; }else{ @weakify(self) [self showAuthAlertWithConfirmBlock:^{ @strongify(self); YOUPAILCBigCastProtocolVC *vc = [[YOUPAILCBigCastProtocolVC alloc]init]; [vc setAgreeProtocolBlock:^{ @strongify(self); [self youpaifrealNameAuthentication]; }]; [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES]; // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES]; }]; } }else{//男 // if (userinfo.youpaipis_auth == 1) { return YES; // }else{ // @weakify(self) // [self showAuthAlertWithConfirmBlock:^{ // @strongify(self); // YOUPAIRealPersonFaceVC *vc = [YOUPAIRealPersonFaceVC new]; // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES]; // }]; // } } return NO; } /// 去认证页面 + (void)goRealNamePage{ YOUPAILCBaseInfo *userinfo = [LCSaveModel getUserModel].youpaipuserinfo; if (userinfo.youpaipgender == 1){//女 @weakify(self); YOUPAILCBigCastProtocolVC* vc = [[YOUPAILCBigCastProtocolVC alloc]init]; [vc setAgreeProtocolBlock:^{ @strongify(self); [self youpaifrealNameAuthentication]; }]; // [[self getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES]; [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES]; }else{//男 YOUPAIRealPersonFaceVC *vc = [YOUPAIRealPersonFaceVC new]; [[LCTools getCurrentVC].navigationController pushViewController:vc animated:YES]; } } + (void)showAuthAlertWithConfirmBlock:(void(^)(void))block{ LZAlertAction *cancelAction = [LZAlertAction actionWithTitle:@"暂不认证" handler:^(LZAlertAction *action) { }]; cancelAction.cornerRadius = 24; cancelAction.bgColor = LZF5F4F7Color; cancelAction.color = LZ273145Color; LZAlertAction *confimAction = [LZAlertAction actionWithTitle:@"去认证" handler:^(LZAlertAction *action) { if (block != nil) { block(); } }]; confimAction.cornerRadius = 24.0f; confimAction.bgColor = [UIColor colorWithPatternImage:[LCTools ColorImage:CGSizeMake((KScreenWidth - 108.0f)/2, 48.0f) FromColors:@[LZBFB6FFColor,LZ7C69FEColor] ByGradientType:GradientLeftToRight]]; LZAlertWindow *alert = [LZAlertWindow alertWithTitle:@"真人认证" content:@"花蝶提倡真实交友,真人认证通过后即可心动交友啦~" action:@[cancelAction,confimAction]]; alert.contentTextAlignment = NSTextAlignmentCenter; [[LCTools getCurrentVC] TFPresentVC:alert completion:^{}]; } /// 阿里实名认证 + (void)youpaifrealNameAuthentication{ [UCAuthorityManager cameraAuthority:^{ YMCustomCameraViewModel *customCameraVM = [[YMCustomCameraViewModel alloc]initWithParams:@{}]; [YMRouter openURL:stringFormat(@"%@%@",YM_ROUTER_URL_PREFIX,YM_ROUTER_CUSTOM_CAMERA) withUserInfo:@{ RouterViewModel:customCameraVM } completion:nil]; } denied:^{ YMTipsPopupView *customView = [[YMTipsPopupView alloc]init]; [customView configutationWithTips:@"请在iphone的“设置-隐私-相机”选项中,允许APP访问您的相机。" TipsAlignment:NSTextAlignmentCenter IsHideTitle:NO IsHideSingleButton:NO]; YMPopupView *popupView = [YMPopupView initWithCustomView:customView parentView:[YMGlobalUtils getCurrentVC].view popStyle:YMPopupStyleFade dismissStyle:YMDismissStyleFade]; popupView.priority = 999; popupView.cornerRadius = adapt(10); popupView.rectCorners = UIRectCornerAllCorners; popupView.positionStyle = YMPositionStyleCenter; popupView.isHideBg = NO; popupView.bgAlpha = 0.3; @weakify(popupView) customView.buttonBlock = ^(BOOL isConfirm) { @strongify(popupView) if (isConfirm) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil]; } [popupView dismissWithStyle:YMDismissStyleFade duration:2.0]; }; [popupView pop]; }]; // @weakify(self); // [LCHttpHelper requestWithURLString:GetLiveVerifyToken parameters:@{} needToken:YES type:HttpRequestTypePost success:^(id responseObject) { // @strongify(self); // NSDictionary* dict = (NSDictionary*)responseObject; // NSInteger code = [[dict objectForKey:@"code"] integerValue]; // if (code == 0) { // NSString *token = dict[@"data"][@"VerifyToken"]; // NSString *BizId = dict[@"data"][@"BizId"]; // [self youpaifpushToAliSdk:token BizId:BizId]; // // }else{ // // [ZCHUDHelper showTitle:[dict objectForKey:@"message"]]; // } // // // // } failure:^(NSError *error) { // [ZCHUDHelper showTitle:error.localizedDescription]; // // }]; } + (void)youpaifpushToAliSdk:(NSString*)token BizId:(NSString*)bizIdStr{ RPConfiguration *configuration = [RPConfiguration configuration]; NSString *filePath1 = [[NSBundle mainBundle] pathForResource:@"RPCustomUI" ofType:@"bundle"]; configuration.customUIPath = filePath1; [RPSDK startWithVerifyToken:token viewController:[LCTools getContainNavigationControllerCurrentVC] configuration:configuration completion:^(RPResult * _Nonnull result) { NSLog(@"实人认证结果:%@==%@", result,result.message); switch (result.state) { case RPStatePass: // 认证通过。 [self youpaifpostBizId:bizIdStr]; break; case RPStateFail: // 认证不通过。 [ZCHUDHelper showTitle:@"认证失败,请重新认证"]; break; case RPStateNotVerify: // 未认证。 // 通常是用户主动退出或者姓名身份证号实名校验不匹配等原因导致。 // 具体原因可通过result.errorCode来区分(详见文末错误码说明表格)。 break; } }]; } + (void)youpaifpostBizId:(NSString*)ID{ NSMutableDictionary *dict = [NSMutableDictionary new]; [dict setObject:ID forKey:@"BizId"]; [LCHttpHelper requestWithURLString:LiveVerifyTokenSuccess parameters:dict needToken:YES type:HttpRequestTypePost success:^(id responseObject) { NSDictionary* dict = (NSDictionary*)responseObject; NSInteger code = [[dict objectForKey:@"code"] integerValue]; if (code == 0) { YOUPAILZLiveVerifyResultVC *vc = [[YOUPAILZLiveVerifyResultVC alloc] init]; vc.youpaipstate = LZLiveVerifyStateWithInReview; vc.youpaipcontent_str = [dict objectForKey:@"message"]; [[LCTools getContainNavigationControllerCurrentVC].navigationController pushViewController:vc animated:YES]; }else{ [ZCHUDHelper showTitle:[dict objectForKey:@"message"]]; } } failure:^(NSError *error) { [ZCHUDHelper showTitle:error.localizedDescription]; }]; } @end