当前位置:   article > 正文

IOS 常用工具类方法(OC版本)_ios工具类产品玩法

ios工具类产品玩法
  1. //MARK: - 视图设置
  2. /**!
  3. * 设置视图阴影
  4. *
  5. * @para uView UIView 目标视图
  6. * @para shadowColor UIColor 阴影颜色
  7. * @para shadowOpacity Float 阴影透明度(0.0 ~ 1.0,默认0.5)
  8. * @para shadowRadius CGFloat 阴影半径(默认3)
  9. * @para shadowOffset CGSize 阴影偏移,x向右偏移,y向下偏移,默认(0, -3)
  10. */
  11. +(void)setViewShadowStyle:(UIView *)uView AndShadowColor:(UIColor *)sColor AndShadowOpacity:(CGFloat)sOpacity AndShadowRadius:(CGFloat)sRadius WithShadowOffset:(CGSize)sOffset{
  12. //shadowColor阴影颜色
  13. uView.layer.shadowColor = [sColor CGColor];
  14. //阴影透明度
  15. uView.layer.shadowOpacity = sOpacity;
  16. //阴影半径,默认3
  17. uView.layer.shadowRadius = sRadius;
  18. //shadowOffset阴影偏移,
  19. //x向右偏移(正值),y向下偏移(正值),默认(0, -3),这个跟shadowRadius配合使用
  20. uView.layer.shadowOffset = sOffset;
  21. //设置阴影此属性要设置为 false(masksToBounds 会造成离屏渲染)
  22. //uView.layer.masksToBounds = false
  23. UIBezierPath *p = [UIBezierPath bezierPathWithRect:uView.bounds];
  24. if(uView.layer.cornerRadius > 0){
  25. //存在圆角
  26. p = [UIBezierPath bezierPathWithRoundedRect:uView.bounds cornerRadius:uView.layer.cornerRadius];
  27. }
  28. uView.layer.shadowPath = p.CGPath;
  29. }
  30. /**! 视图抖动动画 */
  31. +(void)shakeAnimationForView:(UIView *)view{
  32. // 获取到当前的View
  33. CALayer *viewLayer = view.layer;
  34. // 获取当前View的位置
  35. CGPoint position = viewLayer.position;
  36. // 移动的两个终点位置
  37. CGPoint x = CGPointMake(position.x + 10, position.y);
  38. CGPoint y = CGPointMake(position.x - 10, position.y);
  39. // 设置动画
  40. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
  41. // 设置运动形式
  42. [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
  43. // 设置开始位置
  44. [animation setFromValue:[NSValue valueWithCGPoint:x]];
  45. // 设置结束位置
  46. [animation setToValue:[NSValue valueWithCGPoint:y]];
  47. // 设置自动反转
  48. [animation setAutoreverses:YES];
  49. // 设置时间
  50. [animation setDuration:.06];
  51. // 设置次数
  52. [animation setRepeatCount:3];
  53. // 添加上动画
  54. [viewLayer addAnimation:animation forKey:nil];
  55. }
  56. //MARK: - 相关动画设置
  57. /**! tabbar侧滑动画 */
  58. +(void)tabBarChangeAnimation:(UITabBarController *)tabBarController WithDirection:(NSInteger)direction{
  59. CATransition *transition = [[CATransition alloc] init];
  60. transition.duration = 0.2;
  61. transition.type = kCATransitionMoveIn;//kCATransitionReveal
  62. if(direction == 0) {
  63. transition.subtype = kCATransitionFromLeft;
  64. }
  65. else{
  66. transition.subtype = kCATransitionFromRight;
  67. }
  68. //transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
  69. transition.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionDefault];
  70. [[[tabBarController view] layer] addAnimation:transition forKey:@"reveal"];//switchView
  71. }
  72. //MARK: - Tabbar相关设置
  73. /**!
  74. * 设置tabBar的尺寸
  75. * 调用方法:自定义View 继承自 UITabBarController,在 viewWillLayoutSubviews 中使用:
  76. * [Utils setTabbarHeight:self.tabBar];
  77. */
  78. +(void)setTabbarHeight:(UITabBar *)tabBar{
  79. CGRect rectTabbar = tabBar.frame;
  80. if (rectTabbar.size.height >= 49) {
  81. rectTabbar.size.height = K_APP_TABBAR_HEIGHT;
  82. CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
  83. CGFloat statusBarHeight = statusBarFrame.size.height;
  84. if (statusBarHeight > 20.0) {
  85. rectTabbar.origin.y = K_APP_HEIGHT - K_APP_TABBAR_HEIGHT - 20;
  86. }
  87. else{
  88. rectTabbar.origin.y = K_APP_HEIGHT - K_APP_TABBAR_HEIGHT;
  89. }
  90. tabBar.frame = rectTabbar;
  91. }
  92. }
  93. /**!
  94. * 设置tabBar的尺寸 顶部边框线
  95. */
  96. +(void)setTopLine:(UITabBar *)tabBar{
  97. // [S] 顶部边框线
  98. NSData *topLineData = [[NSUserDefaults standardUserDefaults] dataForKey:K_APP_TABBAR_TOP_LINE];
  99. if (topLineData == nil || [topLineData length] <= 0) {
  100. CGRect rect = CGRectMake(0, 0, K_APP_WIDTH, 0.1);
  101. UIGraphicsBeginImageContext(rect.size);
  102. CGContextRef context = UIGraphicsGetCurrentContext();
  103. CGContextSetRGBFillColor(context, 223.0, 223.0, 223.0, 1.0);
  104. CGContextFillRect(context, rect);
  105. UIImage *imgTemp = UIGraphicsGetImageFromCurrentImageContext();
  106. UIGraphicsEndImageContext();
  107. topLineData = UIImagePNGRepresentation(imgTemp);
  108. [[NSUserDefaults standardUserDefaults] setObject:topLineData forKey:K_APP_TABBAR_TOP_LINE];
  109. [[NSUserDefaults standardUserDefaults] synchronize];
  110. }
  111. tabBar.shadowImage = [UIImage imageWithData:topLineData];
  112. // [E] 顶部边框线
  113. }
  114. /**!
  115. * 清除tabbar顶部边线
  116. */
  117. +(void)clearnTabBarTopLine:(UITabBar *)tabBar{
  118. NSData *clearnLineData = [[NSUserDefaults standardUserDefaults] dataForKey:K_APP_TABBAR_CLEARN_IMAGE];
  119. if (clearnLineData == nil || [clearnLineData length] <= 0) {
  120. CGRect rect = CGRectMake(0, 0, 1, 1);
  121. UIGraphicsBeginImageContext(rect.size);
  122. CGContextRef context = UIGraphicsGetCurrentContext();
  123. CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0.0);
  124. CGContextFillRect(context, rect);
  125. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  126. UIGraphicsEndImageContext();
  127. clearnLineData = UIImagePNGRepresentation(theImage);
  128. [[NSUserDefaults standardUserDefaults] setObject:clearnLineData forKey:K_APP_TABBAR_CLEARN_IMAGE];
  129. [[NSUserDefaults standardUserDefaults] synchronize];
  130. }
  131. tabBar.backgroundImage = [UIImage imageWithData:clearnLineData];
  132. tabBar.shadowImage = [UIImage imageWithData:clearnLineData];
  133. }
  134. //MARK: - 图片相关处理
  135. /**! 图片不变形处理 */
  136. +(void)imgNoTransformation:(UIImageView *)img{
  137. img.contentMode = UIViewContentModeScaleAspectFill;
  138. img.clipsToBounds = YES; //是否剪切掉超出 UIImageView 范围的图片
  139. img.contentScaleFactor = [UIScreen mainScreen].scale;
  140. }
  141. //MARK: - 信息验证
  142. /**!
  143. * 验证手机号
  144. * @return true 通过验证
  145. */
  146. +(BOOL)checkPhoneNo:(NSString *)strPhoneNo {
  147. if (!strPhoneNo || [strPhoneNo isEqualToString:@""]) {
  148. return NO;
  149. }
  150. NSString *strRegex = @"^1[34578]([0-9]{9})$";
  151. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
  152. return [predicate evaluateWithObject:strPhoneNo];
  153. }
  154. /**!
  155. * 验证邮箱
  156. * @return true 通过验证
  157. */
  158. +(BOOL)checkEmail:(NSString *)strEmail {
  159. if (!strEmail || [strEmail isEqualToString:@""]) {
  160. return NO;
  161. }
  162. NSString *strRegex = @"^[A-Z0-9a-z_\\.\\-]+\\@([A-Za-z0-9\\-]+\\.)+([A-Za-z0-9])+$";
  163. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
  164. return [predicate evaluateWithObject:strEmail];
  165. }
  166. /**!
  167. * 验证密码(密码为6~20位的数字字母)
  168. * @return true 通过验证
  169. */
  170. +(BOOL)checkPassword:(NSString *)strPwd {
  171. if (!strPwd || [strPwd isEqualToString:@""]) {
  172. return NO;
  173. }
  174. //长度限制
  175. NSUInteger length = strPwd.length;
  176. if (length < 6 || length > 20) {
  177. return NO;
  178. }
  179. //是否含有Emoji 表情
  180. if ([Utils stringContainsEmoji:strPwd]) {
  181. return NO;
  182. }
  183. NSString *strRegex = @"^[A-Za-z0-9 ]{6,20}$";
  184. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
  185. return [predicate evaluateWithObject:strPwd];
  186. }
  187. /**!
  188. * 验证验证码(长度6位的数字字母)
  189. * @return true 通过验证
  190. */
  191. +(BOOL)checkPhoneCode:(NSString *)strCode {
  192. if (!strCode || [strCode isEqualToString:@""]) {
  193. return NO;
  194. }
  195. //长度限制
  196. NSUInteger length = strCode.length;
  197. if (length > 6) {
  198. return NO;
  199. }
  200. NSString *strRegex = @"^[0-9a-zA-Z]{4,6}$";
  201. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
  202. return [predicate evaluateWithObject:strCode];
  203. }
  204. /**!
  205. * 验证姓名(字母或中文)
  206. * @params strName NSString
  207. * @params len NSInteger 长度
  208. * @return true 通过验证
  209. */
  210. +(BOOL)checkName:(NSString *)strName AndLength:(NSInteger)len {
  211. if (!strName || [strName isEqualToString:@""]) {
  212. return NO;
  213. }
  214. //长度限制
  215. NSUInteger length = strName.length;
  216. if (length > len) {
  217. return NO;
  218. }
  219. NSString *strRegex = [NSString stringWithFormat:@"^[A-Za-z\\u4e00-\\u9fa5]{2,%lD}$",len];
  220. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
  221. return [predicate evaluateWithObject:strName];
  222. }
  223. /**!
  224. * 验证身份证(15/18位)
  225. * @params value NSString
  226. * @return true 通过验证
  227. */
  228. +(BOOL)checkIDCardNumber:(NSString *)value {
  229. value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  230. NSInteger length = 0;
  231. if (!value) return NO;
  232. else {
  233. length = value.length;
  234. //不满足15位和18位,即身份证错误
  235. if (length != 15 && length != 18) return NO;
  236. }
  237. // 省份代码
  238. NSArray *areasArray = @[@"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"];
  239. // 检测省份身份行政区代码
  240. NSString *valueStart2 = [value substringToIndex:2];
  241. BOOL areaFlag = NO; //标识省份代码是否正确
  242. for (NSString *areaCode in areasArray) {
  243. if ([areaCode isEqualToString:valueStart2]) {
  244. areaFlag = YES;
  245. break;
  246. }
  247. }
  248. if (!areaFlag) return NO;
  249. NSRegularExpression *regularExpression;
  250. NSUInteger numberofMatch;
  251. int year = 0;
  252. //分为15位、18位身份证进行校验
  253. switch (length) {
  254. case 15:
  255. //获取年份对应的数字
  256. year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
  257. if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
  258. //创建正则表达式 NSRegularExpressionCaseInsensitive:不区分字母大小写的模式
  259. regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
  260. options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
  261. }
  262. else{
  263. regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
  264. options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
  265. }
  266. //使用正则表达式匹配字符串 NSMatchingReportProgress:找到最长的匹配字符串后调用block回调
  267. numberofMatch = [regularExpression numberOfMatchesInString:value
  268. options:NSMatchingReportProgress
  269. range:NSMakeRange(0, value.length)];
  270. if(numberofMatch >0) return YES;
  271. else return NO;
  272. case 18:
  273. year = [value substringWithRange:NSMakeRange(6,4)].intValue;
  274. if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
  275. regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$"
  276. options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
  277. }
  278. else{
  279. regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$"
  280. options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
  281. }
  282. numberofMatch = [regularExpression numberOfMatchesInString:value
  283. options:NSMatchingReportProgress
  284. range:NSMakeRange(0, value.length)];
  285. if(numberofMatch >0) {
  286. //1:校验码的计算方法 身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584216379105842。将这17位数字和系数相乘的结果相加。
  287. int S = [value substringWithRange:NSMakeRange(0,1)].intValue*7 + [value substringWithRange:NSMakeRange(10,1)].intValue *7 + [value substringWithRange:NSMakeRange(1,1)].intValue*9 + [value substringWithRange:NSMakeRange(11,1)].intValue *9 + [value substringWithRange:NSMakeRange(2,1)].intValue*10 + [value substringWithRange:NSMakeRange(12,1)].intValue *10 + [value substringWithRange:NSMakeRange(3,1)].intValue*5 + [value substringWithRange:NSMakeRange(13,1)].intValue *5 + [value substringWithRange:NSMakeRange(4,1)].intValue*8 + [value substringWithRange:NSMakeRange(14,1)].intValue *8 + [value substringWithRange:NSMakeRange(5,1)].intValue*4 + [value substringWithRange:NSMakeRange(15,1)].intValue *4 + [value substringWithRange:NSMakeRange(6,1)].intValue*2 + [value substringWithRange:NSMakeRange(16,1)].intValue *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
  288. //2:用加出来和除以11,看余数是多少?余数只可能有01234567891011个数字
  289. int Y = S %11;
  290. NSString *M =@"F";
  291. NSString *JYM =@"10X98765432";
  292. M = [JYM substringWithRange:NSMakeRange(Y,1)];
  293. // 3:获取校验位
  294. NSString *lastStr = [value substringWithRange:NSMakeRange(17,1)];
  295. NSLog(@"%@",M);
  296. NSLog(@"%@",[value substringWithRange:NSMakeRange(17,1)]);
  297. //4:检测ID的校验位
  298. if ([lastStr isEqualToString:@"x"]) {
  299. if ([M isEqualToString:@"X"]) return YES;
  300. else return NO;
  301. }
  302. else{
  303. if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) return YES;
  304. else return NO;
  305. }
  306. }
  307. else return NO;
  308. default:
  309. return NO;
  310. }
  311. }
  312. //MARK: - 相关App是否有安装检测
  313. //https://www.zhihu.com/question/19907735
  314. /**! 是否有安装QQ */
  315. +(BOOL)isInstallForQQ{
  316. //QQ mqq:// 或 mqqiapi://
  317. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) {
  318. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqqiapi://"]]) {
  319. return NO;
  320. }
  321. }
  322. return YES;
  323. }
  324. /**! 是否有安装微信 */
  325. +(BOOL)isInstallForWechat {
  326. //微信 weixin:// 或 wechat://
  327. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) {
  328. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"wechat://"]]) {
  329. return NO;
  330. }
  331. }
  332. return YES;
  333. }
  334. /**! 是否有安装新浪微博 */
  335. +(BOOL)isInstallForSina {
  336. //新浪微博 weibo:// 或 sinaweibo://
  337. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weibo://"]]) {
  338. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"sinaweibo://"]]) {
  339. return NO;
  340. }
  341. }
  342. return YES;
  343. }
  344. /**! 是否有安装支付宝 */
  345. +(BOOL)isInstallForAliPay {
  346. //支付宝 alipay://
  347. if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://"]]) {
  348. return NO;
  349. }
  350. return YES;
  351. }
  352. //MARK: - 获取设备信息
  353. /**!
  354. * 获取当前设备的UUID
  355. */
  356. +(NSString *)getCurrentDeviceUUID {
  357. NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor];
  358. return [uuid UUIDString];
  359. }
  360. /**!
  361. * 获取手机具体型号
  362. * 需要添加 #import <sys/utsname.h> 引用
  363. * 调用:[Utils currentModel:[NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding]]
  364. */
  365. +(NSString *)currentModel:(NSString *)phoneModel {
  366. if ([phoneModel isEqualToString:@"iPhone3,1"] ||
  367. [phoneModel isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
  368. if ([phoneModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
  369. if ([phoneModel isEqualToString:@"iPhone5,1"] ||
  370. [phoneModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
  371. if ([phoneModel isEqualToString:@"iPhone5,3"] ||
  372. [phoneModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5C";
  373. if ([phoneModel isEqualToString:@"iPhone6,1"] ||
  374. [phoneModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
  375. if ([phoneModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
  376. if ([phoneModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
  377. if ([phoneModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
  378. if ([phoneModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
  379. if ([phoneModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
  380. if ([phoneModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
  381. if ([phoneModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
  382. if ([phoneModel isEqualToString:@"iPhone10,1"] ||
  383. [phoneModel isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
  384. if ([phoneModel isEqualToString:@"iPhone10,2"] ||
  385. [phoneModel isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
  386. if ([phoneModel isEqualToString:@"iPhone10,3"] ||
  387. [phoneModel isEqualToString:@"iPhone10,6"]) return @"iPhone X";
  388. if ([phoneModel isEqualToString:@"iPad1,1"]) return @"iPad";
  389. if ([phoneModel isEqualToString:@"iPad2,1"] ||
  390. [phoneModel isEqualToString:@"iPad2,2"] ||
  391. [phoneModel isEqualToString:@"iPad2,3"] ||
  392. [phoneModel isEqualToString:@"iPad2,4"]) return @"iPad 2";
  393. if ([phoneModel isEqualToString:@"iPad3,1"] ||
  394. [phoneModel isEqualToString:@"iPad3,2"] ||
  395. [phoneModel isEqualToString:@"iPad3,3"]) return @"iPad 3";
  396. if ([phoneModel isEqualToString:@"iPad3,4"] ||
  397. [phoneModel isEqualToString:@"iPad3,5"] ||
  398. [phoneModel isEqualToString:@"iPad3,6"]) return @"iPad 4";
  399. if ([phoneModel isEqualToString:@"iPad4,1"] ||
  400. [phoneModel isEqualToString:@"iPad4,2"] ||
  401. [phoneModel isEqualToString:@"iPad4,3"]) return @"iPad Air";
  402. if ([phoneModel isEqualToString:@"iPad5,3"] ||
  403. [phoneModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
  404. if ([phoneModel isEqualToString:@"iPad6,3"] ||
  405. [phoneModel isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7-inch";
  406. if ([phoneModel isEqualToString:@"iPad6,7"] ||
  407. [phoneModel isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9-inch";
  408. if ([phoneModel isEqualToString:@"iPad6,11"] ||
  409. [phoneModel isEqualToString:@"iPad6,12"]) return @"iPad 5";
  410. if ([phoneModel isEqualToString:@"iPad7,1"] ||
  411. [phoneModel isEqualToString:@"iPad7,2"]) return @"iPad Pro 12.9-inch 2";
  412. if ([phoneModel isEqualToString:@"iPad7,3"] ||
  413. [phoneModel isEqualToString:@"iPad7,4"]) return @"iPad Pro 10.5-inch";
  414. if ([phoneModel isEqualToString:@"iPad2,5"] ||
  415. [phoneModel isEqualToString:@"iPad2,6"] ||
  416. [phoneModel isEqualToString:@"iPad2,7"]) return @"iPad mini";
  417. if ([phoneModel isEqualToString:@"iPad4,4"] ||
  418. [phoneModel isEqualToString:@"iPad4,5"] ||
  419. [phoneModel isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
  420. if ([phoneModel isEqualToString:@"iPad4,7"] ||
  421. [phoneModel isEqualToString:@"iPad4,8"] ||
  422. [phoneModel isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
  423. if ([phoneModel isEqualToString:@"iPad5,1"] ||
  424. [phoneModel isEqualToString:@"iPad5,2"]) return @"iPad mini 4";
  425. if ([phoneModel isEqualToString:@"iPod1,1"]) return @"iTouch";
  426. if ([phoneModel isEqualToString:@"iPod2,1"]) return @"iTouch2";
  427. if ([phoneModel isEqualToString:@"iPod3,1"]) return @"iTouch3";
  428. if ([phoneModel isEqualToString:@"iPod4,1"]) return @"iTouch4";
  429. if ([phoneModel isEqualToString:@"iPod5,1"]) return @"iTouch5";
  430. if ([phoneModel isEqualToString:@"iPod7,1"]) return @"iTouch6";
  431. if ([phoneModel isEqualToString:@"i386"] || [phoneModel isEqualToString:@"x86_64"]) return @"iPhone Simulator";
  432. return @"Unknown";
  433. }
  434. //MARK: - Emoji表情检测
  435. /**!
  436. * 是否含有Emoji 表情(true 含有)
  437. */
  438. +(BOOL)stringContainsEmoji:(NSString *)string{
  439. __block BOOL returnValue = FALSE;
  440. [string enumerateSubstringsInRange:NSMakeRange(0, string.length)
  441. options:NSStringEnumerationByComposedCharacterSequences
  442. usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
  443. unichar hs = [substring characterAtIndex:0];
  444. // surrogate pair
  445. if (0xd800 <= hs && hs <= 0xdbff) {
  446. if (substring.length > 1) {
  447. unichar ls =[substring characterAtIndex:1];
  448. NSInteger uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
  449. if (0x1d000 <= uc && uc <= 0x1f77f){
  450. returnValue = YES;
  451. }
  452. }
  453. }
  454. else if (substring.length > 1) {
  455. unichar ls =[substring characterAtIndex:1];
  456. if (ls == 0x20e3){
  457. returnValue = YES;
  458. }
  459. }
  460. else {
  461. // non surrogate
  462. if (0x2100 <= hs && hs <= 0x27ff){
  463. returnValue = YES;
  464. }
  465. else if (0x2B05 <= hs && hs <= 0x2b07){
  466. returnValue = YES;
  467. }
  468. else if (0x2934 <= hs && hs <= 0x2935){
  469. returnValue = YES;
  470. }
  471. else if (0x3297 <= hs && hs <= 0x3299){
  472. returnValue = YES;
  473. }
  474. else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50){
  475. returnValue = YES;
  476. }
  477. }
  478. }];
  479. return returnValue;
  480. }
  481. //MARK: - 时间处理
  482. /** 将Linux时间装换为字符串时间 */
  483. +(NSString *)formatDateToString:(NSTimeInterval)linuxTime WithFormat:(NSString *)format{
  484. long long _timeInterval = linuxTime;
  485. NSString *_temp = [NSString stringWithFormat:@"%.0f",linuxTime];
  486. if (_temp.length > 10) {
  487. _temp = [_temp substringToIndex:10];
  488. _timeInterval = [_temp longLongValue];
  489. }
  490. NSDate *date = [NSDate dateWithTimeIntervalSince1970:_timeInterval];
  491. NSDateFormatter *fomatter = [[NSDateFormatter alloc] init];
  492. [fomatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC+8"]];
  493. [fomatter setDateFormat:format];
  494. NSString *_strInfo = [fomatter stringFromDate:date];
  495. return _strInfo;
  496. }
  497. /** 获取当前时间 */
  498. +(NSString *)getCurrentDateToString:(NSString *)format{
  499. NSDate *date = [NSDate date];
  500. NSDateFormatter *fomatter = [[NSDateFormatter alloc] init];
  501. [fomatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC+8"]];
  502. [fomatter setDateFormat:format];
  503. NSString *_strInfo = [fomatter stringFromDate:date];
  504. return _strInfo;
  505. }
  506. //MARK: - 缓存相关设置
  507. /**!
  508. * 获取系统缓存
  509. * //缓存目录
  510. #define K_APPLICATION_CACHE_PATH [NSString stringWithFormat:@"%@/%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject],K_APP_BUNDLE_ID]
  511. */
  512. +(NSString *)getAppCacheSize{
  513. NSFileManager *fileManage = [NSFileManager defaultManager];
  514. NSString *strResult = @"0M";
  515. BOOL isDirectory = NO;
  516. //是否存在
  517. if ([fileManage fileExistsAtPath:K_APPLICATION_CACHE_PATH isDirectory:&isDirectory]) {
  518. @try {
  519. float fsize = 0.0;
  520. NSDictionary *attributDic;
  521. //文件夹
  522. if(isDirectory) {
  523. NSString *tempPath;
  524. //获取该目录下所有文件
  525. for (NSString *strItem in [fileManage subpathsAtPath:K_APPLICATION_CACHE_PATH]) {
  526. tempPath = [NSString stringWithFormat:@"%@/%@",K_APPLICATION_CACHE_PATH,strItem];
  527. //存在,且为文件
  528. if ([fileManage fileExistsAtPath:tempPath isDirectory:&isDirectory] && isDirectory == NO) {
  529. attributDic = [fileManage attributesOfItemAtPath:tempPath error:nil];
  530. fsize = fsize + [[attributDic valueForKey:NSFileSize] floatValue];
  531. }
  532. }
  533. }
  534. else{
  535. attributDic = [fileManage attributesOfItemAtPath:K_APPLICATION_CACHE_PATH error:nil];
  536. fsize = [[attributDic valueForKey:NSFileSize] floatValue];
  537. }
  538. //计算缓存大小
  539. fsize = fsize / (1024.0 * 1024.0);
  540. if (fsize > 0.0) {
  541. strResult = [NSString stringWithFormat:@"%.2fM",fsize];
  542. }
  543. } @catch (NSException *exception) {
  544. NSLog(@"获取缓存异常:%@",exception);
  545. }
  546. }
  547. return strResult;
  548. }
  549. /**!
  550. * 清理系统缓存
  551. */
  552. +(BOOL)clearnAppCache{
  553. NSFileManager *fileManage = [NSFileManager defaultManager];
  554. NSString *tempPath;
  555. BOOL isDic = NO;
  556. BOOL isOk = NO;
  557. //路径存在,且为文件夹
  558. if ([fileManage fileExistsAtPath:K_APPLICATION_CACHE_PATH isDirectory:&isDic] && isDic) {
  559. @try {
  560. for (NSString *strItem in [fileManage subpathsAtPath:K_APPLICATION_CACHE_PATH]) {
  561. tempPath = [NSString stringWithFormat:@"%@/%@",K_APPLICATION_CACHE_PATH,strItem];
  562. //移除
  563. if ([fileManage fileExistsAtPath:tempPath]) {
  564. [fileManage removeItemAtPath:tempPath error:nil];
  565. }
  566. }
  567. isOk = YES;
  568. } @catch (NSException *exception) {
  569. NSLog(@"清理缓存异常:%@",exception);
  570. }
  571. }
  572. return isOk;
  573. }
  574. //MARK: - 公共的请求方法
  575. /**! 开启设置权限 */
  576. +(void)openSetting{
  577. NSString *strUrl = UIApplicationOpenSettingsURLString;
  578. NSURL *url = [NSURL URLWithString:strUrl];
  579. if ([[UIApplication sharedApplication] canOpenURL:url]) {
  580. [[UIApplication sharedApplication] openURL:url];
  581. }
  582. }
  583. //MARK: - 获取文本的宽度
  584. /**!
  585. * 获取文本的宽度
  586. */
  587. +(CGFloat)getWidthForString:(NSString *)value andFontSize:(UIFont *)font andHeight:(CGFloat)height{
  588. CGSize sizeToFit = [value sizeWithFont:font constrainedToSize:CGSizeMake(CGFLOAT_MAX, height) lineBreakMode:NSLineBreakByWordWrapping];//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
  589. return sizeToFit.width;
  590. }
  591. /** 获取文本的高度 */
  592. +(CGFloat)getHeightForString:(NSString *)value andFontSize:(UIFont *)font andWidth:(CGFloat)width{
  593. CGSize sizeToFit = [value sizeWithFont:font constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
  594. return sizeToFit.height;
  595. }
  596. /**!
  597. * 获取文本框的高度
  598. */
  599. +(CGFloat)getTextViewHeight:(UITextView *)textView AndFixedWidth:(CGFloat)width {
  600. CGFloat fw = 0.0;
  601. CGSize size = CGSizeMake(width, CGFLOAT_MAX);
  602. CGSize constraint = [textView sizeThatFits:size];
  603. fw = constraint.height + 10.0;
  604. return fw;
  605. }
  606. //MARK: - 设置富文本
  607. /**! 设置富文本 */
  608. +(NSAttributedString *)setAttributeStringText:(NSString *)strFullText andFullTextFont:(UIFont *)textFont andFullTextColor:(UIColor *)textColor withChangeText:(NSString *)changeText withChangeFont:(UIFont *)changFont withChangeColor:(UIColor *)changeColor isLineThrough:(BOOL)lineThrough{
  609. NSDictionary<NSAttributedStringKey,id> *dicAttr;
  610. NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:strFullText];
  611. //需要改变的文本
  612. NSRange range = [strFullText rangeOfString:changeText];
  613. dicAttr = @{
  614. NSFontAttributeName:changFont,
  615. NSForegroundColorAttributeName:changeColor
  616. };
  617. if (lineThrough) {
  618. [dicAttr setValue:[[NSNumber alloc] initWithInt:1] forKey:NSStrikethroughStyleAttributeName];
  619. }
  620. [attributeString addAttributes:dicAttr range:range];
  621. //不需要改变的文本
  622. NSString *oldText = [strFullText stringByReplacingOccurrencesOfString:changeText withString:@""];
  623. range = [strFullText rangeOfString:oldText];
  624. dicAttr = @{
  625. NSFontAttributeName:textFont,
  626. NSForegroundColorAttributeName:textColor
  627. };
  628. [attributeString addAttributes:dicAttr range:range];
  629. return attributeString;
  630. }
  631. //MARK: - Json 与 字典、数组类型转换
  632. /**!
  633. * 数组转换为NString
  634. * @returns: NString
  635. */
  636. +(NSString *)getJSONStringFromData:(id)idData{
  637. if (![NSJSONSerialization isValidJSONObject:idData]) {
  638. NSLog(@"无法解析出JSONString");
  639. return @"";
  640. }
  641. NSData *data = [NSJSONSerialization dataWithJSONObject:idData
  642. options:NSJSONWritingPrettyPrinted
  643. error:nil];
  644. NSString *strReturn = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  645. return strReturn;
  646. }
  647. //MARK: - 网络请求方法
  648. /**
  649. * 格式化请求参数
  650. * @param dicParasm NSDictionary
  651. */
  652. +(NSDictionary *)formatRequestParams:(NSDictionary *)dicParasm{
  653. NSMutableDictionary *_dicTemp = [[NSMutableDictionary alloc] initWithDictionary:dicParasm];
  654. if ([TDUser userIsLogin]) {
  655. [_dicTemp setObject:[TDUser getLoginToken] forKey:@"token"];
  656. }
  657. return _dicTemp;
  658. }
  659. /**!
  660. * post 接口请求
  661. * @para strUrl String 请求地址
  662. * @para paras [String:Any] 请求参数
  663. * @para successBack 成功回调
  664. * @para failureBack 失败回调
  665. */
  666. +(void)postRequestForServerData:(NSString *)strUrl withParameters:(NSDictionary *)paras AndHTTPHeaderField:(void(^)(AFHTTPRequestSerializer *_requestSerializer))headerField AndSuccessBack:(void(^)(id _responseData))successBack AndFailureBack:(void(^)(NSString *_strError))failureBack WithisLoading:(BOOL)isLoading{
  667. NSLog(@"请求地址:%@,参数:%@",strUrl,paras);
  668. if (![K_APP_REACHABILITY isReachable]) {
  669. dispatch_async(dispatch_get_main_queue(), ^{
  670. [MBProgressHUD showError:@"网络连接异常"];
  671. });
  672. NSLog(@"网络连接异常");
  673. return;
  674. }
  675. __block UIView *_view;
  676. if (isLoading) {
  677. dispatch_async(dispatch_get_main_queue(), ^{
  678. _view = [[AppDelegate shareInstance] window].rootViewController.view;
  679. if (_view) {
  680. [MBProgressHUD showMessage:@"" toView:_view];
  681. }
  682. else {
  683. [MBProgressHUD showMessage:@""];
  684. }
  685. });
  686. }
  687. AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
  688. //设置HTTPHeaderField
  689. if (headerField) {
  690. AFHTTPRequestSerializer *_requestSerializer = [AFHTTPRequestSerializer serializer];
  691. headerField(_requestSerializer);
  692. sessionManager.requestSerializer = _requestSerializer;
  693. }
  694. //提交请求
  695. [sessionManager POST:strUrl
  696. parameters:paras
  697. progress:nil
  698. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  699. if (isLoading) {
  700. dispatch_async(dispatch_get_main_queue(), ^{
  701. if (_view != nil){
  702. BOOL exists = NO;
  703. for (UIView *object in _view.subviews) {
  704. if ([object isMemberOfClass:[MBProgressHUD class]]) {
  705. exists = YES;
  706. break;
  707. }
  708. }
  709. if (!exists) {
  710. [MBProgressHUD showMessage:@"" toView:_view];
  711. }
  712. }
  713. else
  714. [MBProgressHUD hideHUD];
  715. });
  716. }
  717. NSLog(@"请求结果:%@",responseObject);
  718. NSDictionary *jsonData = responseObject;
  719. NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
  720. NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
  721. //成功
  722. if (resultCode == K_APP_REQUEST_SUCCESS_CODE) {
  723. if (successBack != nil) {
  724. successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
  725. }
  726. }
  727. else if(resultCode == 200){
  728. if (successBack != nil) {
  729. successBack(jsonData);
  730. }
  731. }
  732. //token 失效,需重新登录
  733. else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE){
  734. if (failureBack != nil) {
  735. failureBack(strMessage);
  736. }
  737. NSLog(@"登录Token 失效");
  738. [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
  739. }
  740. else{
  741. [MBProgressHUD showError:strMessage];
  742. }
  743. }
  744. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  745. if (isLoading) {
  746. dispatch_async(dispatch_get_main_queue(), ^{
  747. if (_view != nil)
  748. [MBProgressHUD hideHUDForView:_view];
  749. else
  750. [MBProgressHUD hideHUD];
  751. });
  752. }
  753. if (failureBack != nil) {
  754. failureBack([error localizedDescription]);
  755. }
  756. NSLog(@"请求异常:%@",[error localizedDescription]);
  757. }];
  758. }
  759. /**!
  760. * get 接口请求
  761. * @para strUrl String 请求地址
  762. * @para paras [String:Any] 请求参数
  763. * @para successBack 成功回调
  764. * @para failureBack 失败回调
  765. */
  766. +(void)getRequestForServerData:(NSString *)strUrl withParameters:(NSDictionary *)paras AndHTTPHeaderField:(void(^)(AFHTTPRequestSerializer *_requestSerializer))headerField AndSuccessBack:(void(^)(id _responseData))successBack AndFailureBack:(void(^)(NSString *_strError))failureBack WithisLoading:(BOOL)isLoading{
  767. NSLog(@"请求地址:%@,参数:%@",strUrl,paras);
  768. if (![K_APP_REACHABILITY isReachable]) {
  769. dispatch_async(dispatch_get_main_queue(), ^{
  770. [MBProgressHUD showError:@"网络连接异常"];
  771. });
  772. NSLog(@"网络连接异常");
  773. return;
  774. }
  775. __block UIView *_view;
  776. if (isLoading) {
  777. dispatch_async(dispatch_get_main_queue(), ^{
  778. _view = [[AppDelegate shareInstance] window].rootViewController.view;
  779. if (_view) {
  780. [MBProgressHUD showMessage:@"" toView:_view];
  781. }
  782. else {
  783. [MBProgressHUD showMessage:@""];
  784. }
  785. });
  786. }
  787. AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
  788. //设置HTTPHeaderField
  789. if (headerField) {
  790. AFHTTPRequestSerializer *_requestSerializer = [AFHTTPRequestSerializer serializer];
  791. headerField(_requestSerializer);
  792. sessionManager.requestSerializer = _requestSerializer;
  793. }
  794. //提交请求
  795. [sessionManager GET:strUrl
  796. parameters:paras
  797. progress:nil
  798. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  799. if (isLoading) {
  800. dispatch_async(dispatch_get_main_queue(), ^{
  801. if (_view != nil){
  802. BOOL exists = NO;
  803. for (UIView *object in _view.subviews) {
  804. if ([object isMemberOfClass:[MBProgressHUD class]]) {
  805. exists = YES;
  806. break;
  807. }
  808. }
  809. if (!exists) {
  810. [MBProgressHUD showMessage:@"" toView:_view];
  811. }
  812. }
  813. else
  814. [MBProgressHUD hideHUD];
  815. });
  816. }
  817. NSLog(@"请求结果:%@",responseObject);
  818. NSDictionary *jsonData = responseObject;
  819. NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
  820. NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
  821. //成功
  822. if (resultCode == K_APP_REQUEST_SUCCESS_CODE) {
  823. if (successBack != nil) {
  824. if ([jsonData.allKeys containsObject:K_APP_REQUEST_DATA]) {
  825. successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
  826. }
  827. else{
  828. successBack(jsonData);
  829. }
  830. }
  831. }
  832. else if(resultCode == 200 || resultCode == 0){
  833. //token 失效,需重新登录
  834. if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE && [strMessage containsString:@"token"]){
  835. if (failureBack != nil) {
  836. failureBack(strMessage);
  837. }
  838. NSLog(@"登录Token 失效");
  839. [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
  840. }
  841. else{
  842. if (successBack != nil) {
  843. successBack(jsonData);
  844. }
  845. }
  846. }
  847. else{
  848. [MBProgressHUD showError:strMessage];
  849. }
  850. }
  851. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  852. if (isLoading) {
  853. dispatch_async(dispatch_get_main_queue(), ^{
  854. if (_view != nil)
  855. [MBProgressHUD hideHUDForView:_view];
  856. else
  857. [MBProgressHUD hideHUD];
  858. });
  859. }
  860. if (failureBack != nil) {
  861. failureBack([error localizedDescription]);
  862. }
  863. NSLog(@"请求异常:%@",[error localizedDescription]);
  864. }];
  865. }
  866. /**
  867. * 异步POST请求:以body方式,支持数组
  868. *
  869. * @param url 请求的url
  870. * @param body body数据
  871. * @param success 成功回调
  872. * @param failure 失败回调
  873. * @param isLoading BOOL
  874. */
  875. +(void)postWithUrl:(NSString *)url body:(NSData *)body WithSuccess:(void(^)(id _Nonnull response))success WithFailure:(void(^)(NSString *error))failure WithisLoading:(BOOL)isLoading{
  876. NSLog(@"请求地址:%@",url);
  877. if (![K_APP_REACHABILITY isReachable]) {
  878. dispatch_async(dispatch_get_main_queue(), ^{
  879. [MBProgressHUD showError:@"网络连接异常"];
  880. });
  881. NSLog(@"网络连接异常");
  882. return;
  883. }
  884. __block UIView *_view;
  885. if (isLoading) {
  886. dispatch_async(dispatch_get_main_queue(), ^{
  887. _view = [[AppDelegate shareInstance] window].rootViewController.view;
  888. if (_view) {
  889. BOOL exists = NO;
  890. for (UIView *object in _view.subviews) {
  891. if ([object isMemberOfClass:[MBProgressHUD class]]) {
  892. exists = YES;
  893. break;
  894. }
  895. }
  896. if (!exists) {
  897. [MBProgressHUD showMessage:@"" toView:_view];
  898. }
  899. }
  900. else {
  901. [MBProgressHUD showMessage:@""];
  902. }
  903. });
  904. }
  905. AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
  906. NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
  907. request.timeoutInterval = K_APP_URLTIME_OUT_INTERVAL;
  908. [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  909. [request setValue:@"application/x-www-form-urlencoded;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  910. [request setValue:@"application/x-plist;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  911. //设置body
  912. [request setHTTPBody:body];
  913. AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
  914. responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
  915. @"text/html",
  916. @"text/json",
  917. @"text/javascript",
  918. @"text/plain",
  919. nil];
  920. manager.responseSerializer = responseSerializer;
  921. [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
  922. NSLog(@"请求结果:%@",responseObject);
  923. if (isLoading) {
  924. dispatch_async(dispatch_get_main_queue(), ^{
  925. if (_view != nil)
  926. [MBProgressHUD hideHUDForView:_view];
  927. else
  928. [MBProgressHUD hideHUD];
  929. });
  930. }
  931. if (error == nil) {
  932. NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[responseObject mj_JSONData]
  933. options:NSJSONReadingMutableContainers
  934. error:nil];
  935. NSLog(@"请求结果2:%@",responseObject);
  936. NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
  937. NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
  938. //成功
  939. if (resultCode == K_APP_REQUEST_SUCCESS_CODE) {
  940. if (success) {
  941. if ([jsonData.allKeys containsObject:K_APP_REQUEST_DATA]) {
  942. success([jsonData valueForKey:K_APP_REQUEST_DATA]);
  943. }
  944. else{
  945. success(jsonData);
  946. }
  947. }
  948. }
  949. //token 失效,需重新登录
  950. else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE){
  951. if (failure != nil) {
  952. failure(strMessage);
  953. }
  954. NSLog(@"登录Token 失效");
  955. [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
  956. }
  957. else{
  958. if (failure != nil) {
  959. if (strMessage && ![strMessage isEqualToString:@""]) {
  960. failure(strMessage);
  961. }
  962. else{
  963. failure([error localizedDescription]);
  964. }
  965. }
  966. }
  967. }
  968. else {
  969. if (failure != nil) {
  970. failure([error localizedDescription]);
  971. }
  972. }
  973. }] resume];
  974. }
  975. /**!
  976. * 文件或图片上传
  977. * @para strUrl String 上传地址
  978. * @para uploadformDataBack 上传参数设置
  979. * @para successBack 成功回调
  980. * @para failureBack 失败回调
  981. */
  982. +(void)postImageUploadToServer:(NSString *)strUrl AndUploadformDataBack:(void(^)(id<AFMultipartFormData> formData))formDataBack AndSuccessBack:(void(^)(NSObject *_responseData))successBack AndFailureBack:(void(^)(NSString *_strError))failureBack WithisLoading:(BOOL)isLoading{
  983. NSLog(@"请求地址:%@",strUrl);
  984. if (![K_APP_REACHABILITY isReachable]) {
  985. [MBProgressHUD showError:@"网络连接异常"];
  986. NSLog(@"网络连接异常");
  987. return;
  988. }
  989. __block UIView *_view;
  990. if (isLoading) {
  991. dispatch_async(dispatch_get_main_queue(), ^{
  992. _view = [[AppDelegate shareInstance] window].rootViewController.view;
  993. if (_view) {
  994. BOOL exists = NO;
  995. for (UIView *object in _view.subviews) {
  996. if ([object isMemberOfClass:[MBProgressHUD class]]) {
  997. exists = YES;
  998. break;
  999. }
  1000. }
  1001. if (!exists) {
  1002. [MBProgressHUD showMessage:@"" toView:_view];
  1003. }
  1004. }
  1005. else {
  1006. [MBProgressHUD showMessage:@""];
  1007. }
  1008. });
  1009. }
  1010. AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
  1011. [sessionManager POST:strUrl
  1012. parameters:nil
  1013. constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  1014. //指定参数
  1015. if (formDataBack) {
  1016. formDataBack(formData);
  1017. }
  1018. }
  1019. progress:nil
  1020. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  1021. NSLog(@"请求结果:%@",responseObject);
  1022. if (isLoading) {
  1023. dispatch_async(dispatch_get_main_queue(), ^{
  1024. if (_view != nil)
  1025. [MBProgressHUD hideHUDForView:_view];
  1026. else
  1027. [MBProgressHUD hideHUD];
  1028. });
  1029. }
  1030. NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
  1031. NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
  1032. NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
  1033. //成功
  1034. if (resultCode == K_APP_REQUEST_SUCCESS_CODE) {
  1035. if (successBack) {
  1036. successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
  1037. }
  1038. }
  1039. //token 失效,需重新登录
  1040. else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE){
  1041. if (failureBack != nil) {
  1042. failureBack(strMessage);
  1043. }
  1044. NSLog(@"登录Token 失效");
  1045. [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
  1046. }
  1047. else{
  1048. [MBProgressHUD showError:strMessage];
  1049. }
  1050. }
  1051. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  1052. if (isLoading) {
  1053. dispatch_async(dispatch_get_main_queue(), ^{
  1054. if (_view != nil)
  1055. [MBProgressHUD hideHUDForView:_view];
  1056. else
  1057. [MBProgressHUD hideHUD];
  1058. });
  1059. }
  1060. if (failureBack != nil) {
  1061. failureBack([error localizedDescription]);
  1062. }
  1063. NSLog(@"请求结果:%@",[error localizedDescription]);
  1064. }];
  1065. }
  1066. /// 访问Bundle资源包中的图片
  1067. /// - Parameters:
  1068. /// - bclass: Bundle的class([self class]?可选)
  1069. /// - bName: Bundle的名称
  1070. /// - imgName: 带后缀的图片名 "xx.png"
  1071. /// - _imgFileName: 图片资源所在文件夹名称,可选
  1072. +(UIImage *_Nullable)imageForBuncleClass:(Class _Nullable)_bclass
  1073. andBundleName:(NSString *_Nonnull)_bName
  1074. withImageName:(NSString *_Nonnull)_imgName
  1075. andImagesFileName:(NSString *_Nonnull)_imgFileName {
  1076. UIImage *_img;
  1077. @try {
  1078. Class _class = _bclass;
  1079. if(!_bclass){
  1080. _class = NSClassFromString(_bName);
  1081. }
  1082. NSBundle *_bundle = [NSBundle bundleForClass:_class];
  1083. NSURL *_url = [_bundle URLForResource:_bName withExtension:@"bundle"];
  1084. NSString *_imgFN = _imgName;
  1085. if(_imgFileName && ![_imgFileName isEqualToString:@""]) {
  1086. _imgFN = [NSString stringWithFormat:@"%@/%@",_imgFileName,_imgName];
  1087. }
  1088. if (@available(iOS 13.0, *)) {
  1089. NSBundle *_imageBundle = [NSBundle bundleWithURL:_url];
  1090. _img = [UIImage imageNamed:_imgFN inBundle:_imageBundle withConfiguration:nil];
  1091. } else {
  1092. // Fallback on earlier versions
  1093. NSString *_path = [NSString stringWithFormat:@"%@/%@",[_url path],_imgFN];
  1094. _img = [UIImage imageWithContentsOfFile:_path];
  1095. }
  1096. } @catch (NSException *exception) {
  1097. NSLog(@"%@-%@",@"imageForBuncleClass",exception);
  1098. } @finally {
  1099. return _img;
  1100. }
  1101. }
  1102. /// 获取资源包里面的Xib
  1103. /// - Parameters:
  1104. /// - _bclass: Bundle的class([self class]可选)
  1105. /// - _bName: Bundle的名称
  1106. /// - _xibName: xib的名称
  1107. -(UINib *_Nullable)xibForBuncleClass:(Class _Nullable)_bclass
  1108. andBundleName:(NSString *_Nonnull)_bName
  1109. withXibName:(NSString *_Nonnull)_xibName{
  1110. UINib *nib;
  1111. @try {
  1112. Class _class = _bclass;
  1113. if(!_bclass){
  1114. _class = NSClassFromString(_bName);
  1115. }
  1116. NSBundle *_bundleClass = [NSBundle bundleForClass:_class];
  1117. NSURL *_url = [_bundleClass URLForResource:_bName withExtension:@"bundle"];
  1118. NSBundle *_bundle = [NSBundle bundleWithURL:_url];
  1119. if(!_bundle) {
  1120. _bundle = [NSBundle mainBundle];
  1121. }
  1122. nib = [UINib nibWithNibName:_xibName bundle:_bundle];
  1123. } @catch (NSException *exception) {
  1124. NSLog(@"%@-%@",@"xibForBuncleClass",exception);
  1125. } @finally {
  1126. return nib;
  1127. }
  1128. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/572091
推荐阅读
相关标签
  

闽ICP备14008679号