iTools.m 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300
  1. //
  2. // iTools.m
  3. // VclustersGemini
  4. //
  5. // Created by 余衡武 on 2020/4/1.
  6. // Copyright © 2020 APPLE. All rights reserved.
  7. //
  8. #import "iTools.h"
  9. #import "CommonCrypto/CommonDigest.h"
  10. #import <CommonCrypto/CommonCrypto.h>
  11. #import "RSA.h"
  12. static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  13. /* 运营商 首先需要引入以下两个系统类:*/
  14. #import <CoreTelephony/CTCarrier.h>
  15. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  16. @implementation iTools
  17. + (NSString *)getJSONStringFromDictionary:(NSDictionary *)dict {
  18. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
  19. NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  20. return jsonStr;
  21. }
  22. + (NSString *)getJSONStringFromArray:(NSArray *)array {
  23. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
  24. NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  25. return jsonStr;
  26. }
  27. + (NSInteger)getNowTimeStamp {
  28. return [[NSDate date] timeIntervalSince1970];
  29. }
  30. + (NSInteger)getNowTimeStampSS {
  31. NSDate *dateValue = [NSDate date];
  32. NSTimeInterval second = [dateValue timeIntervalSince1970];
  33. long long dTime = [[NSNumber numberWithDouble:second*1000] longLongValue];
  34. return dTime;
  35. }
  36. /** 获取当前时间戳-以秒为单位-return yyyyy年MM月dd日 HH:mm:ss */
  37. + (NSString *)getNowTimeString1 {
  38. NSDate *nowDate = [NSDate date];
  39. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  40. [format setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
  41. NSString *dateStr = [format stringFromDate:nowDate];
  42. return dateStr;
  43. }
  44. /** 获取当前时间戳-以秒为单位-return yyyyy-MM-dd HH:mm:ss */
  45. + (NSString *)getNowTimeString2 {
  46. NSDate *nowDate = [NSDate date];
  47. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  48. [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  49. NSString *dateStr = [format stringFromDate:nowDate];
  50. return dateStr;
  51. }
  52. + (NSString *)getNowTimeString3 {
  53. NSDate *nowDate = [NSDate date];
  54. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  55. [format setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
  56. NSString *dateStr = [format stringFromDate:nowDate];
  57. return dateStr;
  58. }
  59. + (NSInteger)getNowTimeStampToInterval:(NSTimeInterval)second {
  60. long long dTime = [[NSNumber numberWithDouble:second*1000] longLongValue];
  61. return dTime;
  62. }
  63. + (NSString *)getNowTimeStampString {
  64. NSString* date;
  65. NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
  66. [formatter setDateFormat:@"YYYYMMddhhmmssSSS"];
  67. date = [formatter stringFromDate:[NSDate date]];
  68. NSString *timeNow = [NSString stringWithFormat:@"%@", date];
  69. return timeNow;
  70. }
  71. + (NSString *)getNowTimeString {
  72. NSDate *nowDate = [NSDate date];
  73. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  74. [format setDateFormat:@"yyyy/MM/dd HH:mm"];
  75. NSString *dateStr = [format stringFromDate:nowDate];
  76. return dateStr;
  77. }
  78. + (NSString *)getNowDateString {
  79. NSDate *nowDate = [NSDate date];
  80. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  81. [format setDateFormat:@"yyyy-MM-dd"];
  82. NSString *dateStr = [format stringFromDate:nowDate];
  83. return dateStr;
  84. }
  85. + (NSString *)getTimeStringFromTimeInterval:(NSInteger)timeInterval {
  86. NSDate *date = [[NSDate alloc]initWithTimeIntervalSince1970:timeInterval];
  87. NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
  88. [formatter setDateFormat:@"yyyy/MM/dd HH:mm"];
  89. NSString *timeString = [formatter stringFromDate:date];
  90. return timeString;
  91. }
  92. + (NSDate *)getTimeStringToDate:(NSString *)timeStr{
  93. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  94. //需要设置为和字符串相同的格式
  95. [dateFormatter setDateFormat:@"YYYYMMddhhmmssSSS"];
  96. NSDate *localDate = [dateFormatter dateFromString:timeStr];
  97. return localDate;
  98. }
  99. + (NSString *)getPlayTimeStringFromTimeInterval:(NSTimeInterval)timeInterval {
  100. NSInteger seconds = timeInterval;
  101. //format of hour
  102. NSString *str_hour = [NSString stringWithFormat:@"%02ld",seconds/3600];
  103. //format of minut
  104. NSString *str_minute = [NSString stringWithFormat:@"%02ld",(seconds%3600)/60];
  105. //format of second
  106. NSString *str_second = [NSString stringWithFormat:@"%02ld",seconds%60];
  107. //format of time
  108. NSString *format_time = [NSString stringWithFormat:@"%@:%@:%@",str_hour,str_minute,str_second];
  109. return format_time;
  110. }
  111. /** 把字符串转时间戳Date YYYYMMddhhmmssSSS 2024-05-24 20:44:57 返回 x天 多少时 多少分*/
  112. + (NSString *)getTimeStringToExpirationDate:(NSString *)timeStr
  113. {
  114. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  115. //需要设置为和字符串相同的格式
  116. [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];;
  117. NSDate *localDate = [dateFormatter dateFromString:timeStr];
  118. NSTimeInterval ExpSecond = [localDate timeIntervalSince1970];
  119. NSTimeInterval curSecond = [[NSDate date] timeIntervalSince1970];
  120. NSTimeInterval curSecond2 = ExpSecond - curSecond;
  121. NSInteger validSecond = (NSInteger)curSecond2;
  122. NSInteger daySecond = 60*60*24;
  123. NSInteger hourSecond = 60*60;
  124. NSInteger minSecond = 60;
  125. if(validSecond >= daySecond){
  126. NSInteger day = validSecond/daySecond;
  127. // if(validSecond % daySecond >0){
  128. // day += 1;
  129. // }
  130. NSString *tipStr = NSLocalizedString(@"copy_share_link_Invalid_tip2",nil);
  131. return [[NSString alloc] initWithFormat:@"%ld%@%@",day,NSLocalizedString(@"share_expiration_date_unit_day_tip",nil),tipStr];
  132. }
  133. else if(validSecond >= hourSecond){
  134. NSInteger day = validSecond/hourSecond;
  135. // if(validSecond % daySecond >0){
  136. // day += 1;
  137. // }
  138. NSString *tipStr = NSLocalizedString(@"copy_share_link_Invalid_tip2",nil);
  139. return [[NSString alloc] initWithFormat:@"%ld%@%@",day,NSLocalizedString(@"share_expiration_date_unit_hour_tip",nil),tipStr];
  140. }
  141. else if(validSecond >= minSecond){
  142. NSInteger day = validSecond/minSecond;
  143. // if(validSecond % daySecond >0){
  144. // day += 1;
  145. // }
  146. NSString *tipStr = NSLocalizedString(@"copy_share_link_Invalid_tip2",nil);
  147. return [[NSString alloc] initWithFormat:@"%ld%@%@",day,NSLocalizedString(@"share_expiration_date_unit_min_tip",nil),tipStr];
  148. }
  149. else if(validSecond <0){
  150. return NSLocalizedString(@"copy_share_link_Invalid_tip",nil);
  151. }
  152. return [[NSString alloc] initWithFormat:@"1%@",NSLocalizedString(@"share_expiration_date_unit_min_tip",nil)];
  153. }
  154. //ypp add 通讯录文件名格式YmdHis+随机数字(1000~9999) 2020 07 07 15 08 25 1000
  155. + (NSString *)getContactsNameStr {
  156. NSString* date;
  157. NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
  158. [formatter setDateFormat:@"YYYYMMddhhmmss"];
  159. date = [formatter stringFromDate:[NSDate date]];
  160. int randomNumber = (int) arc4random_uniform(9999) + 1000;
  161. NSString *contactsNameStr = [NSString stringWithFormat:@"%@%d",date,randomNumber];
  162. return contactsNameStr;
  163. }
  164. + (UIImage*)createImageWithColor:(UIColor *)color
  165. {
  166. CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  167. UIGraphicsBeginImageContext(rect.size);
  168. CGContextRef context = UIGraphicsGetCurrentContext();
  169. CGContextSetFillColorWithColor(context, [color CGColor]);
  170. CGContextFillRect(context, rect);
  171. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  172. UIGraphicsEndImageContext();
  173. return image;
  174. }
  175. + (UIImage *)imageFromColor:(UIColor *)color view:(UIView *)view {
  176. CGRect rect = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height);
  177. UIGraphicsBeginImageContext(rect.size);
  178. CGContextRef context = UIGraphicsGetCurrentContext();
  179. CGContextSetFillColorWithColor(context, [color CGColor]);
  180. CGContextFillRect(context, rect);
  181. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  182. UIGraphicsEndImageContext();
  183. return img;
  184. }
  185. + (UIImage *)getImageFromColor:(UIColor *)color rect:(CGRect)rect {
  186. UIGraphicsBeginImageContext(rect.size);
  187. CGContextRef context = UIGraphicsGetCurrentContext();
  188. CGContextSetFillColorWithColor(context, [color CGColor]);
  189. CGContextFillRect(context, rect);
  190. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  191. UIGraphicsEndImageContext();
  192. return img;
  193. }
  194. /**将UIColor变换为UIImage,设置尺寸**/
  195. + (UIImage *)createImageWithColor:(UIColor *)color withSize:(CGSize)size {
  196. CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
  197. UIGraphicsBeginImageContextWithOptions(rect.size,NO,[UIScreen mainScreen].scale);
  198. CGContextRef context = UIGraphicsGetCurrentContext();
  199. CGContextSetFillColorWithColor(context, [color CGColor]);
  200. CGContextFillRect(context, rect);
  201. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  202. UIGraphicsEndImageContext();
  203. return theImage;
  204. }
  205. /**将文件大小B 自动转成对应的B KB MB GB**/
  206. + (NSString *)getFileSizeStringFormedValue:(NSInteger)value
  207. {
  208. double convertedValue = value*1.0;
  209. int multiplyFactor = 0;
  210. NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil];
  211. while (convertedValue > 1024 && multiplyFactor < tokens.count) {
  212. convertedValue /= 1024;
  213. multiplyFactor++;
  214. }
  215. NSString *text = [NSString stringWithFormat:@"%4.2f%@",convertedValue, [tokens objectAtIndex:multiplyFactor]];
  216. if ([text isEqualToString:@"0.00B"]) {
  217. text = @"0B";
  218. }
  219. return text;
  220. }
  221. +(BOOL)getBoolWithKey:(NSString*)key{
  222. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  223. return [defaults boolForKey:key];
  224. }
  225. +(void)setBoolWithKey:(NSString*)key value:(BOOL)value{
  226. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  227. [defaults setBool:value forKey:key];
  228. [defaults synchronize];
  229. }
  230. +(NSString*)getStringWithKey:(NSString*)key{
  231. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  232. return [defaults stringForKey:key];
  233. }
  234. +(void)setStringWithKey:(NSString*)key value:(NSString*)value{
  235. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  236. [defaults setObject:value forKey:key];
  237. [defaults synchronize];
  238. }
  239. +(NSInteger)getIntegerWithKey:(NSString*)key{
  240. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  241. return [defaults integerForKey:key];
  242. }
  243. +(void)setIntegerWithKey:(NSString*)key value:(NSInteger)value{
  244. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  245. [defaults setInteger:value forKey:key];
  246. [defaults synchronize];
  247. }
  248. + (NSString *)notRounding:(float)price afterPoint:(int)position {
  249. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  250. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  251. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  252. return [NSString stringWithFormat:@"%@%%",roundedOunces];
  253. }
  254. + (CGFloat)notRoundingFloat:(float)price afterPoint:(int)position {
  255. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  256. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  257. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  258. return [roundedOunces floatValue];
  259. }
  260. + (NSString *)formatFloat:(float)f
  261. {
  262. if (fmodf(f, 1)==0) {//如果有一位小数点
  263. return [NSString stringWithFormat:@"%.0f",f];
  264. } else if (fmodf(f*10, 1)==0) {//如果有两位小数点
  265. return [NSString stringWithFormat:@"%.1f",f];
  266. } else {
  267. return [NSString stringWithFormat:@"%.2f",f];
  268. }
  269. }
  270. /**
  271. 获取运营商名称
  272. */
  273. + (NSString *)getCarrierInfo
  274. {
  275. CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
  276. CTCarrier *carrier = nil;
  277. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.1) {
  278. if ([telephonyInfo respondsToSelector:@selector(serviceSubscriberCellularProviders)]) {
  279. #pragma clang diagnostic push
  280. #pragma clang diagnostic ignored "-Wunguarded-availability-new"
  281. NSDictionary *dic = [telephonyInfo serviceSubscriberCellularProviders];
  282. if (dic.allKeys.count) {
  283. carrier = [dic objectForKey:dic.allKeys[0]];
  284. }
  285. #pragma clang diagnostic pop
  286. }
  287. }
  288. if(!carrier) {
  289. //遇到的 warning 又明知干不掉的时候就用这种方法隐藏即可,-Wdeprecated-declarations
  290. #pragma clang diagnostic push
  291. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  292. carrier = telephonyInfo.subscriberCellularProvider;
  293. #pragma clang diagnostic pop
  294. }
  295. //countryCode,移动国家码,MCC的资源由国际电联(ITU)统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460;
  296. NSString *countryCode = [carrier mobileCountryCode];
  297. //code,移动网络码,共2位,中国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001
  298. NSString *code = [carrier mobileNetworkCode];
  299. //网络运营商的名字
  300. NSString *carrier_name = @"";
  301. //用户运营商网络 (中国电信:CHINANET,中国联通:UNICOM,中国移动:CMNET,中国铁通:CRTC,中国广电:GCABLENET)
  302. if ([countryCode isEqualToString:@"460"] && countryCode && code) {
  303. if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"04"] || [code isEqualToString:@"07"] || [code isEqualToString:@"08"]|| [code isEqualToString:@"13"]) {
  304. carrier_name = @"CMNET";
  305. }
  306. else if ([code isEqualToString:@"03"] || [code isEqualToString:@"05"] || [code isEqualToString:@"11"] || [code isEqualToString:@"12"])
  307. {
  308. carrier_name = @"CHINANET";
  309. }
  310. else if ([code isEqualToString:@"01"] || [code isEqualToString:@"06"] || [code isEqualToString:@"09"] || [code isEqualToString:@"10"])
  311. {
  312. carrier_name = @"UNICOM";
  313. }
  314. else if ([code isEqualToString:@"20"])
  315. {
  316. carrier_name = @"CRTC";
  317. }
  318. else if ([code isEqualToString:@"15"])
  319. {
  320. carrier_name = @"GCABLENET";
  321. }
  322. }
  323. return carrier_name;
  324. }
  325. // 去除字符串中所有的空格和换行符(包括中间和首尾)
  326. + (NSString *)removeSpaceAndNewline:(NSString *)str
  327. {
  328. NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
  329. temp = [temp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
  330. temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
  331. temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
  332. return temp;
  333. }
  334. #pragma mark 加密/解密(AES RSA base64 md5)
  335. // AES加密
  336. + (NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key
  337. {
  338. char keyPtr[kCCKeySizeAES128+1];
  339. memset(keyPtr, 0, sizeof(keyPtr));
  340. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  341. NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  342. NSUInteger dataLength = [data length];
  343. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  344. void *buffer = malloc(bufferSize);
  345. size_t numBytesEncrypted = 0;
  346. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  347. kCCAlgorithmAES128,
  348. kCCOptionPKCS7Padding|kCCOptionECBMode,
  349. keyPtr,
  350. kCCBlockSizeAES128,
  351. NULL,
  352. [data bytes],
  353. dataLength,
  354. buffer,
  355. bufferSize,
  356. &numBytesEncrypted);
  357. if (cryptStatus == kCCSuccess) {
  358. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  359. return [resultData base64EncodedStringWithOptions:(NSDataBase64Encoding64CharacterLineLength)];
  360. }
  361. free(buffer);
  362. return nil;
  363. }
  364. //AES解密
  365. + (NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key
  366. {
  367. char keyPtr[kCCKeySizeAES128 + 1];
  368. memset(keyPtr, 0, sizeof(keyPtr));
  369. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  370. NSData *data = [[NSData alloc] initWithBase64EncodedString:encryptText options:NSDataBase64DecodingIgnoreUnknownCharacters];//base64解码
  371. NSUInteger dataLength = [data length];
  372. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  373. void *buffer = malloc(bufferSize);
  374. size_t numBytesCrypted = 0;
  375. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  376. kCCAlgorithmAES128,
  377. kCCOptionPKCS7Padding|kCCOptionECBMode,
  378. keyPtr,
  379. kCCBlockSizeAES128,
  380. NULL,
  381. [data bytes],
  382. dataLength,
  383. buffer,
  384. bufferSize,
  385. &numBytesCrypted);
  386. if (cryptStatus == kCCSuccess) {
  387. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  388. return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
  389. }
  390. free(buffer);
  391. return nil;
  392. }
  393. /**RSA加密-publicKey-公钥*/
  394. + (NSString *)RSAEncrypt:(NSString *)plainText key:(NSString *)publicKey {
  395. NSString *encrypted = [RSA encryptString:plainText publicKey:publicKey];
  396. return encrypted;
  397. }
  398. /**RSA解密-privateKey-私钥*/
  399. + (NSString *)RSADecrypt:(NSString *)encryptText key:(NSString *)privateKey {
  400. NSString *decrypted = [RSA decryptString:encryptText privateKey:privateKey];
  401. return decrypted;
  402. }
  403. /**Base64加密*/
  404. + (NSString *)Base64Encrypt:(NSString *)plainText {
  405. NSData *data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  406. return [data base64EncodedStringWithOptions:0];
  407. }
  408. /**base64解密*/
  409. + (NSString *)Base64Decrypt:(NSString *)encryptText {
  410. NSData *data = [self dataWithBase64EncodedString:encryptText];
  411. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  412. }
  413. /**base64格式字符串转换为文本数据*/
  414. + (NSData *)dataWithBase64EncodedString:(NSString *)string
  415. {
  416. if (string == nil)
  417. [NSException raise:NSInvalidArgumentException format:@""];
  418. if ([string length] == 0)
  419. return [NSData data];
  420. static char *decodingTable = NULL;
  421. if (decodingTable == NULL)
  422. {
  423. decodingTable = malloc(256);
  424. if (decodingTable == NULL)
  425. return nil;
  426. memset(decodingTable, CHAR_MAX, 256);
  427. NSUInteger i;
  428. for (i = 0; i < 64; i++)
  429. decodingTable[(short)encodingTable[i]] = i;
  430. }
  431. const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
  432. if (characters == NULL) // Not an ASCII string!
  433. return nil;
  434. char *bytes = malloc((([string length] + 3) / 4) * 3);
  435. if (bytes == NULL)
  436. return nil;
  437. NSUInteger length = 0;
  438. NSUInteger i = 0;
  439. while (YES)
  440. {
  441. char buffer[4];
  442. short bufferLength;
  443. for (bufferLength = 0; bufferLength < 4; i++)
  444. {
  445. if (characters[i] == '\0')
  446. break;
  447. if (isspace(characters[i]) || characters[i] == '=')
  448. continue;
  449. buffer[bufferLength] = decodingTable[(short)characters[i]];
  450. if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!
  451. {
  452. free(bytes);
  453. return nil;
  454. }
  455. }
  456. if (bufferLength == 0)
  457. break;
  458. if (bufferLength == 1) // At least two characters are needed to produce one byte!
  459. {
  460. free(bytes);
  461. return nil;
  462. }
  463. // Decode the characters in the buffer to bytes.
  464. bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
  465. if (bufferLength > 2)
  466. bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
  467. if (bufferLength > 3)
  468. bytes[length++] = (buffer[2] << 6) | buffer[3];
  469. }
  470. bytes = realloc(bytes, length);
  471. return [NSData dataWithBytesNoCopy:bytes length:length];
  472. }
  473. /**md5加密*/
  474. + (NSString *)md5Encrypt:(NSString *)encryptText{
  475. const char *cStr = [encryptText UTF8String];
  476. unsigned char result[CC_MD5_DIGEST_LENGTH];
  477. CC_MD5(cStr, strlen(cStr), result);
  478. return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  479. result[0], result[1], result[2], result[3],
  480. result[4], result[5], result[6], result[7],
  481. result[8], result[9], result[10], result[11],
  482. result[12], result[13], result[14], result[15]
  483. ] lowercaseString];
  484. }
  485. #pragma mark - RSA加密demo
  486. - (void)RSA {
  487. NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY\ncvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D\na+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX\nQmyveT/eqyZK1gYjvQIDAQAB\n-----END PUBLIC KEY-----";
  488. NSString *privkey = @"-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMjZu9UtVitvgHS\ntpmAU/rRVdhy9GaT2rnpCJOYSb0deVI+rXPKHI9Aca2LkWiRgkzM1wqbRvAvWrqK\ngm4PgQUjnoNr7vRd1HPUKNA9ATfJetddW86yar0ux3FMVaxUFN6F0KatqkplVXHo\n8qXubKHRx9dCbK95P96rJkrWBiO9AgMBAAECgYBO1UKEdYg9pxMX0XSLVtiWf3Na\n2jX6Ksk2Sfp5BhDkIcAdhcy09nXLOZGzNqsrv30QYcCOPGTQK5FPwx0mMYVBRAdo\nOLYp7NzxW/File//169O3ZFpkZ7MF0I2oQcNGTpMCUpaY6xMmxqN22INgi8SHp3w\nVU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uy\nEGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27\nkpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1x\nL6fhAkB9NvvW4/uWeLw7CHHVuVersZBmqjb5LWJU62v3L2rfbT1lmIqAVr+YT9CK\n2fAhPPtkpYYo5d4/vd1sCY1iAQ4tAkEAm2yPrJzjMn2G/ry57rzRzKGqUChOFrGs\nlm7HF6CQtAs4HC+2jC0peDyg97th37rLmPLB9txnPl50ewpkZuwOAQJBAM/eJnFw\nF5QAcL4CYDbfBKocx82VX/pFXng50T7FODiWbbL4UnxICE0UBFInNNiWJxNEb6jL\n5xd0pcy9O2DOeso=\n-----END PRIVATE KEY-----";
  489. NSString *encrypted = [RSA encryptString:@"hello world!" publicKey:pubkey];
  490. HLog(@"encrypted: %@", encrypted);
  491. NSString *decrypted = [RSA decryptString:encrypted privateKey:privkey];
  492. HLog(@"decrypted: %@", decrypted);
  493. }
  494. //防止N秒内,同部同接口频繁调用的处理
  495. + (BOOL)timeOverTosecode:(NSInteger)index bannerOldTime:(NSString *)bannerOldTime;
  496. {
  497. BOOL reFreshDevice_flag = YES;
  498. NSString *nowTime = [iTools getNowTimeStampString];
  499. NSString *oldTime = nil;
  500. if (![bannerOldTime isEqual:@""]) {
  501. oldTime = bannerOldTime;
  502. }
  503. //比较
  504. if ([oldTime length] > 0) {
  505. //时间差
  506. NSDate *dateNow = [iTools getTimeStringToDate:nowTime];
  507. NSDate *dateOld = [iTools getTimeStringToDate:oldTime];
  508. NSTimeInterval distanceBetweenDates = [dateNow timeIntervalSinceDate:dateOld];
  509. long long min = [[NSNumber numberWithDouble:distanceBetweenDates] longLongValue];
  510. if (min < index)
  511. {
  512. reFreshDevice_flag = NO;
  513. }else{
  514. reFreshDevice_flag = YES;
  515. }
  516. }
  517. return reFreshDevice_flag;
  518. }
  519. //获取拼音首字母(传入汉字字符串, 返回大写拼音首字母)
  520. + (NSString *)FirstCharactor:(NSString *)pString
  521. {
  522. //转成了可变字符串
  523. NSMutableString *pStr = [NSMutableString stringWithString:pString];
  524. //先转换为带声调的拼音
  525. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformMandarinLatin,NO);
  526. //再转换为不带声调的拼音
  527. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformStripDiacritics,NO);
  528. //转化为大写拼音
  529. NSString *pPinYin = [pStr capitalizedString];
  530. //获取并返回首字母
  531. return [pPinYin substringToIndex:1];
  532. }
  533. //根据uiview得到图像
  534. + (UIImage *)getImageFromView:(UIView *)fromView useScreenScale:(BOOL)use useNewMethod:(BOOL)useNewMethod
  535. {
  536. UIImage *viewImage = nil;
  537. if (([[[UIDevice currentDevice] systemVersion] doubleValue] > 7) && useNewMethod) {
  538. UIGraphicsBeginImageContextWithOptions(fromView.bounds.size, NO, [[UIScreen mainScreen] scale]);
  539. [fromView drawViewHierarchyInRect:fromView.bounds afterScreenUpdates:NO];
  540. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  541. UIGraphicsEndImageContext();
  542. } else {
  543. NSInteger scale = use ? [[UIScreen mainScreen] scale] : 1;
  544. UIGraphicsBeginImageContextWithOptions(CGSizeMake(fromView.bounds.size.width, fromView.bounds.size.height), NO, scale);
  545. [fromView.layer renderInContext:UIGraphicsGetCurrentContext()];
  546. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  547. UIGraphicsEndImageContext();
  548. }
  549. return viewImage;
  550. }
  551. //验证身份证
  552. //必须满足以下规则
  553. //1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X
  554. //2. 前两位必须是以下情形中的一种:11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91
  555. //3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期
  556. //4. 第17位表示性别,双数表示女,单数表示男
  557. //5. 第18位为前17位的校验位
  558. //算法如下:
  559. //(1)校验和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n数值,表示第几位的数字
  560. //(2)余数 = 校验和 % 11
  561. //(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
  562. //6. 出生年份的前两位必须是19或20
  563. + (BOOL)verifyIDCardNumber:(NSString *)value
  564. {
  565. value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  566. if ([value length] != 18) {
  567. return NO;
  568. }
  569. NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";
  570. NSString *leapMmdd = @"0229";
  571. NSString *year = @"(19|20)[0-9]{2}";
  572. NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
  573. NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
  574. NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
  575. NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
  576. NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";
  577. NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
  578. NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
  579. if (![regexTest evaluateWithObject:value]) {
  580. return NO;
  581. }
  582. int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7
  583. + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9
  584. + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10
  585. + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5
  586. + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8
  587. + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4
  588. + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2
  589. + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6
  590. + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
  591. NSInteger remainder = summary % 11;
  592. NSString *checkBit = @"";
  593. NSString *checkString = @"10X98765432";
  594. checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位
  595. return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];
  596. }
  597. #pragma mark --------------------
  598. #pragma mark - Localizable
  599. /**< 得到当前系统的语言 */
  600. + (NSString *)getCurrentLocalizableLanguage {
  601. NSArray *languages = [NSLocale preferredLanguages];
  602. NSString *currentLanguage = [languages objectAtIndex:0];
  603. return currentLanguage;
  604. }
  605. /**< 得到当前语言是否为中文 */
  606. + (BOOL)isChineseLanguage {
  607. NSString *currentLanguage = [self getCurrentLocalizableLanguage];
  608. if ([currentLanguage rangeOfString:@"^zh-" options:NSRegularExpressionSearch range:NSMakeRange(0, currentLanguage.length)].location != NSNotFound) {
  609. return YES;
  610. }
  611. return NO;
  612. }
  613. #define FileHashDefaultChunkSizeForReadingData 1024*8
  614. + (NSString*)getFileMD5WithPath:(NSString*)path {
  615. NSFileManager *fileManager = [NSFileManager defaultManager];
  616. if([fileManager fileExistsAtPath:path isDirectory:nil])
  617. {
  618. NSData *data = [NSData dataWithContentsOfFile:path];
  619. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  620. CC_MD5( data.bytes, (CC_LONG)data.length, digest );
  621. NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  622. for( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++ )
  623. {
  624. [output appendFormat:@"%02x", digest[i]];
  625. }
  626. return output;
  627. }
  628. else
  629. {
  630. return @"";
  631. }
  632. }
  633. + (CAShapeLayer *)getCornerRoundWithSelfView:(UIView *)originalView byRoundingCorners:(UIRectCorner)corners cornerRect:(CGRect)rect {
  634. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:CGSizeMake(10, 10)];
  635. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  636. maskLayer.frame = originalView.bounds;
  637. maskLayer.path = maskPath.CGPath;
  638. return maskLayer;
  639. }
  640. // 彩色图变黑白图
  641. + (UIImage*)getGrayImageFromImage:(UIImage*)sourceImage {
  642. int width = sourceImage.size.width-2;
  643. int height = sourceImage.size.height;
  644. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
  645. CGContextRef context = CGBitmapContextCreate (nil, width, height,8,0, colorSpace,kCGImageAlphaNone);
  646. CGColorSpaceRelease(colorSpace);
  647. if (context ==NULL) {
  648. return nil;
  649. }
  650. CGContextDrawImage(context,CGRectMake(0,0, width, height), sourceImage.CGImage);
  651. UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
  652. CGContextRelease(context);
  653. return grayImage;
  654. }
  655. // 显示base64二进制图片
  656. + (void)setImageView:(UIImageView *)imageView WithBase64String:(NSString *)avatar {
  657. //参数在这里 + (void) setImageView:(UIImageView *)imageView WithString:(NSString *)avatar
  658. //二进制显示
  659. /*服务器返回:例如
  660. data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC
  661. *上面的字符串复制到浏览器是可以显示出来一个图片的,这里说一下,字符串前面的data:image/png;base64是这个图片的格式,
  662. * web上面 解析好像是需要这部分的,但是拿到我们的iOS平台上,是不需要这部分的,有这部分反而解析不出来图片。
  663. * 所以这里可以说这部分属于格式部分,so我们显示的时候不要这部分。
  664. */
  665. NSArray *imageArray = [avatar componentsSeparatedByString:@","];
  666. NSData *imageData = [[NSData alloc] initWithBase64EncodedString:imageArray[1] options:NSDataBase64DecodingIgnoreUnknownCharacters];
  667. UIImage *image = [UIImage imageWithData:imageData];
  668. imageView.image = [iTools cutAlphaZero:image];
  669. }
  670. // iOS裁剪掉图片周围透明度为0的部分
  671. + (UIImage *)cutAlphaZero:(UIImage *)image {
  672. CGImageRef cgimage = [image CGImage];
  673. size_t width = CGImageGetWidth(cgimage); // 图片宽度
  674. size_t height = CGImageGetHeight(cgimage); // 图片高度
  675. unsigned char *data = calloc(width * height * 4, sizeof(unsigned char)); // 取图片首地址
  676. size_t bitsPerComponent = 8; // r g b a 每个component bits数目
  677. size_t bytesPerRow = width * 4; // 一张图片每行字节数目 (每个像素点包含r g b a 四个字节)
  678. CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); // 创建rgb颜色空间
  679. CGContextRef context = CGBitmapContextCreate(data, width,height,bitsPerComponent,bytesPerRow,space,kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
  680. CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgimage);
  681. int top = 0; // 上边框透明高度
  682. int left = 0; // 左边框透明高度
  683. int right = 0; // 右边框透明高度
  684. int bottom = 0; // 底边框透明高度
  685. for (size_t row = 0; row < height; row++) {
  686. BOOL find = false;
  687. for (size_t col = 0; col < width; col++) {
  688. size_t pixelIndex = (row * width + col) * 4;
  689. // int red = data[pixelIndex];
  690. // int green = data[pixelIndex+1];
  691. // int blue = data[pixelIndex + 2];
  692. int alpha = data[pixelIndex + 3];
  693. if (alpha != 0) {
  694. find = YES;
  695. break;
  696. }
  697. }
  698. if (find) {
  699. break;
  700. }
  701. top ++;
  702. }
  703. for (size_t col = 0; col < width; col++) {
  704. BOOL find = false;
  705. for (size_t row = 0; row < height; row++) {
  706. size_t pixelIndex = (row * width + col) * 4;
  707. int alpha = data[pixelIndex + 3];
  708. if (alpha != 0) {
  709. find = YES;
  710. break;
  711. }
  712. }
  713. if (find) {
  714. break;
  715. }
  716. left ++;
  717. }
  718. for (size_t col = width - 1; col > 0; col--) {
  719. BOOL find = false;
  720. for (size_t row = 0; row < height; row++) {
  721. size_t pixelIndex = (row * width + col) * 4;
  722. int alpha = data[pixelIndex + 3];
  723. if (alpha != 0) {
  724. find = YES;
  725. break;
  726. }
  727. }
  728. if (find) {
  729. break;
  730. }
  731. right ++;
  732. }
  733. for (size_t row = height - 1; row > 0; row--) {
  734. BOOL find = false;
  735. for (size_t col = 0; col < width; col++) {
  736. size_t pixelIndex = (row * width + col) * 4;
  737. int alpha = data[pixelIndex + 3];
  738. if (alpha != 0) {
  739. find = YES;
  740. break;
  741. }
  742. }
  743. if (find) {
  744. break;
  745. }
  746. bottom ++;
  747. }
  748. CGFloat scale = image.scale;
  749. CGImageRef newImageRef = CGImageCreateWithImageInRect(cgimage, CGRectMake(left * scale, top *scale, (image.size.width - left - right)*scale, (image.size.height - top - bottom)*scale));
  750. UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
  751. // 释放
  752. CGImageRelease(cgimage);
  753. CGContextRelease(context);
  754. CGColorSpaceRelease(space);
  755. return newImage;
  756. }
  757. + (UIWindow *)getKeyWindow {
  758. UIWindow* window = nil;
  759. if (@available(iOS 13.0, *))
  760. {
  761. for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes)
  762. {
  763. if (windowScene.activationState == UISceneActivationStateForegroundActive)
  764. {
  765. window = windowScene.windows.firstObject;
  766. break;
  767. }
  768. }
  769. }else{
  770. window = [UIApplication sharedApplication].keyWindow;
  771. }
  772. return window;
  773. }
  774. //调整相机拍摄的图片方向
  775. + (UIImage *)fixOrientation:(UIImage *)srcImg {
  776. if (srcImg.imageOrientation ==UIImageOrientationUp) return srcImg;
  777. CGAffineTransform transform =CGAffineTransformIdentity;
  778. switch (srcImg.imageOrientation) {
  779. case UIImageOrientationDown:
  780. case UIImageOrientationDownMirrored:
  781. transform = CGAffineTransformTranslate(transform, srcImg.size.width, srcImg.size.height);
  782. transform = CGAffineTransformRotate(transform,M_PI);
  783. break;
  784. case UIImageOrientationLeft:
  785. case UIImageOrientationLeftMirrored:
  786. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  787. transform = CGAffineTransformRotate(transform,M_PI_2);
  788. break;
  789. case UIImageOrientationRight:
  790. case UIImageOrientationRightMirrored:
  791. transform = CGAffineTransformTranslate(transform,0, srcImg.size.height);
  792. transform = CGAffineTransformRotate(transform, -M_PI_2);
  793. break;
  794. case UIImageOrientationUp:
  795. case UIImageOrientationUpMirrored:
  796. break;
  797. }
  798. switch (srcImg.imageOrientation) {
  799. case UIImageOrientationUpMirrored:
  800. case UIImageOrientationDownMirrored:
  801. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  802. transform = CGAffineTransformScale(transform, -1,1);
  803. break;
  804. case UIImageOrientationLeftMirrored:
  805. case UIImageOrientationRightMirrored:
  806. transform = CGAffineTransformTranslate(transform, srcImg.size.height,0);
  807. transform = CGAffineTransformScale(transform, -1,1);
  808. break;
  809. case UIImageOrientationUp:
  810. case UIImageOrientationDown:
  811. case UIImageOrientationLeft:
  812. case UIImageOrientationRight:
  813. break;
  814. }
  815. CGContextRef ctx =CGBitmapContextCreate(NULL, srcImg.size.width, srcImg.size.height,
  816. CGImageGetBitsPerComponent(srcImg.CGImage),0,
  817. CGImageGetColorSpace(srcImg.CGImage),
  818. CGImageGetBitmapInfo(srcImg.CGImage));
  819. CGContextConcatCTM(ctx, transform);
  820. switch (srcImg.imageOrientation) {
  821. case UIImageOrientationLeft:
  822. case UIImageOrientationLeftMirrored:
  823. case UIImageOrientationRight:
  824. case UIImageOrientationRightMirrored:
  825. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.height,srcImg.size.width), srcImg.CGImage);
  826. break;
  827. default:
  828. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.width,srcImg.size.height), srcImg.CGImage);
  829. break;
  830. }
  831. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  832. UIImage *img = [UIImage imageWithCGImage:cgimg];
  833. CGContextRelease(ctx);
  834. CGImageRelease(cgimg);
  835. return img;
  836. }
  837. + (NSString *)getTaskUidStr
  838. {
  839. NSInteger num = 6;
  840. NSString *string = [[NSString alloc]init];
  841. for (int i = 0; i < num; i++) {
  842. int number = arc4random() % 36;
  843. if (number < 10) {
  844. int figure = arc4random() % 10;
  845. NSString *tempString = [NSString stringWithFormat:@"%d", figure];
  846. string = [string stringByAppendingString:tempString];
  847. }else {
  848. int figure = (arc4random() % 26) + 97;
  849. char character = figure;
  850. NSString *tempString = [NSString stringWithFormat:@"%c", character];
  851. string = [string stringByAppendingString:tempString];
  852. }
  853. }
  854. return string;
  855. }
  856. + (void)lc_setAlternateIconName:(NSString*)iconName
  857. {
  858. //超级签换不了图片 旧版本升级会有问题 不要了
  859. //anti apple private method call analyse
  860. // if ([[UIApplication sharedApplication] respondsToSelector:@selector(supportsAlternateIcons)] &&
  861. // [[UIApplication sharedApplication] supportsAlternateIcons])
  862. // {
  863. // NSMutableString *selectorString = [[NSMutableString alloc] initWithCapacity:40];
  864. // [selectorString appendString:@"_setAlternate"];
  865. // [selectorString appendString:@"IconName:"];
  866. // [selectorString appendString:@"completionHandler:"];
  867. //
  868. // SEL selector = NSSelectorFromString(selectorString);
  869. // IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
  870. // void (*func)(id, SEL, id, id) = (void *)imp;
  871. // if (func)
  872. // {
  873. // func([UIApplication sharedApplication], selector, iconName, ^(NSError * _Nullable error) {});
  874. // }
  875. // }
  876. }
  877. + (UIViewController *)appRootViewController {
  878. UIViewController *appRootVC = [iTools getKeyWindow].rootViewController;
  879. UIViewController *topVC = appRootVC;
  880. while (topVC.presentedViewController) {
  881. topVC = topVC.presentedViewController;
  882. }
  883. return topVC;
  884. }
  885. /**
  886. * 压缩图片
  887. * image:将要压缩的图片 size:压缩后的尺寸
  888. */
  889. + (UIImage*)OriginImage:(UIImage *)image scaleToSize:(CGSize)size
  890. {
  891. // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
  892. //UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
  893. UIGraphicsBeginImageContext(CGSizeMake(size.width, size.height));
  894. [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
  895. UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  896. UIGraphicsEndImageContext();
  897. return scaledImage; //返回的就是已经改变的图片
  898. }
  899. // 时间戳转时间,时间戳为13位是精确到毫秒的,10位精确到秒
  900. + (NSString *)getDateStringWithTimeStr:(NSString* )str{
  901. NSTimeInterval time= [str doubleValue];//传入的时间戳str如果是精确到毫秒的记得要/1000
  902. if(str.length == 13){//传入的时间戳str如果是精确到毫秒的记得要/1000
  903. time = time/1000;
  904. }
  905. NSDate *detailDate=[NSDate dateWithTimeIntervalSince1970:time];
  906. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //实例化一个NSDateFormatter对象
  907. //设定时间格式,这里可以设置成自己需要的格式
  908. //[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss SS"];
  909. [dateFormatter setDateFormat:@"yyyy-MM-dd"];
  910. NSString *currentDateStr = [dateFormatter stringFromDate: detailDate];
  911. return currentDateStr;
  912. }
  913. // 文件夹大小(字节)
  914. + (unsigned long long)folderSizeAtPath:(NSString *)folderPath{
  915. NSFileManager *manager = [NSFileManager defaultManager];
  916. if (![manager fileExistsAtPath:folderPath]) return 0;
  917. NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:folderPath] objectEnumerator];
  918. NSString *fileName;
  919. long long folderSize = 0;
  920. while ((fileName = [childFilesEnumerator nextObject]) != nil){
  921. NSString *fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
  922. folderSize += [self fileSizeAtPath:fileAbsolutePath];
  923. }
  924. return folderSize;
  925. }
  926. //单个文件的大小(字节)
  927. +(unsigned long long)fileSizeAtPath:(NSString *)filePath {
  928. NSFileManager *manager = [NSFileManager defaultManager];
  929. if ([manager fileExistsAtPath:filePath]){
  930. return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
  931. }
  932. return 0;
  933. }
  934. + (NSArray *)toArrayWithJsonStr:(NSString *)jsonStr
  935. {
  936. if ([jsonStr isKindOfClass:[NSArray class]]) {
  937. return (NSArray *)jsonStr;
  938. }
  939. if (jsonStr == nil) {
  940. return nil;
  941. }
  942. NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
  943. NSError *err;
  944. NSArray *resultArr = [NSJSONSerialization JSONObjectWithData:jsonData
  945. options:NSJSONReadingMutableContainers
  946. error:&err];
  947. if(err) {
  948. NSLog(@"json解析失败:%@",err);
  949. return nil;
  950. }
  951. return resultArr;
  952. }
  953. + (NSString *)toJsonStrWithArray:(NSArray *)arr {
  954. if ([arr isKindOfClass:[NSString class]]) {
  955. return (NSString *)arr;
  956. }
  957. NSError *parseError = nil;
  958. NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
  959. NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  960. jsonStr = [jsonStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  961. jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@" " withString:@""];
  962. jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
  963. if (parseError) {
  964. jsonStr = @"";
  965. }
  966. return jsonStr;
  967. }
  968. //ios端:
  969. //1、需求说明:解决除MP4 MOV 3GP M4V 总计4种格式外,其他格式下载失败的问题;
  970. //2、交互说明:下载列表勾选文件中含有其他格式,toast提示“IOS系统仅支持MP4、MOV、3GP、M4V 的视频格式,其他格式无法下载”。点击下载按钮,过滤其他格式文件,仅下载MP4、MOV、3GP、M4V 的视频格式文件;
  971. //ios支持图片格式: (SVG 不支持)
  972. //需求说明:解决除JPG PNG GIF TIFF BMP总计5种格式外,其他格式下载失败的问题
  973. //视觉交互:选择文件中含有其他格式,toast提示“IOS系统仅支持JPG 、PNG、GIF、TIFF、BMP的图片格式,其他格式无法下载”。点击下载按钮,过滤其他格式文件,仅下载JPG 、PNG、GIF、TIFF、BMP的图片格式文件;
  974. + (BOOL)canSaveFileToAlbumByPhoto:(BOOL)isPhotoType withName:(NSString*)nameStr{
  975. NSString*name = [nameStr lowercaseString];
  976. NSArray *nameArr = [name componentsSeparatedByString:@"."];
  977. if(nameArr.count >0 && !isPhotoType){
  978. BOOL canSavePhotoType = NO;
  979. NSString *lastName = nameArr.lastObject;
  980. if([lastName isEqualToString:@"mp4"]
  981. ||[lastName isEqualToString:@"mov"]
  982. ||[lastName isEqualToString:@"3gp"]
  983. ||[lastName isEqualToString:@"m4v"]){
  984. canSavePhotoType = YES;
  985. }
  986. return canSavePhotoType;
  987. }
  988. if(nameArr.count >0 && isPhotoType){
  989. BOOL canSavePhotoType = NO;
  990. //JPG 、PNG、GIF、TIFF、BMP
  991. NSString *lastName = nameArr.lastObject;
  992. if([lastName isEqualToString:@"jpg"]
  993. ||[lastName isEqualToString:@"png"]
  994. ||[lastName isEqualToString:@"gif"]
  995. ||[lastName isEqualToString:@"tiff"]
  996. ||[lastName isEqualToString:@"bmp"]
  997. ||[lastName isEqualToString:@"heic"]
  998. ||[lastName isEqualToString:@"jpeg"]
  999. ||[lastName isEqualToString:@"heif"]){
  1000. canSavePhotoType = YES;
  1001. }
  1002. return canSavePhotoType;
  1003. }
  1004. return NO;
  1005. }
  1006. //判断是否为音频文件
  1007. + (BOOL)isAudioFilewithName:(NSString*)nameStr
  1008. {
  1009. NSString*name = [nameStr lowercaseString];
  1010. NSArray *nameArr = [name componentsSeparatedByString:@"."];
  1011. if(nameArr.count >0 ){
  1012. //JPG 、PNG、GIF、TIFF、BMP
  1013. NSString *lastName = nameArr.lastObject;
  1014. if([lastName isEqualToString:@"mp3"]
  1015. ||[lastName isEqualToString:@"wav"]
  1016. ||[lastName isEqualToString:@"flac"]
  1017. ||[lastName isEqualToString:@"ogg"]
  1018. ||[lastName isEqualToString:@"wma"]
  1019. ||[lastName isEqualToString:@"m4a"]
  1020. ||[lastName isEqualToString:@"acc"]
  1021. ||[lastName isEqualToString:@"ac3"]){
  1022. return YES;
  1023. }
  1024. }
  1025. return NO;
  1026. }
  1027. //判断是否为视频文件
  1028. + (BOOL)isVideoFilewithName:(NSString*)nameStr
  1029. {
  1030. NSString*name = [nameStr lowercaseString];
  1031. NSArray *nameArr = [name componentsSeparatedByString:@"."];
  1032. if(nameArr.count >0 ){
  1033. //JPG 、PNG、GIF、TIFF、BMP
  1034. NSString *lastName = nameArr.lastObject;
  1035. if([lastName isEqualToString:@"mp4"]
  1036. ||[lastName isEqualToString:@"mov"]
  1037. ||[lastName isEqualToString:@"3gp"]
  1038. ||[lastName isEqualToString:@"m4v"]
  1039. ||[lastName isEqualToString:@"avi"]
  1040. ||[lastName isEqualToString:@"flv"]
  1041. ||[lastName isEqualToString:@"wmv"]
  1042. ||[lastName isEqualToString:@"mkv"]
  1043. ||[lastName isEqualToString:@"wkm"]
  1044. ||[lastName isEqualToString:@"ts"]
  1045. ||[lastName isEqualToString:@"rmvb"]){
  1046. return YES;
  1047. }
  1048. }
  1049. return NO;
  1050. }
  1051. //判断是否为相片文件
  1052. + (BOOL)isPhotoFilewithName:(NSString*)nameStr
  1053. {
  1054. NSString*name = [nameStr lowercaseString];
  1055. NSArray *nameArr = [name componentsSeparatedByString:@"."];
  1056. if(nameArr.count >0 ){
  1057. //JPG 、PNG、GIF、TIFF、BMP
  1058. NSString *lastName = nameArr.lastObject;
  1059. if([lastName isEqualToString:@"jpg"]
  1060. ||[lastName isEqualToString:@"png"]
  1061. ||[lastName isEqualToString:@"gif"]
  1062. ||[lastName isEqualToString:@"tiff"]
  1063. ||[lastName isEqualToString:@"bmp"]
  1064. ||[lastName isEqualToString:@"heic"]
  1065. ||[lastName isEqualToString:@"jpeg"]
  1066. ||[lastName isEqualToString:@"heif"]){
  1067. return YES;
  1068. }
  1069. }
  1070. return NO;
  1071. }
  1072. // base64 url 编码
  1073. + (NSString *)base64UrlEncoder:(NSString *)str {
  1074. NSData *data = [[str dataUsingEncoding:NSUTF8StringEncoding] base64EncodedDataWithOptions:0];
  1075. NSMutableString *base64Str = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  1076. base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
  1077. base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
  1078. base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
  1079. return base64Str;
  1080. }
  1081. // base64 url 解码
  1082. + (NSString *)base64UrlDecoder:(NSString *)str {
  1083. NSMutableString *base64Str = [[NSMutableString alloc] initWithString:str];
  1084. base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
  1085. base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
  1086. NSInteger mod4 = base64Str.length % 4;
  1087. if (mod4) {
  1088. [base64Str appendString:[@"====" substringToIndex:(4 - mod4)]];
  1089. }
  1090. NSData *data = [[NSData alloc] initWithBase64EncodedString:base64Str options:0];
  1091. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  1092. }
  1093. @end