| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284 |
- //
- // MOTools.m
- // MiMoLive
- //
- // Created by SuperC on 2023/10/9.
- //
- #import "MOTools.h"
- #import <UIKit/UIKit.h>
- #import <AdSupport/AdSupport.h>
- #import <SystemConfiguration/CaptiveNetwork.h>
- #import <sys/utsname.h>//要导入头文件
- #import "UIImage+YYAdd.h"
- #define kShowBindTime @"k_show_bing_phone_alert_time"
- #define kShowSignTime @"k_show_sign_alert_time"
- @implementation MOTools
- + (UIColor *)colorWithHexString:(NSString *)hexString {
- return [self colorWithHexString:hexString alpha:1.0];
- }
- + (UIColor *)colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha
- {
- if (hexString == nil)
- {
- return nil;
- }
- hexString = [hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
- hexString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
- hexString = [hexString stringByReplacingOccurrencesOfString:@"0x" withString:@""];
- NSRegularExpression *RegEx = [NSRegularExpression regularExpressionWithPattern:@"^[a-fA-F|0-9]{6}$" options:0 error:nil];
- NSUInteger match = [RegEx numberOfMatchesInString:hexString options:NSMatchingReportCompletion range:NSMakeRange(0, hexString.length)];
-
- if (match == 0)
- {
- return [UIColor clearColor];
- }
-
- NSString *rString = [hexString substringWithRange:NSMakeRange(0, 2)];
- NSString *gString = [hexString substringWithRange:NSMakeRange(2, 2)];
- NSString *bString = [hexString substringWithRange:NSMakeRange(4, 2)];
- unsigned int r, g, b;
- BOOL rValue = [[NSScanner scannerWithString:rString] scanHexInt:&r];
- BOOL gValue = [[NSScanner scannerWithString:gString] scanHexInt:&g];
- BOOL bValue = [[NSScanner scannerWithString:bString] scanHexInt:&b];
-
- if (rValue && gValue && bValue)
- {
- return [UIColor colorWithRed:((float)r/255.0f) green:((float)g/255.0f) blue:((float)b/255.0f) alpha:alpha];
- }
- else
- {
- return [UIColor clearColor];
- }
- }
- + (CGFloat)calculateRowHeight:(NSString *)string fontSize:(NSInteger)fontSize andWidth:(CGFloat)width
- {
- NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
- paragraphStyle.lineSpacing = 5;
- NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSParagraphStyleAttributeName:paragraphStyle};//指定字号
- CGRect rect = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT)/*计算高度要先指定宽度*/ options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
- return (rect.size.height+1);
- }
- + (CGFloat)calculateRowHeight:(NSString *)string font:(UIFont *)font andWidth:(CGFloat)width
- {
- NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
- paragraphStyle.lineSpacing = 5;
- NSDictionary *dic = @{NSFontAttributeName:font,NSParagraphStyleAttributeName:paragraphStyle};//指定字号
- CGRect rect = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT)/*计算高度要先指定宽度*/ options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
- return (rect.size.height+1);
- }
- + (CGFloat)calculateRowHeightNoLine:(NSString *)string font:(UIFont *)font andWidth:(CGFloat)width
- {
- NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
- paragraphStyle.lineSpacing = 1.0;
- NSDictionary *dic = @{NSFontAttributeName:font,NSParagraphStyleAttributeName:paragraphStyle};//指定字号
- CGRect rect = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT)/*计算高度要先指定宽度*/ options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
- return (rect.size.height+1);
- }
- + (CGFloat)calculateRowHeightNoLineSpacing:(NSString *)string fontSize:(NSInteger)fontSize andWidth:(CGFloat)width
- {
- NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]};//指定字号
- CGRect rect = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT)/*计算高度要先指定宽度*/ options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
- return (rect.size.height+1);
- }
- + (CGFloat)getWidthWithString:(NSString *)string font:(UIFont *)font
- {
- NSDictionary *attrs = @{NSFontAttributeName:font};
- CGFloat width = [string boundingRectWithSize:CGSizeZero options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width;
- return width;
- }
- //获取文字的尺寸
- + (CGSize)getSizeFrom:(NSString *)content font:(UIFont *)font maxSize:(CGSize)maxSize{
- if (!font || !content) {
- return CGSizeZero;
- }
- CGSize inSize = CGSizeZero;
- NSDictionary *attrs = @{NSFontAttributeName: font};
- CGSize nameMaxSize = maxSize;//最大宽高
-
- CGRect frame =[content boundingRectWithSize:nameMaxSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attrs context:nil];//options设置两个参数比较准确,NSStringDrawingTruncatesLastVisibleLine,如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略
- inSize = CGSizeMake(ceilf(frame.size.width), ceilf(frame.size.height));
- if (!isnormal(inSize.width)) {
- inSize.width = 0.0;
- }
- return inSize;
- }
- + (UIImage*)createImageWithColor:(UIColor*)color
- {
- CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
- UIGraphicsBeginImageContext(rect.size);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetFillColorWithColor(context, [color CGColor]);
- CGContextFillRect(context, rect);
- UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return theImage;
- }
- /**
- * 绘制渐变色的矩形UIImage
- *
- * @param bounds UIImage的bounds
- * @param colors 渐变色数组,可以设置两种颜色
- * @param gradientType 渐变的方式:0:水平渐变 1:竖直渐变 2:向下对角线渐变 3:向上对角线渐变
- *
- * @return 渐变色的UIImage
- */
- + (UIImage*)createGradientRectImageWithBounds:(CGRect)bounds
- Colors:(NSArray*)colors
- GradientType:(int)gradientType{
- NSMutableArray *cgcolorArr = [NSMutableArray array];
- for(UIColor *col in colors) {
- [cgcolorArr addObject:(id)col.CGColor];
- }
- UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 1);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSaveGState(context);
- CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]);
- CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)cgcolorArr, NULL);
- CGPoint startPoint = CGPointMake(0.0, 0.0);
- if (gradientType == 3) {
- startPoint = CGPointMake(0.0, bounds.size.height);
- }
- CGPoint endPoint = CGPointZero;
- switch (gradientType) {
- case 0:
- endPoint = CGPointMake(bounds.size.width, 0.0);
- break;
- case 1:
- endPoint = CGPointMake(0.0, bounds.size.height);
- break;
- case 2:
- endPoint = CGPointMake(bounds.size.width, bounds.size.height);
- break;
- case 3:
- endPoint = CGPointMake(bounds.size.width, 0.0);
- break;
- default:
- break;
- }
- CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- CGGradientRelease(gradient);
- CGContextRestoreGState(context);
- CGColorSpaceRelease(colorSpace);
- UIGraphicsEndImageContext();
- return image;
- }
- + (NSArray *)sortArrayByPinYin:(NSArray *)oldArray objectTextKeyPath:(NSString *)keyPath
- {
- if (oldArray == nil)
- {
- return nil;
- }
- else if (oldArray.count > 0)
- {
- id object = oldArray[0];
- if ([object isKindOfClass:[NSString class]] == NO && [[object valueForKey:keyPath?:@""] isKindOfClass:[NSString class]] == NO)
- {
- return nil;
- }
- }
-
- NSArray *array = [oldArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
- {
- NSString *str1 = obj1;
- NSString *str2 = obj2;
- if ([str1 isKindOfClass:[NSString class]] == NO)
- {
- str1 = [obj1 valueForKey:keyPath];
- }
- if ([str2 isKindOfClass:[NSString class]] == NO)
- {
- str2 = [obj2 valueForKey:keyPath];
- }
-
- NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;//加上数字排序,这样徐21会排在徐3后面
- NSLocale *chinaLocale = [NSLocale localeWithLocaleIdentifier:@"zh_CN"];//中国地区的本地化字符串排序才是按照拼音
- return [str1 compare:str2 options:comparisonOptions range:NSMakeRange(0, str1.length) locale:chinaLocale];//range.lenght不能是max(1.len, 2.len),因为如果str1的字符数比str2少时会崩溃,如果是min,则比较不准确,特别是数字比较时
- }];
- return array;
- }
- + (NSDictionary*)getDeviceInfo{
- NSString *macAddress = [MOTools getWiFiMACAddress];
-
- MOLogV(@"123123");
- NSDictionary *deviceInfo = @{
- // WiFi-Mac 地址
- @"WiFi-Mac": [[MOTools getWiFiMACAddress] description] ? [[MOTools getWiFiMACAddress] description] : @"",
-
- // 蓝牙-Mac 地址
- @"Bluetooth-Mac": @"",
-
- // UDID
- @"UDID": [[UIDevice currentDevice] identifierForVendor].UUIDString,
-
- // 操作系统及版本
- @"OS": [[UIDevice currentDevice] systemName],
- @"OSVersion": [[UIDevice currentDevice] systemVersion],
-
- // 品牌
- @"Brand": [[UIDevice currentDevice] model],
-
- // Apple-IDFA
- @"IDFA": [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString],
-
- // Apple-IDFV
- @"IDFV": [UIDevice currentDevice].identifierForVendor.UUIDString,
-
- // 像素比
- @"PixelRatio": @([[UIScreen mainScreen] scale]),
-
- // 型号
- @"Model": [[UIDevice currentDevice] model]
- };
- return deviceInfo;
- }
- + (NSString *)getWiFiMACAddress {
- NSArray *interfaces = CFBridgingRelease(CNCopySupportedInterfaces());
- id interfaceInfo = nil;
- for (NSString *interface in interfaces) {
- CFDictionaryRef networkInfo = CNCopyCurrentNetworkInfo((__bridge CFStringRef)interface);
- if (networkInfo) {
- interfaceInfo = (__bridge id)(networkInfo);
- CFRelease(networkInfo);
- }
- }
- return [interfaceInfo objectForKey:(__bridge NSString*)kCNNetworkInfoKeyBSSID];
- }
- + (NSString *)getDeviceString{
- struct utsname systemInfo;
- uname(&systemInfo);
-
- NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
- return platform;
- }
- + (NSString *)getCurrentDeviceModel
- {
- struct utsname systemInfo;
- uname(&systemInfo);
-
- NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
-
- //iPhone
- if ([platform isEqualToString:@"iPhone1,1"])
- {
- return @"iPhone 2G";
- }
- else if ([platform isEqualToString:@"iPhone1,2"])
- {
- return @"iPhone 3G";
- }
- else if ([platform isEqualToString:@"iPhone2,1"])
- {
- return @"iPhone 3GS";
- }
- else if ([platform isEqualToString:@"iPhone3,1"])
- {
- return @"iPhone 4";
- }
- else if ([platform isEqualToString:@"iPhone3,2"])
- {
- return @"iPhone 4";
- }
- else if ([platform isEqualToString:@"iPhone3,3"])
- {
- return @"iPhone 4";
- }
- else if ([platform isEqualToString:@"iPhone4,1"])
- {
- return @"iPhone 4S";
- }
- else if ([platform isEqualToString:@"iPhone5,1"])
- {
- return @"iPhone 5";
- }
- else if ([platform isEqualToString:@"iPhone5,2"])
- {
- return @"iPhone 5";
- }
- else if ([platform isEqualToString:@"iPhone5,3"])
- {
- return @"iPhone 5c";
- }
- else if ([platform isEqualToString:@"iPhone5,4"])
- {
- return @"iPhone 5c";
- }
- else if ([platform isEqualToString:@"iPhone6,1"])
- {
- return @"iPhone 5s";
- }
- else if ([platform isEqualToString:@"iPhone6,2"])
- {
- return @"iPhone 5s";
- }
- else if ([platform isEqualToString:@"iPhone7,2"])
- {
- return @"iPhone 6";
- }
- else if ([platform isEqualToString:@"iPhone7,1"])
- {
- return @"iPhone 6 Plus";
- }
- else if ([platform isEqualToString:@"iPhone8,1"])
- {
- return @"iPhone 6s";
- }
- else if ([platform isEqualToString:@"iPhone8,2"])
- {
- return @"iPhone 6s Plus";
- }
- else if ([platform isEqualToString:@"iPhone8,4"])
- {
- return @"iPhone SE";
- }
- else if ([platform isEqualToString:@"iPhone9,1"])
- {
- return @"iPhone 7";
- }
- else if ([platform isEqualToString:@"iPhone9,3"])
- {
- return @"iPhone 7";
- }
- else if ([platform isEqualToString:@"iPhone9,2"])
- {
- return @"iPhone 7 Plus";
- }
- else if ([platform isEqualToString:@"iPhone9,4"])
- {
- return @"iPhone 7 Plus";
- }
- else if ([platform isEqualToString:@"iPhone10,1"])
- {
- return @"iPhone 8";
- }
- else if ([platform isEqualToString:@"iPhone10,4"])
- {
- return @"iPhone 8";
- }
- else if ([platform isEqualToString:@"iPhone10,2"])
- {
- return @"iPhone 8 Plus";
- }
- else if ([platform isEqualToString:@"iPhone10,5"])
- {
- return @"iPhone 8 Plus (A1897)";
- }
- else if ([platform isEqualToString:@"iPhone10,3"])
- {
- return @"iPhone X";
- }
- else if ([platform isEqualToString:@"iPhone10,6"])
- {
- return @"iPhone X";
- }
- else if ([platform isEqualToString:@"iPhone11,2"])
- {
- return @"iPhone XS";
- }
- else if ([platform isEqualToString:@"iPhone11,4"])
- {
- return @"iPhone XS Max";
- }
- else if ([platform isEqualToString:@"iPhone11,6"])
- {
- return @"iPhone XS Max";
- }
- else if ([platform isEqualToString:@"iPhone11,8"])
- {
- return @"iPhone XR";
- }
- else if ([platform isEqualToString:@"iPhone12,1"])
- {
- return @"iPhone 11";
- }
- else if ([platform isEqualToString:@"iPhone12,3"])
- {
- return @"iPhone 11 Pro";
- }
- else if ([platform isEqualToString:@"iPhone12,5"])
- {
- return @"iPhone 11 Pro Max";
- }
- else if ([platform isEqualToString:@"iPhone12,8"])
- {
- return @"iPhone SE (2nd generation)";
- }
- else if ([platform isEqualToString:@"iPhone13,1"])
- {
- return @"iPhone 12 mini";
- }
- else if ([platform isEqualToString:@"iPhone13,2"])
- {
- return @"iPhone 12";
- }
- else if ([platform isEqualToString:@"iPhone13,3"])
- {
- return @"iPhone 12 Pro";
- }
- else if ([platform isEqualToString:@"iPhone13,4"])
- {
- return @"iPhone 12 Pro Max";
- }
- else if ([platform isEqualToString:@"iPhone14,4"])
- {
- return @"iPhone 13 mini";
- }
- else if ([platform isEqualToString:@"iPhone14,5"])
- {
- return @"iPhone 13";
- }
- else if ([platform isEqualToString:@"iPhone14,2"])
- {
- return @"iPhone 13 Pro";
- }
- else if ([platform isEqualToString:@"iPhone14,3"])
- {
- return @"iPhone 13 Pro Max";
- }
- else if ([platform isEqualToString:@"iPhone14,6"])
- {
- return @"iPhone SE (3rd generation)";
- }
- else if ([platform isEqualToString:@"iPhone14,7"])
- {
- return @"iPhone 14";
- }
- else if ([platform isEqualToString:@"iPhone14,8"])
- {
- return @"iPhone 14 Plus";
- }
- else if ([platform isEqualToString:@"iPhone15,3"])
- {
- return @"iPhone 14 Pro Max";
- }
- else if ([platform isEqualToString:@"iPhone15,2"])
- {
- return @"iPhone 14 Pro";
- }
- else if ([platform isEqualToString:@"iPhone15,4"])
- {
- return @"iPhone 15";
- }
- else if ([platform isEqualToString:@"iPhone15,5"])
- {
- return @"iPhone 15 Plus";
- }
- else if ([platform isEqualToString:@"iPhone16,1"])
- {
- return @"iPhone 15 Pro";
- }
- else if ([platform isEqualToString:@"iPhone16,2"])
- {
- return @"iPhone 15 Pro Max";
- }
-
- //iPad
- if ([platform isEqualToString:@"iPad1,1"])
- {
- return @"iPad";
- }
- 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:@"iPad3,1"])
- {
- return @"iPad (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad3,2"])
- {
- return @"iPad (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad3,3"])
- {
- return @"iPad (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad3,4"])
- {
- return @"iPad (4th generation)";
- }
- if ([platform isEqualToString:@"iPad3,5"])
- {
- return @"iPad (4th generation)";
- }
- if ([platform isEqualToString:@"iPad3,6"])
- {
- return @"iPad (4th generation)";
- }
- if ([platform isEqualToString:@"iPad6,11"])
- {
- return @"iPad (5th generation)";
- }
- if ([platform isEqualToString:@"iPad6,12"])
- {
- return @"iPad (5th generation)";
- }
- if ([platform isEqualToString:@"iPad7,5"])
- {
- return @"iPad (6th generation)";
- }
- if ([platform isEqualToString:@"iPad7,6"])
- {
- return @"iPad (6th generation)";
- }
- if ([platform isEqualToString:@"iPad7,11"])
- {
- return @"iPad (7th generation)";
- }
- if ([platform isEqualToString:@"iPad7,12"])
- {
- return @"iPad (7th generation)";
- }
- if ([platform isEqualToString:@"iPad11,6"])
- {
- return @"iPad (8th generation)";
- }
- if ([platform isEqualToString:@"iPad11,7"])
- {
- return @"iPad (8th generation)";
- }
- //iPad Air
- 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:@"iPad5,3"])
- {
- return @"iPad Air 2";
- }
- if ([platform isEqualToString:@"iPad5,4"])
- {
- return @"iPad Air 2";
- }
- if ([platform isEqualToString:@"iPad11,3"])
- {
- return @"iPad Air (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad11,4"])
- {
- return @"iPad Air (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad13,1"])
- {
- return @"iPad Air (4th generation)";
- }
- if ([platform isEqualToString:@"iPad13,2"])
- {
- return @"iPad Air (4th generation)";
- }
-
- //iPad mini
- if ([platform isEqualToString:@"iPad2,5"])
- {
- return @"iPad mini";
- }
- if ([platform isEqualToString:@"iPad2,6"])
- {
- return @"iPad mini";
- }
- if ([platform isEqualToString:@"iPad2,7"])
- {
- return @"iPad mini 1";
- }
- if ([platform isEqualToString:@"iPad4,4"])
- {
- return @"iPad mini 2";
- }
- if ([platform isEqualToString:@"iPad4,5"])
- {
- return @"iPad mini 2";
- }
- if ([platform isEqualToString:@"iPad4,6"])
- {
- return @"iPad mini 2";
- }
- 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:@"iPad11,1"])
- {
- return @"iPad mini 5";
- }
- if ([platform isEqualToString:@"iPad11,2"])
- {
- return @"iPad mini 5";
- }
-
- // iPad Pro
- if ([platform isEqualToString:@"iPad6,3"])
- {
- return @"iPad Pro (9.7-inch)";
- }
- if ([platform isEqualToString:@"iPad6,4"])
- {
- return @"iPad Pro (9.7-inch)";
- }
- if ([platform isEqualToString:@"iPad6,7"])
- {
- return @"iPad Pro (12.9-inch)";
- }
- if ([platform isEqualToString:@"iPad6,8"])
- {
- return @"iPad Pro (12.9-inch)";
- }
- if ([platform isEqualToString:@"iPad7,1"])
- {
- return @"iPad Pro (12.9-inch) (2nd generation)";
- }
- if ([platform isEqualToString:@"iPad7,2"])
- {
- return @"iPad Pro (12.9-inch) (2nd generation)";
- }
- if ([platform isEqualToString:@"iPad7,3"])
- {
- return @"iPad Pro (10.5 inch)";
- }
- if ([platform isEqualToString:@"iPad7,4"])
- {
- return @"iPad Pro (10.5-inch)";
- }
- if ([platform isEqualToString:@"iPad8,1"])
- {
- return @"iPad Pro (11-inch)";
- }
- if ([platform isEqualToString:@"iPad8,2"])
- {
- return @"iPad Pro (11-inch)";
- }
- if ([platform isEqualToString:@"iPad8,3"])
- {
- return @"iPad Pro (11-inch)";
- }
- if ([platform isEqualToString:@"iPad8,4"])
- {
- return @"iPad Pro (11-inch)";
- }
- if ([platform isEqualToString:@"iPad8,5"])
- {
- return @"iPad Pro (12.9-inch) (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad8,6"])
- {
- return @"iPad Pro (12.9-inch) (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad8,7"])
- {
- return @"iPad Pro (12.9-inch) (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad8,8"])
- {
- return @"iPad Pro (12.9-inch) (3rd generation)";
- }
- if ([platform isEqualToString:@"iPad8,9"])
- {
- return @"iPad Pro (11-inch) (2nd generation)";
- }
- if ([platform isEqualToString:@"iPad8,10"])
- {
- return @"iPad Pro (11-inch) (2nd generation)";
- }
- if ([platform isEqualToString:@"iPad8,11"])
- {
- return @"iPad Pro (12.9-inch) (4th generation)";
- }
- if ([platform isEqualToString:@"iPad8,12"])
- {
- return @"iPad Pro (12.9-inch) (4th generation)";
- }
-
- //iPod Touch
- if ([platform isEqualToString:@"iPod1,1"])
- {
- return @"iPod Touch";
- }
- if ([platform isEqualToString:@"iPod2,1"])
- {
- return @"iPod Touch 2";
- }
- if ([platform isEqualToString:@"iPod3,1"])
- {
- return @"iPod Touch 3";
- }
- if ([platform isEqualToString:@"iPod4,1"])
- {
- return @"iPod Touch 4)";
- }
- if ([platform isEqualToString:@"iPod5,1"])
- {
- return @"iPod Touch 5";
- }
- if ([platform isEqualToString:@"iPod7,1"])
- {
- return @"iPod Touch 6";
- }
- if ([platform isEqualToString:@"iPod9,1"])
- {
- return @"iPod Touch 7";
- }
- // Apple Watch
- if ([platform isEqualToString:@"Watch1,1"])
- {
- return @"Apple Watch";
- }
- if ([platform isEqualToString:@"Watch1,2"])
- {
- return @"Apple Watch";
- }
- if ([platform isEqualToString:@"Watch2,6"])
- {
- return @"Apple Watch Series 1";
- }
- if ([platform isEqualToString:@"Watch2,7"])
- {
- return @"Apple Watch Series 1";
- }
- if ([platform isEqualToString:@"Watch2,3"])
- {
- return @"Apple Watch Series 2";
- }
- if ([platform isEqualToString:@"Watch2,4"])
- {
- return @"Apple Watch Series 2";
- }
- if ([platform isEqualToString:@"Watch3,1"])
- {
- return @"Apple Watch Series 3";
- }
- if ([platform isEqualToString:@"Watch3,2"])
- {
- return @"Apple Watch Series 3";
- }
- if ([platform isEqualToString:@"Watch3,3"])
- {
- return @"Apple Watch Series 3";
- }
- if ([platform isEqualToString:@"Watch3,4"])
- {
- return @"Apple Watch Series 3";
- }
- // 模拟器
- if ([platform isEqualToString:@"i386"])
- {
- return @"iPhone Simulator";
- }
- if ([platform isEqualToString:@"x86_64"])
- {
- return @"iPhone Simulator";
- }
-
- return platform;
- }
- + (NSInteger)keepFirstDigitAndZeroOthersWith:(double)number{
- // 将数字转换为字符串
- NSString *numberString = [NSString stringWithFormat:@"%.f", number];
-
- // 如果数字只有一位,则直接返回
- if (numberString.length <= 1) {
- return number;
- }
-
- // 提取第一位数字
- NSString *firstDigitString = [numberString substringToIndex:1];
-
- // 生成结果字符串,其他位设为0
- NSString *resultString = [NSString stringWithFormat:@"%@%@", firstDigitString, [@"" stringByPaddingToLength:numberString.length - 1 withString:@"0" startingAtIndex:0]];
-
- // 将结果字符串转换为整数并返回
- return [resultString integerValue];
- }
- /// 将传入的数字进行模式化 - (大于1W -> 10000 , 小于1W大于1000, 则为1000, 如果小于1000则为具体数字)
- + (NSInteger)keepFirstZeroOthersWith:(double)number{
-
- if(number >= 10000){
- number = 10000;
- return number;
- }
-
- if(number >= 1000 && number <= 9999){
- number = 1000;
- return number;
- }
-
- return number;
- }
- /// 设置这一次弹出手机绑定弹窗设备的时间 */
- + (void)setTimeOfShowBindDevice:(NSDate *)time{
- [[MODataCache sharedYYCache] setObject:time forKey:kShowBindTime];
- }
- /// 获取上一次手机绑定弹窗的时间 */
- + (NSDate *)getTimeOfShowBind{
- return (NSDate *)[[MODataCache sharedYYCache] objectForKey:kShowBindTime];
- }
- + (void)setTimeOfShowSignDevice:(NSDate *)time{
- NSString *userId = GetUserId;
- if(userId.length == 0){
- userId = @"";
- }
- NSString *key = [NSString stringWithFormat:@"%@_%@",kShowSignTime,userId];
- [[MODataCache sharedYYCache] setObject:time forKey:key];
- }
- + (NSDate *)getTimeOfShowSign{
- NSString *userId = GetUserId;
- if(userId.length == 0){
- userId = @"";
- }
- NSString *key = [NSString stringWithFormat:@"%@_%@",kShowSignTime,userId];
- return (NSDate *)[[MODataCache sharedYYCache] objectForKey:key];
- }
- /** 是否时间过了一天 */
- + (BOOL)shouldShowAlertWithLastTime:(NSDate *)lastTime{
- BOOL showAlert = NO;
- NSDate *now = [NSDate date];
-
- MOLogV(@"now=%@(%lf), lastTime=%@(%lf)", now, now.timeIntervalSince1970, lastTime, lastTime.timeIntervalSince1970);
- if (now.timeIntervalSince1970 - lastTime.timeIntervalSince1970 > 24*60*60)
- {
- showAlert = YES;
- }
- else if (now.timeIntervalSince1970 > lastTime.timeIntervalSince1970)
- {
- NSCalendar *calendar = [NSCalendar currentCalendar];
- NSDateComponents *lastTimeComponents = [calendar components:NSCalendarUnitDay|NSCalendarUnitMonth fromDate:lastTime];
- NSDateComponents *nowComponents = [calendar components:NSCalendarUnitDay|NSCalendarUnitMonth fromDate:now];
- MOLogV(@"nowday=%d, lastTimeday=%d", (int)nowComponents.day, (int)lastTimeComponents.day);
- if (nowComponents.month == lastTimeComponents.month)
- {
- if (nowComponents.day > lastTimeComponents.day)
- {
- showAlert = YES;
- }
- }
- else
- {
- if (nowComponents.day < lastTimeComponents.day)
- {
- showAlert = YES;
- }
- }
- }
- return showAlert;
- }
- - (NSInteger)mo_nextDoubleAndMin:(NSInteger)min And:(NSInteger)max{
- self.seed = (self.seed * 9301 + 49297) % 233280;
-
- MOLogV(@"seed %zd",self.seed);
-
- double rnd = self.seed / (233280 * 1.0);
- NSInteger result = min + (NSInteger)(rnd * (max - min));
- return result;
- }
- + (UIViewController *)currentViewController
- {
- UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
-
- while (viewController) {
- if ([viewController isKindOfClass:[UITabBarController class]]) {
- UITabBarController *tbvc = (UITabBarController*)viewController;
- viewController = tbvc.selectedViewController;
- } else if ([viewController isKindOfClass:[UINavigationController class]]) {
- UINavigationController *nvc = (UINavigationController*)viewController;
- viewController = nvc.topViewController;
- } else if (viewController.presentedViewController) {
- viewController = viewController.presentedViewController;
- } else if ([viewController isKindOfClass:[UISplitViewController class]] &&
- ((UISplitViewController *)viewController).viewControllers.count > 0) {
- UISplitViewController *svc = (UISplitViewController *)viewController;
- viewController = svc.viewControllers.lastObject;
- } else {
- return viewController;
- }
- }
- return viewController;
- }
- /// 更新服务器时间的差值
- + (void)toUpdataTheRedSysTimeWith:(int64_t)sysTime{
- NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];
- NSTimeInterval nowStamp = [date timeIntervalSince1970]*1000;
- NSString *timeString = [NSString stringWithFormat:@"%.f", nowStamp];
- int64_t time = [timeString longLongValue] - sysTime;
-
- //因为是红包 时间误差, 所以误差为1秒内
- // 注意这里的time实际上包含了getSysTime接口的调用时长,不能简单理解为客户端与服务端的时间差
- // 实际上如果用户手动修改过系统时间,一般不会修改到秒级,所以我们认为time<=1000毫秒都是接口调用时长,不需要作时间校正
- if (llabs(time) <= 1000)
- {
- time = 0;
- }
-
- MOLogV(@"1sysTime---:%lld",time);
- [[NSUserDefaults standardUserDefaults]setObject:[NSNumber numberWithLongLong:time] forKey:kRedSysTime];
- [[NSUserDefaults standardUserDefaults] synchronize];
- }
- + (UIView *)containsViewOfClass:(Class)viewClass inView:(UIView *)view{
- // 检查当前视图是否是指定的类
- if ([view isKindOfClass:viewClass]) {
- return view;
- }
- // 递归检查所有子视图
- for (UIView *subview in view.subviews) {
- UIView *theView = [self containsViewOfClass:viewClass inView:subview];
- if (theView) {
- return theView;
- }
- }
- return nil;
- }
- //判断是否显示
- + (BOOL)toJudgeShowWame{
- BOOL isShow = NO;
- MOMeDataInfo *userInfoData = (MOMeDataInfo *)[[MODataCache sharedYYCache] objectForKey:kMineUserInfo];
- isShow = userInfoData.userStatusInfo.displayPlay;
-
- if(isShow){
- NSArray *tempArr = [[MOSvgaSourceManage shareManager].wameDataArr copy];
- if(tempArr.count < 2){
- isShow = NO;
- }
- }
-
- return isShow;
- }
- /// 获取并本地存储图片
- + (void)fetchAndStoreImageWithUrl:(NSString *)url completeBlock:(void (^)(UIImage *image))completeBlock {
- UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:url];
- if (cachedImage) {
- if (completeBlock) {
- completeBlock(cachedImage);
- }
- return;
- }
-
- [SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:url]
- options:SDWebImageDownloaderHighPriority
- progress:nil
- completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
- if (!image) {
- if (completeBlock) {
- completeBlock(nil);
- }
- return;
- }
-
- [[SDImageCache sharedImageCache] storeImage:image forKey:url completion:nil];
- if (completeBlock) {
- completeBlock(image);
- }
- }];
- }
- // 判断输入的字符串是否是有效的邮箱地址
- + (BOOL)isValidEmail:(NSString *)email {
- if (email.length == 0) {
- return NO;
- }
-
- // 更严格的邮箱正则表达式(RFC 5322 简化版)
- NSString *emailRegex = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,10}$";
-
- // 使用 NSPredicate 进行匹配
- NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
-
- return [emailPredicate evaluateWithObject:email];
- }
- + (NSString *)maskPhoneNumber:(NSString *)phoneNumber {
- if (phoneNumber.length <= 4) {
- return phoneNumber;
- }
- NSUInteger length = phoneNumber.length;
- NSUInteger maskLength = length - 4;
- NSString *mask = [@"" stringByPaddingToLength:maskLength withString:@"*" startingAtIndex:0];
- NSString *maskedPhoneNumber = [NSString stringWithFormat:@"%@%@%@",
- [phoneNumber substringToIndex:2],
- mask,
- [phoneNumber substringFromIndex:length - 2]];
- return maskedPhoneNumber;
- }
- + (NSString *)getValueWithKey:(NSString *)key urlString:(NSString *)urlString {
- NSURL *url = [NSURL URLWithString:urlString];
- return [self getValueWithKey:key url:url];
- }
- + (NSString *)getValueWithKey:(NSString *)key url:(NSURL *)url {
- if (!url) {
- return nil;
- }
-
- NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
- NSArray<NSURLQueryItem *> *queryItems = components.queryItems;
-
- for (NSURLQueryItem *item in queryItems) {
- if ([item.name isEqualToString:key]) {
- return item.value;
- }
- }
-
- return nil;
- }
- //字典转json格式字符串:
- + (NSString *)dictionaryToJson:(NSDictionary *)dic {
- NSError *parseError = nil;
- NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
-
- return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
- }
- //json格式字符串转字典:
- + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
- if (jsonString == nil || jsonString.length == 0) {
- return nil;
- }
-
- NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
- NSError *err;
- NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
- options:NSJSONReadingMutableContainers
- error:&err];
- if(err) {
- MOLogV(@"json解析失败:%@",err);
- return nil;
-
- }
- return dic;
- }
- //根据VIP 类型 和 尺寸 生成对应的图片
- + (UIImage *)getVipImgIconWith:(NSInteger)type AndSize:(CGSize)size{
- UIImage *theVipIcon = [UIImage imageNamed:@"v_2_vip_1_282"];
- switch (type) {
- case 1:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_1_282"];
- }
- break;
- case 2:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_2_282"];
- }
- break;
- case 3:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_3_282"];
- }
- break;
- case 4:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_4_282"];
- }
- break;
- case 5:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_5_282"];
- }
- break;
- case 6:{
- theVipIcon = [UIImage imageNamed:@"v_2_vip_6_282"];
- }
- break;
-
- default:
- break;
- }
-
- if(size.width > 0 && size.height > 0){
- theVipIcon = [theVipIcon imageByResizeToSize:size contentMode:UIViewContentModeScaleAspectFit];
- }
-
- return theVipIcon;
- }
- //根据道具分类, 拿分类图片
- + (UIImage *)toGetThePropsTypeWith:(NSInteger)type{
- //道具分类\n * 1: 头饰\n * 2: 气泡\n * 3: 入场座驾(旧:进场条)\n * 4: 名片框\n * 5: 直播徽章\n * 6: 用户徽章\n * 7: 进场条(旧:进场飘屏)\n * 8: 打赏横幅\n * 9: 连麦边框\n * 10: 直播弹幕
-
- UIImage *theImage = nil;
-
- switch (type) {
- case 1:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_1"];
- }
- break;
- case 2:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_2"];
- }
- break;
- case 3:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_3"];
- }
- break;
- case 4:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_4"];
- }
- break;
- case 7:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_7"];
- }
- break;
- case 8:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_8"];
- }
- break;
- case 9:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_9"];
- }
- break;
- case 10:
- {
- theImage = [UIImage imageNamed:@"v_2_prop_type_10"];
- }
- break;
-
- default:
- break;
- }
-
- return theImage;
-
- }
- + (BOOL)isStringArrayContentEqualIgnoringOrder:(NSArray<NSString *> *)array1 array2:(NSArray<NSString *> *)array2 {
- NSSet *set1 = [NSSet setWithArray:array1];
- NSSet *set2 = [NSSet setWithArray:array2];
- return [set1 isEqualToSet:set2];
- }
- + (NSString *)generateUniqueID {
- // 当前时间戳(到毫秒)
- NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970] * 1000;
-
- // 随机数(0~999)
- int random = arc4random_uniform(1000);
-
- // 拼接成唯一ID
- NSString *uniqueID = [NSString stringWithFormat:@"ID_%.0f_%03d", timeStamp, random];
-
- return uniqueID;
- }
- /// 退出键盘
- + (void)dismissKeyboard {
- for (UIWindowScene *scene in [UIApplication sharedApplication].connectedScenes) {
- if (scene.activationState == UISceneActivationStateForegroundActive) {
- for (UIWindow *window in scene.windows) {
- if (window.isKeyWindow) {
- [window endEditing:YES];
- return;
- }
- }
- }
- }
- }
- /// 超出指定长度替换成...
- /// - Parameters:
- /// - string: 字符串
- /// - maxLength: 最大长度
- + (NSString *)trimString:(NSString *)string maxLength:(NSInteger)maxLength {
- if (string.length <= maxLength) {
- return string;
- } else {
- return [[string substringToIndex:maxLength] stringByAppendingString:@"..."];
- }
- }
- + (NSString *)timeAgoStringFromTimeStamp:(NSTimeInterval)timeStamp {
-
- if (timeStamp > [[NSDate date] timeIntervalSince1970] * 10) {
- timeStamp = timeStamp / 1000.0;
- }
-
- NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
- NSTimeInterval diff = now - timeStamp;
- if (diff < 60) {
- return NSLocalString(@"B20044");
- } else {
- NSInteger minutes = diff / 60;
- return [NSString stringWithFormat:NSLocalString(@"B20045"),minutes];
- }
- }
- @end
|