iTools.m 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  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. //ypp add 通讯录文件名格式YmdHis+随机数字(1000~9999) 2020 07 07 15 08 25 1000
  112. + (NSString *)getContactsNameStr {
  113. NSString* date;
  114. NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
  115. [formatter setDateFormat:@"YYYYMMddhhmmss"];
  116. date = [formatter stringFromDate:[NSDate date]];
  117. int randomNumber = (int) arc4random_uniform(9999) + 1000;
  118. NSString *contactsNameStr = [NSString stringWithFormat:@"%@%d",date,randomNumber];
  119. return contactsNameStr;
  120. }
  121. + (UIImage*)createImageWithColor:(UIColor *)color
  122. {
  123. CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  124. UIGraphicsBeginImageContext(rect.size);
  125. CGContextRef context = UIGraphicsGetCurrentContext();
  126. CGContextSetFillColorWithColor(context, [color CGColor]);
  127. CGContextFillRect(context, rect);
  128. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  129. UIGraphicsEndImageContext();
  130. return image;
  131. }
  132. + (UIImage *)imageFromColor:(UIColor *)color view:(UIView *)view {
  133. CGRect rect = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height);
  134. UIGraphicsBeginImageContext(rect.size);
  135. CGContextRef context = UIGraphicsGetCurrentContext();
  136. CGContextSetFillColorWithColor(context, [color CGColor]);
  137. CGContextFillRect(context, rect);
  138. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  139. UIGraphicsEndImageContext();
  140. return img;
  141. }
  142. + (UIImage *)getImageFromColor:(UIColor *)color rect:(CGRect)rect {
  143. UIGraphicsBeginImageContext(rect.size);
  144. CGContextRef context = UIGraphicsGetCurrentContext();
  145. CGContextSetFillColorWithColor(context, [color CGColor]);
  146. CGContextFillRect(context, rect);
  147. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  148. UIGraphicsEndImageContext();
  149. return img;
  150. }
  151. /**将UIColor变换为UIImage,设置尺寸**/
  152. + (UIImage *)createImageWithColor:(UIColor *)color withSize:(CGSize)size {
  153. CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
  154. UIGraphicsBeginImageContextWithOptions(rect.size,NO,[UIScreen mainScreen].scale);
  155. CGContextRef context = UIGraphicsGetCurrentContext();
  156. CGContextSetFillColorWithColor(context, [color CGColor]);
  157. CGContextFillRect(context, rect);
  158. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  159. UIGraphicsEndImageContext();
  160. return theImage;
  161. }
  162. /**将文件大小B 自动转成对应的B KB MB GB**/
  163. + (NSString *)getFileSizeStringFormedValue:(NSInteger)value
  164. {
  165. double convertedValue = value*1.0;
  166. int multiplyFactor = 0;
  167. NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil];
  168. while (convertedValue > 1024 && multiplyFactor < tokens.count) {
  169. convertedValue /= 1024;
  170. multiplyFactor++;
  171. }
  172. NSString *text = [NSString stringWithFormat:@"%4.2f%@",convertedValue, [tokens objectAtIndex:multiplyFactor]];
  173. if ([text isEqualToString:@"0.00B"]) {
  174. text = @"0B";
  175. }
  176. return text;
  177. }
  178. +(BOOL)getBoolWithKey:(NSString*)key{
  179. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  180. return [defaults boolForKey:key];
  181. }
  182. +(void)setBoolWithKey:(NSString*)key value:(BOOL)value{
  183. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  184. [defaults setBool:value forKey:key];
  185. [defaults synchronize];
  186. }
  187. +(NSString*)getStringWithKey:(NSString*)key{
  188. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  189. return [defaults stringForKey:key];
  190. }
  191. +(void)setStringWithKey:(NSString*)key value:(NSString*)value{
  192. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  193. [defaults setObject:value forKey:key];
  194. [defaults synchronize];
  195. }
  196. +(NSInteger)getIntegerWithKey:(NSString*)key{
  197. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  198. return [defaults integerForKey:key];
  199. }
  200. +(void)setIntegerWithKey:(NSString*)key value:(NSInteger)value{
  201. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  202. [defaults setInteger:value forKey:key];
  203. [defaults synchronize];
  204. }
  205. + (NSString *)notRounding:(float)price afterPoint:(int)position {
  206. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  207. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  208. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  209. return [NSString stringWithFormat:@"%@%%",roundedOunces];
  210. }
  211. + (CGFloat)notRoundingFloat:(float)price afterPoint:(int)position {
  212. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  213. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  214. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  215. return [roundedOunces floatValue];
  216. }
  217. + (NSString *)formatFloat:(float)f
  218. {
  219. if (fmodf(f, 1)==0) {//如果有一位小数点
  220. return [NSString stringWithFormat:@"%.0f",f];
  221. } else if (fmodf(f*10, 1)==0) {//如果有两位小数点
  222. return [NSString stringWithFormat:@"%.1f",f];
  223. } else {
  224. return [NSString stringWithFormat:@"%.2f",f];
  225. }
  226. }
  227. /**
  228. 获取运营商名称
  229. */
  230. + (NSString *)getCarrierInfo
  231. {
  232. CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
  233. CTCarrier *carrier = nil;
  234. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.1) {
  235. if ([telephonyInfo respondsToSelector:@selector(serviceSubscriberCellularProviders)]) {
  236. #pragma clang diagnostic push
  237. #pragma clang diagnostic ignored "-Wunguarded-availability-new"
  238. NSDictionary *dic = [telephonyInfo serviceSubscriberCellularProviders];
  239. if (dic.allKeys.count) {
  240. carrier = [dic objectForKey:dic.allKeys[0]];
  241. }
  242. #pragma clang diagnostic pop
  243. }
  244. }
  245. if(!carrier) {
  246. //遇到的 warning 又明知干不掉的时候就用这种方法隐藏即可,-Wdeprecated-declarations
  247. #pragma clang diagnostic push
  248. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  249. carrier = telephonyInfo.subscriberCellularProvider;
  250. #pragma clang diagnostic pop
  251. }
  252. //countryCode,移动国家码,MCC的资源由国际电联(ITU)统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460;
  253. NSString *countryCode = [carrier mobileCountryCode];
  254. //code,移动网络码,共2位,中国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001
  255. NSString *code = [carrier mobileNetworkCode];
  256. //网络运营商的名字
  257. NSString *carrier_name = @"";
  258. //用户运营商网络 (中国电信:CHINANET,中国联通:UNICOM,中国移动:CMNET,中国铁通:CRTC,中国广电:GCABLENET)
  259. if ([countryCode isEqualToString:@"460"] && countryCode && code) {
  260. if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"04"] || [code isEqualToString:@"07"] || [code isEqualToString:@"08"]|| [code isEqualToString:@"13"]) {
  261. carrier_name = @"CMNET";
  262. }
  263. else if ([code isEqualToString:@"03"] || [code isEqualToString:@"05"] || [code isEqualToString:@"11"] || [code isEqualToString:@"12"])
  264. {
  265. carrier_name = @"CHINANET";
  266. }
  267. else if ([code isEqualToString:@"01"] || [code isEqualToString:@"06"] || [code isEqualToString:@"09"] || [code isEqualToString:@"10"])
  268. {
  269. carrier_name = @"UNICOM";
  270. }
  271. else if ([code isEqualToString:@"20"])
  272. {
  273. carrier_name = @"CRTC";
  274. }
  275. else if ([code isEqualToString:@"15"])
  276. {
  277. carrier_name = @"GCABLENET";
  278. }
  279. }
  280. return carrier_name;
  281. }
  282. // 去除字符串中所有的空格和换行符(包括中间和首尾)
  283. + (NSString *)removeSpaceAndNewline:(NSString *)str
  284. {
  285. NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
  286. temp = [temp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
  287. temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
  288. temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
  289. return temp;
  290. }
  291. #pragma mark 加密/解密(AES RSA base64 md5)
  292. // AES加密
  293. + (NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key
  294. {
  295. char keyPtr[kCCKeySizeAES128+1];
  296. memset(keyPtr, 0, sizeof(keyPtr));
  297. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  298. NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  299. NSUInteger dataLength = [data length];
  300. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  301. void *buffer = malloc(bufferSize);
  302. size_t numBytesEncrypted = 0;
  303. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  304. kCCAlgorithmAES128,
  305. kCCOptionPKCS7Padding|kCCOptionECBMode,
  306. keyPtr,
  307. kCCBlockSizeAES128,
  308. NULL,
  309. [data bytes],
  310. dataLength,
  311. buffer,
  312. bufferSize,
  313. &numBytesEncrypted);
  314. if (cryptStatus == kCCSuccess) {
  315. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  316. return [resultData base64EncodedStringWithOptions:(NSDataBase64Encoding64CharacterLineLength)];
  317. }
  318. free(buffer);
  319. return nil;
  320. }
  321. //AES解密
  322. + (NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key
  323. {
  324. char keyPtr[kCCKeySizeAES128 + 1];
  325. memset(keyPtr, 0, sizeof(keyPtr));
  326. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  327. NSData *data = [[NSData alloc] initWithBase64EncodedString:encryptText options:NSDataBase64DecodingIgnoreUnknownCharacters];//base64解码
  328. NSUInteger dataLength = [data length];
  329. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  330. void *buffer = malloc(bufferSize);
  331. size_t numBytesCrypted = 0;
  332. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  333. kCCAlgorithmAES128,
  334. kCCOptionPKCS7Padding|kCCOptionECBMode,
  335. keyPtr,
  336. kCCBlockSizeAES128,
  337. NULL,
  338. [data bytes],
  339. dataLength,
  340. buffer,
  341. bufferSize,
  342. &numBytesCrypted);
  343. if (cryptStatus == kCCSuccess) {
  344. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  345. return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
  346. }
  347. free(buffer);
  348. return nil;
  349. }
  350. /**RSA加密-publicKey-公钥*/
  351. + (NSString *)RSAEncrypt:(NSString *)plainText key:(NSString *)publicKey {
  352. NSString *encrypted = [RSA encryptString:plainText publicKey:publicKey];
  353. return encrypted;
  354. }
  355. /**RSA解密-privateKey-私钥*/
  356. + (NSString *)RSADecrypt:(NSString *)encryptText key:(NSString *)privateKey {
  357. NSString *decrypted = [RSA decryptString:encryptText privateKey:privateKey];
  358. return decrypted;
  359. }
  360. /**Base64加密*/
  361. + (NSString *)Base64Encrypt:(NSString *)plainText {
  362. NSData *data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  363. return [data base64EncodedStringWithOptions:0];
  364. }
  365. /**base64解密*/
  366. + (NSString *)Base64Decrypt:(NSString *)encryptText {
  367. NSData *data = [self dataWithBase64EncodedString:encryptText];
  368. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  369. }
  370. /**base64格式字符串转换为文本数据*/
  371. + (NSData *)dataWithBase64EncodedString:(NSString *)string
  372. {
  373. if (string == nil)
  374. [NSException raise:NSInvalidArgumentException format:@""];
  375. if ([string length] == 0)
  376. return [NSData data];
  377. static char *decodingTable = NULL;
  378. if (decodingTable == NULL)
  379. {
  380. decodingTable = malloc(256);
  381. if (decodingTable == NULL)
  382. return nil;
  383. memset(decodingTable, CHAR_MAX, 256);
  384. NSUInteger i;
  385. for (i = 0; i < 64; i++)
  386. decodingTable[(short)encodingTable[i]] = i;
  387. }
  388. const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
  389. if (characters == NULL) // Not an ASCII string!
  390. return nil;
  391. char *bytes = malloc((([string length] + 3) / 4) * 3);
  392. if (bytes == NULL)
  393. return nil;
  394. NSUInteger length = 0;
  395. NSUInteger i = 0;
  396. while (YES)
  397. {
  398. char buffer[4];
  399. short bufferLength;
  400. for (bufferLength = 0; bufferLength < 4; i++)
  401. {
  402. if (characters[i] == '\0')
  403. break;
  404. if (isspace(characters[i]) || characters[i] == '=')
  405. continue;
  406. buffer[bufferLength] = decodingTable[(short)characters[i]];
  407. if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!
  408. {
  409. free(bytes);
  410. return nil;
  411. }
  412. }
  413. if (bufferLength == 0)
  414. break;
  415. if (bufferLength == 1) // At least two characters are needed to produce one byte!
  416. {
  417. free(bytes);
  418. return nil;
  419. }
  420. // Decode the characters in the buffer to bytes.
  421. bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
  422. if (bufferLength > 2)
  423. bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
  424. if (bufferLength > 3)
  425. bytes[length++] = (buffer[2] << 6) | buffer[3];
  426. }
  427. bytes = realloc(bytes, length);
  428. return [NSData dataWithBytesNoCopy:bytes length:length];
  429. }
  430. /**md5加密*/
  431. + (NSString *)md5Encrypt:(NSString *)encryptText{
  432. const char *cStr = [encryptText UTF8String];
  433. unsigned char result[CC_MD5_DIGEST_LENGTH];
  434. CC_MD5(cStr, strlen(cStr), result);
  435. return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  436. result[0], result[1], result[2], result[3],
  437. result[4], result[5], result[6], result[7],
  438. result[8], result[9], result[10], result[11],
  439. result[12], result[13], result[14], result[15]
  440. ] lowercaseString];
  441. }
  442. #pragma mark - RSA加密demo
  443. - (void)RSA {
  444. NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY\ncvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D\na+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX\nQmyveT/eqyZK1gYjvQIDAQAB\n-----END PUBLIC KEY-----";
  445. 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-----";
  446. NSString *encrypted = [RSA encryptString:@"hello world!" publicKey:pubkey];
  447. HLog(@"encrypted: %@", encrypted);
  448. NSString *decrypted = [RSA decryptString:encrypted privateKey:privkey];
  449. HLog(@"decrypted: %@", decrypted);
  450. }
  451. //防止N秒内,同部同接口频繁调用的处理
  452. + (BOOL)timeOverTosecode:(NSInteger)index bannerOldTime:(NSString *)bannerOldTime;
  453. {
  454. BOOL reFreshDevice_flag = YES;
  455. NSString *nowTime = [iTools getNowTimeStampString];
  456. NSString *oldTime = nil;
  457. if (![bannerOldTime isEqual:@""]) {
  458. oldTime = bannerOldTime;
  459. }
  460. //比较
  461. if ([oldTime length] > 0) {
  462. //时间差
  463. NSDate *dateNow = [iTools getTimeStringToDate:nowTime];
  464. NSDate *dateOld = [iTools getTimeStringToDate:oldTime];
  465. NSTimeInterval distanceBetweenDates = [dateNow timeIntervalSinceDate:dateOld];
  466. long long min = [[NSNumber numberWithDouble:distanceBetweenDates] longLongValue];
  467. if (min < index)
  468. {
  469. reFreshDevice_flag = NO;
  470. }else{
  471. reFreshDevice_flag = YES;
  472. }
  473. }
  474. return reFreshDevice_flag;
  475. }
  476. //获取拼音首字母(传入汉字字符串, 返回大写拼音首字母)
  477. + (NSString *)FirstCharactor:(NSString *)pString
  478. {
  479. //转成了可变字符串
  480. NSMutableString *pStr = [NSMutableString stringWithString:pString];
  481. //先转换为带声调的拼音
  482. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformMandarinLatin,NO);
  483. //再转换为不带声调的拼音
  484. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformStripDiacritics,NO);
  485. //转化为大写拼音
  486. NSString *pPinYin = [pStr capitalizedString];
  487. //获取并返回首字母
  488. return [pPinYin substringToIndex:1];
  489. }
  490. //根据uiview得到图像
  491. + (UIImage *)getImageFromView:(UIView *)fromView useScreenScale:(BOOL)use useNewMethod:(BOOL)useNewMethod
  492. {
  493. UIImage *viewImage = nil;
  494. if (([[[UIDevice currentDevice] systemVersion] doubleValue] > 7) && useNewMethod) {
  495. UIGraphicsBeginImageContextWithOptions(fromView.bounds.size, NO, [[UIScreen mainScreen] scale]);
  496. [fromView drawViewHierarchyInRect:fromView.bounds afterScreenUpdates:NO];
  497. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  498. UIGraphicsEndImageContext();
  499. } else {
  500. NSInteger scale = use ? [[UIScreen mainScreen] scale] : 1;
  501. UIGraphicsBeginImageContextWithOptions(CGSizeMake(fromView.bounds.size.width, fromView.bounds.size.height), NO, scale);
  502. [fromView.layer renderInContext:UIGraphicsGetCurrentContext()];
  503. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  504. UIGraphicsEndImageContext();
  505. }
  506. return viewImage;
  507. }
  508. //验证身份证
  509. //必须满足以下规则
  510. //1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X
  511. //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
  512. //3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期
  513. //4. 第17位表示性别,双数表示女,单数表示男
  514. //5. 第18位为前17位的校验位
  515. //算法如下:
  516. //(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数值,表示第几位的数字
  517. //(2)余数 = 校验和 % 11
  518. //(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
  519. //6. 出生年份的前两位必须是19或20
  520. + (BOOL)verifyIDCardNumber:(NSString *)value
  521. {
  522. value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  523. if ([value length] != 18) {
  524. return NO;
  525. }
  526. 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])))";
  527. NSString *leapMmdd = @"0229";
  528. NSString *year = @"(19|20)[0-9]{2}";
  529. NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
  530. NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
  531. NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
  532. NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
  533. 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}";
  534. NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
  535. NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
  536. if (![regexTest evaluateWithObject:value]) {
  537. return NO;
  538. }
  539. int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7
  540. + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9
  541. + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10
  542. + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5
  543. + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8
  544. + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4
  545. + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2
  546. + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6
  547. + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
  548. NSInteger remainder = summary % 11;
  549. NSString *checkBit = @"";
  550. NSString *checkString = @"10X98765432";
  551. checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位
  552. return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];
  553. }
  554. #pragma mark --------------------
  555. #pragma mark - Localizable
  556. /**< 得到当前系统的语言 */
  557. + (NSString *)getCurrentLocalizableLanguage {
  558. NSArray *languages = [NSLocale preferredLanguages];
  559. NSString *currentLanguage = [languages objectAtIndex:0];
  560. return currentLanguage;
  561. }
  562. /**< 得到当前语言是否为中文 */
  563. + (BOOL)isChineseLanguage {
  564. NSString *currentLanguage = [self getCurrentLocalizableLanguage];
  565. if ([currentLanguage rangeOfString:@"^zh-" options:NSRegularExpressionSearch range:NSMakeRange(0, currentLanguage.length)].location != NSNotFound) {
  566. return YES;
  567. }
  568. return NO;
  569. }
  570. #define FileHashDefaultChunkSizeForReadingData 1024*8
  571. + (NSString*)getFileMD5WithPath:(NSString*)path {
  572. NSFileManager *fileManager = [NSFileManager defaultManager];
  573. if([fileManager fileExistsAtPath:path isDirectory:nil])
  574. {
  575. NSData *data = [NSData dataWithContentsOfFile:path];
  576. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  577. CC_MD5( data.bytes, (CC_LONG)data.length, digest );
  578. NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  579. for( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++ )
  580. {
  581. [output appendFormat:@"%02x", digest[i]];
  582. }
  583. return output;
  584. }
  585. else
  586. {
  587. return @"";
  588. }
  589. }
  590. + (CAShapeLayer *)getCornerRoundWithSelfView:(UIView *)originalView byRoundingCorners:(UIRectCorner)corners cornerRect:(CGRect)rect {
  591. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:CGSizeMake(10, 10)];
  592. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  593. maskLayer.frame = originalView.bounds;
  594. maskLayer.path = maskPath.CGPath;
  595. return maskLayer;
  596. }
  597. // 彩色图变黑白图
  598. + (UIImage*)getGrayImageFromImage:(UIImage*)sourceImage {
  599. int width = sourceImage.size.width-2;
  600. int height = sourceImage.size.height;
  601. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
  602. CGContextRef context = CGBitmapContextCreate (nil, width, height,8,0, colorSpace,kCGImageAlphaNone);
  603. CGColorSpaceRelease(colorSpace);
  604. if (context ==NULL) {
  605. return nil;
  606. }
  607. CGContextDrawImage(context,CGRectMake(0,0, width, height), sourceImage.CGImage);
  608. UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
  609. CGContextRelease(context);
  610. return grayImage;
  611. }
  612. // 显示base64二进制图片
  613. + (void)setImageView:(UIImageView *)imageView WithBase64String:(NSString *)avatar {
  614. //参数在这里 + (void) setImageView:(UIImageView *)imageView WithString:(NSString *)avatar
  615. //二进制显示
  616. /*服务器返回:例如
  617. data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC
  618. *上面的字符串复制到浏览器是可以显示出来一个图片的,这里说一下,字符串前面的data:image/png;base64是这个图片的格式,
  619. * web上面 解析好像是需要这部分的,但是拿到我们的iOS平台上,是不需要这部分的,有这部分反而解析不出来图片。
  620. * 所以这里可以说这部分属于格式部分,so我们显示的时候不要这部分。
  621. */
  622. NSArray *imageArray = [avatar componentsSeparatedByString:@","];
  623. NSData *imageData = [[NSData alloc] initWithBase64EncodedString:imageArray[1] options:NSDataBase64DecodingIgnoreUnknownCharacters];
  624. UIImage *image = [UIImage imageWithData:imageData];
  625. imageView.image = [iTools cutAlphaZero:image];
  626. }
  627. // iOS裁剪掉图片周围透明度为0的部分
  628. + (UIImage *)cutAlphaZero:(UIImage *)image {
  629. CGImageRef cgimage = [image CGImage];
  630. size_t width = CGImageGetWidth(cgimage); // 图片宽度
  631. size_t height = CGImageGetHeight(cgimage); // 图片高度
  632. unsigned char *data = calloc(width * height * 4, sizeof(unsigned char)); // 取图片首地址
  633. size_t bitsPerComponent = 8; // r g b a 每个component bits数目
  634. size_t bytesPerRow = width * 4; // 一张图片每行字节数目 (每个像素点包含r g b a 四个字节)
  635. CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); // 创建rgb颜色空间
  636. CGContextRef context = CGBitmapContextCreate(data, width,height,bitsPerComponent,bytesPerRow,space,kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
  637. CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgimage);
  638. int top = 0; // 上边框透明高度
  639. int left = 0; // 左边框透明高度
  640. int right = 0; // 右边框透明高度
  641. int bottom = 0; // 底边框透明高度
  642. for (size_t row = 0; row < height; row++) {
  643. BOOL find = false;
  644. for (size_t col = 0; col < width; col++) {
  645. size_t pixelIndex = (row * width + col) * 4;
  646. // int red = data[pixelIndex];
  647. // int green = data[pixelIndex+1];
  648. // int blue = data[pixelIndex + 2];
  649. int alpha = data[pixelIndex + 3];
  650. if (alpha != 0) {
  651. find = YES;
  652. break;
  653. }
  654. }
  655. if (find) {
  656. break;
  657. }
  658. top ++;
  659. }
  660. for (size_t col = 0; col < width; col++) {
  661. BOOL find = false;
  662. for (size_t row = 0; row < height; row++) {
  663. size_t pixelIndex = (row * width + col) * 4;
  664. int alpha = data[pixelIndex + 3];
  665. if (alpha != 0) {
  666. find = YES;
  667. break;
  668. }
  669. }
  670. if (find) {
  671. break;
  672. }
  673. left ++;
  674. }
  675. for (size_t col = width - 1; col > 0; col--) {
  676. BOOL find = false;
  677. for (size_t row = 0; row < height; row++) {
  678. size_t pixelIndex = (row * width + col) * 4;
  679. int alpha = data[pixelIndex + 3];
  680. if (alpha != 0) {
  681. find = YES;
  682. break;
  683. }
  684. }
  685. if (find) {
  686. break;
  687. }
  688. right ++;
  689. }
  690. for (size_t row = height - 1; row > 0; row--) {
  691. BOOL find = false;
  692. for (size_t col = 0; col < width; col++) {
  693. size_t pixelIndex = (row * width + col) * 4;
  694. int alpha = data[pixelIndex + 3];
  695. if (alpha != 0) {
  696. find = YES;
  697. break;
  698. }
  699. }
  700. if (find) {
  701. break;
  702. }
  703. bottom ++;
  704. }
  705. CGFloat scale = image.scale;
  706. CGImageRef newImageRef = CGImageCreateWithImageInRect(cgimage, CGRectMake(left * scale, top *scale, (image.size.width - left - right)*scale, (image.size.height - top - bottom)*scale));
  707. UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
  708. // 释放
  709. CGImageRelease(cgimage);
  710. CGContextRelease(context);
  711. CGColorSpaceRelease(space);
  712. return newImage;
  713. }
  714. + (UIWindow *)getKeyWindow {
  715. UIWindow* window = nil;
  716. if (@available(iOS 13.0, *))
  717. {
  718. for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes)
  719. {
  720. if (windowScene.activationState == UISceneActivationStateForegroundActive)
  721. {
  722. window = windowScene.windows.firstObject;
  723. break;
  724. }
  725. }
  726. }else{
  727. window = [UIApplication sharedApplication].keyWindow;
  728. }
  729. return window;
  730. }
  731. //调整相机拍摄的图片方向
  732. + (UIImage *)fixOrientation:(UIImage *)srcImg {
  733. if (srcImg.imageOrientation ==UIImageOrientationUp) return srcImg;
  734. CGAffineTransform transform =CGAffineTransformIdentity;
  735. switch (srcImg.imageOrientation) {
  736. case UIImageOrientationDown:
  737. case UIImageOrientationDownMirrored:
  738. transform = CGAffineTransformTranslate(transform, srcImg.size.width, srcImg.size.height);
  739. transform = CGAffineTransformRotate(transform,M_PI);
  740. break;
  741. case UIImageOrientationLeft:
  742. case UIImageOrientationLeftMirrored:
  743. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  744. transform = CGAffineTransformRotate(transform,M_PI_2);
  745. break;
  746. case UIImageOrientationRight:
  747. case UIImageOrientationRightMirrored:
  748. transform = CGAffineTransformTranslate(transform,0, srcImg.size.height);
  749. transform = CGAffineTransformRotate(transform, -M_PI_2);
  750. break;
  751. case UIImageOrientationUp:
  752. case UIImageOrientationUpMirrored:
  753. break;
  754. }
  755. switch (srcImg.imageOrientation) {
  756. case UIImageOrientationUpMirrored:
  757. case UIImageOrientationDownMirrored:
  758. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  759. transform = CGAffineTransformScale(transform, -1,1);
  760. break;
  761. case UIImageOrientationLeftMirrored:
  762. case UIImageOrientationRightMirrored:
  763. transform = CGAffineTransformTranslate(transform, srcImg.size.height,0);
  764. transform = CGAffineTransformScale(transform, -1,1);
  765. break;
  766. case UIImageOrientationUp:
  767. case UIImageOrientationDown:
  768. case UIImageOrientationLeft:
  769. case UIImageOrientationRight:
  770. break;
  771. }
  772. CGContextRef ctx =CGBitmapContextCreate(NULL, srcImg.size.width, srcImg.size.height,
  773. CGImageGetBitsPerComponent(srcImg.CGImage),0,
  774. CGImageGetColorSpace(srcImg.CGImage),
  775. CGImageGetBitmapInfo(srcImg.CGImage));
  776. CGContextConcatCTM(ctx, transform);
  777. switch (srcImg.imageOrientation) {
  778. case UIImageOrientationLeft:
  779. case UIImageOrientationLeftMirrored:
  780. case UIImageOrientationRight:
  781. case UIImageOrientationRightMirrored:
  782. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.height,srcImg.size.width), srcImg.CGImage);
  783. break;
  784. default:
  785. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.width,srcImg.size.height), srcImg.CGImage);
  786. break;
  787. }
  788. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  789. UIImage *img = [UIImage imageWithCGImage:cgimg];
  790. CGContextRelease(ctx);
  791. CGImageRelease(cgimg);
  792. return img;
  793. }
  794. + (NSString *)getTaskUidStr
  795. {
  796. NSInteger num = 6;
  797. NSString *string = [[NSString alloc]init];
  798. for (int i = 0; i < num; i++) {
  799. int number = arc4random() % 36;
  800. if (number < 10) {
  801. int figure = arc4random() % 10;
  802. NSString *tempString = [NSString stringWithFormat:@"%d", figure];
  803. string = [string stringByAppendingString:tempString];
  804. }else {
  805. int figure = (arc4random() % 26) + 97;
  806. char character = figure;
  807. NSString *tempString = [NSString stringWithFormat:@"%c", character];
  808. string = [string stringByAppendingString:tempString];
  809. }
  810. }
  811. return string;
  812. }
  813. + (void)lc_setAlternateIconName:(NSString*)iconName
  814. {
  815. //超级签换不了图片 旧版本升级会有问题 不要了
  816. //anti apple private method call analyse
  817. // if ([[UIApplication sharedApplication] respondsToSelector:@selector(supportsAlternateIcons)] &&
  818. // [[UIApplication sharedApplication] supportsAlternateIcons])
  819. // {
  820. // NSMutableString *selectorString = [[NSMutableString alloc] initWithCapacity:40];
  821. // [selectorString appendString:@"_setAlternate"];
  822. // [selectorString appendString:@"IconName:"];
  823. // [selectorString appendString:@"completionHandler:"];
  824. //
  825. // SEL selector = NSSelectorFromString(selectorString);
  826. // IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
  827. // void (*func)(id, SEL, id, id) = (void *)imp;
  828. // if (func)
  829. // {
  830. // func([UIApplication sharedApplication], selector, iconName, ^(NSError * _Nullable error) {});
  831. // }
  832. // }
  833. }
  834. + (UIViewController *)appRootViewController {
  835. UIViewController *appRootVC = [iTools getKeyWindow].rootViewController;
  836. UIViewController *topVC = appRootVC;
  837. while (topVC.presentedViewController) {
  838. topVC = topVC.presentedViewController;
  839. }
  840. return topVC;
  841. }
  842. /**
  843. * 压缩图片
  844. * image:将要压缩的图片 size:压缩后的尺寸
  845. */
  846. + (UIImage*)OriginImage:(UIImage *)image scaleToSize:(CGSize)size
  847. {
  848. // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
  849. //UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
  850. UIGraphicsBeginImageContext(CGSizeMake(size.width, size.height));
  851. [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
  852. UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
  853. UIGraphicsEndImageContext();
  854. return scaledImage; //返回的就是已经改变的图片
  855. }
  856. // 时间戳转时间,时间戳为13位是精确到毫秒的,10位精确到秒
  857. + (NSString *)getDateStringWithTimeStr:(NSString* )str{
  858. NSTimeInterval time= [str doubleValue];//传入的时间戳str如果是精确到毫秒的记得要/1000
  859. if(str.length == 13){//传入的时间戳str如果是精确到毫秒的记得要/1000
  860. time = time/1000;
  861. }
  862. NSDate *detailDate=[NSDate dateWithTimeIntervalSince1970:time];
  863. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //实例化一个NSDateFormatter对象
  864. //设定时间格式,这里可以设置成自己需要的格式
  865. //[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss SS"];
  866. [dateFormatter setDateFormat:@"yyyy-MM-dd"];
  867. NSString *currentDateStr = [dateFormatter stringFromDate: detailDate];
  868. return currentDateStr;
  869. }
  870. @end