iTools.m 40 KB

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