IOS 常用工具类方法(OC版本)

Posted 追夢秋陽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS 常用工具类方法(OC版本)相关的知识,希望对你有一定的参考价值。

//MARK: - 视图设置
/**!
 * 设置视图阴影
 *
 * @para uView        UIView  目标视图
 * @para shadowColor  UIColor 阴影颜色
 * @para shadowOpacity Float  阴影透明度(0.0 ~ 1.0,默认0.5)
 * @para shadowRadius CGFloat 阴影半径(默认3)
 * @para shadowOffset CGSize  阴影偏移,x向右偏移,y向下偏移,默认(0, -3)
 */
+(void)setViewShadowStyle:(UIView *)uView AndShadowColor:(UIColor *)sColor AndShadowOpacity:(CGFloat)sOpacity AndShadowRadius:(CGFloat)sRadius WithShadowOffset:(CGSize)sOffset
    
    //shadowColor阴影颜色
    uView.layer.shadowColor = [sColor CGColor];
    
    //阴影透明度
    uView.layer.shadowOpacity = sOpacity;
    
    //阴影半径,默认3
    uView.layer.shadowRadius = sRadius;
    
    //shadowOffset阴影偏移,
    //x向右偏移(正值),y向下偏移(正值),默认(0, -3),这个跟shadowRadius配合使用
    uView.layer.shadowOffset = sOffset;
    
    //设置阴影此属性要设置为 false(masksToBounds 会造成离屏渲染)
    //uView.layer.masksToBounds = false
    UIBezierPath *p = [UIBezierPath bezierPathWithRect:uView.bounds];
    if(uView.layer.cornerRadius > 0)
        //存在圆角
        p = [UIBezierPath bezierPathWithRoundedRect:uView.bounds cornerRadius:uView.layer.cornerRadius];
    
    uView.layer.shadowPath = p.CGPath;


/**! 视图抖动动画 */
+(void)shakeAnimationForView:(UIView *)view
    // 获取到当前的View
    CALayer *viewLayer = view.layer;
    
    // 获取当前View的位置
    CGPoint position = viewLayer.position;
    
    // 移动的两个终点位置
    CGPoint x = CGPointMake(position.x + 10, position.y);
    CGPoint y = CGPointMake(position.x - 10, position.y);
    
    // 设置动画
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    
    // 设置运动形式
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
    
    // 设置开始位置
    [animation setFromValue:[NSValue valueWithCGPoint:x]];
    
    // 设置结束位置
    [animation setToValue:[NSValue valueWithCGPoint:y]];
    
    // 设置自动反转
    [animation setAutoreverses:YES];
    
    // 设置时间
    [animation setDuration:.06];
    
    // 设置次数
    [animation setRepeatCount:3];
    
    // 添加上动画
    [viewLayer addAnimation:animation forKey:nil];



//MARK: - 相关动画设置
/**! tabbar侧滑动画  */
+(void)tabBarChangeAnimation:(UITabBarController *)tabBarController WithDirection:(NSInteger)direction
    
    CATransition *transition = [[CATransition alloc] init];
    transition.duration = 0.2;
    transition.type =  kCATransitionMoveIn;//kCATransitionReveal
    
    if(direction == 0) 
        transition.subtype = kCATransitionFromLeft;
    
    else
        transition.subtype = kCATransitionFromRight;
    
    
    //transition.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionDefault];
    
    [[[tabBarController view] layer] addAnimation:transition forKey:@"reveal"];//switchView



//MARK: - Tabbar相关设置
/**!
 * 设置tabBar的尺寸
 * 调用方法:自定义View 继承自 UITabBarController,在 viewWillLayoutSubviews 中使用:
 * [Utils setTabbarHeight:self.tabBar];
 */
+(void)setTabbarHeight:(UITabBar *)tabBar
    CGRect rectTabbar = tabBar.frame;
    
    if (rectTabbar.size.height >= 49) 
        rectTabbar.size.height = K_APP_TABBAR_HEIGHT;
        
        CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
        CGFloat statusBarHeight = statusBarFrame.size.height;
        if (statusBarHeight > 20.0) 
            rectTabbar.origin.y = K_APP_HEIGHT - K_APP_TABBAR_HEIGHT - 20;
        
        else
            rectTabbar.origin.y = K_APP_HEIGHT - K_APP_TABBAR_HEIGHT;
        

        tabBar.frame = rectTabbar;
    


/**!
 * 设置tabBar的尺寸 顶部边框线
 */
+(void)setTopLine:(UITabBar *)tabBar
    // [S] 顶部边框线
    NSData *topLineData = [[NSUserDefaults standardUserDefaults] dataForKey:K_APP_TABBAR_TOP_LINE];
    if (topLineData == nil || [topLineData length] <= 0) 
        CGRect rect = CGRectMake(0, 0, K_APP_WIDTH, 0.1);
        UIGraphicsBeginImageContext(rect.size);
        
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetRGBFillColor(context, 223.0, 223.0, 223.0, 1.0);
        CGContextFillRect(context, rect);

        UIImage *imgTemp = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        topLineData = UIImagePNGRepresentation(imgTemp);
        [[NSUserDefaults standardUserDefaults] setObject:topLineData forKey:K_APP_TABBAR_TOP_LINE];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
    tabBar.shadowImage = [UIImage imageWithData:topLineData];
    // [E] 顶部边框线


/**!
 * 清除tabbar顶部边线
 */
+(void)clearnTabBarTopLine:(UITabBar *)tabBar
    
    NSData *clearnLineData = [[NSUserDefaults standardUserDefaults] dataForKey:K_APP_TABBAR_CLEARN_IMAGE];
    
    if (clearnLineData == nil || [clearnLineData length] <= 0) 
        CGRect rect = CGRectMake(0, 0, 1, 1);
        UIGraphicsBeginImageContext(rect.size);
        
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0.0);
        CGContextFillRect(context, rect);
        
        UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        clearnLineData = UIImagePNGRepresentation(theImage);
        [[NSUserDefaults standardUserDefaults] setObject:clearnLineData forKey:K_APP_TABBAR_CLEARN_IMAGE];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
    
    tabBar.backgroundImage = [UIImage imageWithData:clearnLineData];
    tabBar.shadowImage = [UIImage imageWithData:clearnLineData];



//MARK: - 图片相关处理
/**! 图片不变形处理 */
+(void)imgNoTransformation:(UIImageView *)img
    img.contentMode = UIViewContentModeScaleAspectFill;
    img.clipsToBounds = YES; //是否剪切掉超出 UIImageView 范围的图片
    img.contentScaleFactor = [UIScreen mainScreen].scale;



//MARK: - 信息验证
/**!
 * 验证手机号
 * @return true 通过验证
 */
+(BOOL)checkPhoneNo:(NSString *)strPhoneNo 
    
    if (!strPhoneNo || [strPhoneNo isEqualToString:@""]) 
        return NO;
    
    
    NSString *strRegex = @"^1[34578]([0-9]9)$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
    
    return [predicate evaluateWithObject:strPhoneNo];


/**!
 * 验证邮箱
 * @return true 通过验证
 */
+(BOOL)checkEmail:(NSString *)strEmail 
    
    if (!strEmail || [strEmail isEqualToString:@""]) 
        return NO;
    
    
    NSString *strRegex = @"^[A-Z0-9a-z_\\\\.\\\\-]+\\\\@([A-Za-z0-9\\\\-]+\\\\.)+([A-Za-z0-9])+$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
    
    return [predicate evaluateWithObject:strEmail];



/**!
 * 验证密码(密码为6~20位的数字字母)
 * @return true 通过验证
 */
+(BOOL)checkPassword:(NSString *)strPwd 
    
    if (!strPwd || [strPwd isEqualToString:@""]) 
        return NO;
    
    
    //长度限制
    NSUInteger length = strPwd.length;
    if (length < 6 || length > 20) 
        return NO;
    
    
    //是否含有Emoji 表情
    if ([Utils stringContainsEmoji:strPwd]) 
        return NO;
    
    
    NSString *strRegex = @"^[A-Za-z0-9 ]6,20$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
    return [predicate evaluateWithObject:strPwd];


/**!
 * 验证验证码(长度6位的数字字母)
 * @return true 通过验证
 */
+(BOOL)checkPhoneCode:(NSString *)strCode 
    
    if (!strCode || [strCode isEqualToString:@""]) 
        return NO;
    
    
    //长度限制
    NSUInteger length = strCode.length;
    if (length > 6) 
        return NO;
    
    
    NSString *strRegex = @"^[0-9a-zA-Z]4,6$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
    return [predicate evaluateWithObject:strCode];


/**!
 * 验证姓名(字母或中文)
 * @params strName NSString
 * @params len     NSInteger 长度
 * @return true 通过验证
 */
+(BOOL)checkName:(NSString *)strName AndLength:(NSInteger)len 
    
    if (!strName || [strName isEqualToString:@""]) 
        return NO;
    
    
    //长度限制
    NSUInteger length = strName.length;
    if (length > len) 
        return NO;
    
    
    NSString *strRegex = [NSString stringWithFormat:@"^[A-Za-z\\\\u4e00-\\\\u9fa5]2,%lD$",len];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",strRegex];
    return [predicate evaluateWithObject:strName];


/**!
 * 验证身份证(15/18位)
 * @params value NSString
 * @return true 通过验证
 */
+(BOOL)checkIDCardNumber:(NSString *)value 
    
    value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSInteger length = 0;
    if (!value) return NO;
    else 
        length = value.length;
        //不满足15位和18位,即身份证错误
        if (length != 15 && length != 18) return NO;
    
    
    // 省份代码
    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"];

    // 检测省份身份行政区代码
    NSString *valueStart2 = [value substringToIndex:2];
    BOOL areaFlag = NO; //标识省份代码是否正确
    for (NSString *areaCode in areasArray) 
        if ([areaCode isEqualToString:valueStart2]) 
            areaFlag = YES;
            break;
        
    
    
    if (!areaFlag) return NO;
    
    NSRegularExpression *regularExpression;
    NSUInteger numberofMatch;
    int year = 0;
    
    //分为15位、18位身份证进行校验
    switch (length) 
        case 15:
            //获取年份对应的数字
            year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) 
                //创建正则表达式 NSRegularExpressionCaseInsensitive:不区分字母大小写的模式
                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$"
                                                                        options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
            
            else
                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$"
                                                                        options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
            
            //使用正则表达式匹配字符串 NSMatchingReportProgress:找到最长的匹配字符串后调用block回调
            numberofMatch = [regularExpression numberOfMatchesInString:value
                                                               options:NSMatchingReportProgress
                                                                 range:NSMakeRange(0, value.length)];
            if(numberofMatch >0) return YES;
            else return NO;
        case 18:
            year = [value substringWithRange:NSMakeRange(6,4)].intValue;
            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) 
                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)\\\\d4(((19|20)\\\\d2(0[13-9]|1[012])(0[1-9]|[12]\\\\d|30))|((19|20)\\\\d2(0[13578]|1[02])31)|((19|20)\\\\d202(0[1-9]|1\\\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\\\d3(\\\\d|X|x)?$"
                                                                        options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
                
            
            else
                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)\\\\d4(((19|20)\\\\d2(0[13-9]|1[012])(0[1-9]|[12]\\\\d|30))|((19|20)\\\\d2(0[13578]|1[02])31)|((19|20)\\\\d202(0[1-9]|1\\\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\\\d3(\\\\d|X|x)?$"
                                                                        options:NSRegularExpressionCaseInsensitive error:nil];//测试出生日期的合法性
            

            numberofMatch = [regularExpression numberOfMatchesInString:value
                                                               options:NSMatchingReportProgress
                                                                 range:NSMakeRange(0, value.length)];
            if(numberofMatch >0) 
                //1:校验码的计算方法 身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。将这17位数字和系数相乘的结果相加。
                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;
                
                //2:用加出来和除以11,看余数是多少?余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字
                int Y = S %11;
                NSString *M =@"F";
                NSString *JYM =@"10X98765432";
                M = [JYM substringWithRange:NSMakeRange(Y,1)];
                
                // 3:获取校验位
                NSString *lastStr = [value substringWithRange:NSMakeRange(17,1)];
                NSLog(@"%@",M);
                NSLog(@"%@",[value substringWithRange:NSMakeRange(17,1)]);
                
                //4:检测ID的校验位
                if ([lastStr isEqualToString:@"x"]) 
                    if ([M isEqualToString:@"X"]) return YES;
                    else return NO;
                
                else
                    if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) return YES;
                    else return NO;
                
            
            else return NO;
        default:
            return NO;
    



//MARK: - 相关App是否有安装检测
//https://www.zhihu.com/question/19907735
/**! 是否有安装QQ */
+(BOOL)isInstallForQQ
    //QQ mqq:// 或 mqqiapi://
    if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) 
        if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqqiapi://"]]) 
            return NO;
        
    
    
    return YES;


/**! 是否有安装微信 */
+(BOOL)isInstallForWechat 
    //微信 weixin:// 或 wechat://
    if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) 
        if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"wechat://"]]) 
            return NO;
        
    
    
    return YES;


/**! 是否有安装新浪微博 */
+(BOOL)isInstallForSina 
    //新浪微博 weibo:// 或 sinaweibo://
    if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weibo://"]]) 
        if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"sinaweibo://"]]) 
            return NO;
        
    
    
    return YES;


/**! 是否有安装支付宝 */
+(BOOL)isInstallForAliPay 
    //支付宝 alipay://
    if (![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://"]]) 
        return NO;
    
    
    return YES;


//MARK: - 获取设备信息
/**!
 * 获取当前设备的UUID
 */
+(NSString *)getCurrentDeviceUUID 
    NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor];
    return [uuid UUIDString];


/**! 
* 获取手机具体型号 
* 需要添加 #import <sys/utsname.h> 引用
* 调用:[Utils currentModel:[NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding]]
*/
+(NSString *)currentModel:(NSString *)phoneModel 
    
    if ([phoneModel isEqualToString:@"iPhone3,1"] ||
        [phoneModel isEqualToString:@"iPhone3,2"])   return @"iPhone 4";
    if ([phoneModel isEqualToString:@"iPhone4,1"])   return @"iPhone 4S";
    if ([phoneModel isEqualToString:@"iPhone5,1"] ||
        [phoneModel isEqualToString:@"iPhone5,2"])   return @"iPhone 5";
    if ([phoneModel isEqualToString:@"iPhone5,3"] ||
        [phoneModel isEqualToString:@"iPhone5,4"])   return @"iPhone 5C";
    if ([phoneModel isEqualToString:@"iPhone6,1"] ||
        [phoneModel isEqualToString:@"iPhone6,2"])   return @"iPhone 5S";
    if ([phoneModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
    if ([phoneModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
    if ([phoneModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
    if ([phoneModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
    if ([phoneModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
    if ([phoneModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
    if ([phoneModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
    if ([phoneModel isEqualToString:@"iPhone10,1"] ||
        [phoneModel isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
    if ([phoneModel isEqualToString:@"iPhone10,2"] ||
        [phoneModel isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
    if ([phoneModel isEqualToString:@"iPhone10,3"] ||
        [phoneModel isEqualToString:@"iPhone10,6"]) return @"iPhone X";
    
    if ([phoneModel isEqualToString:@"iPad1,1"]) return @"iPad";
    if ([phoneModel isEqualToString:@"iPad2,1"] ||
        [phoneModel isEqualToString:@"iPad2,2"] ||
        [phoneModel isEqualToString:@"iPad2,3"] ||
        [phoneModel isEqualToString:@"iPad2,4"]) return @"iPad 2";
    if ([phoneModel isEqualToString:@"iPad3,1"] ||
        [phoneModel isEqualToString:@"iPad3,2"] ||
        [phoneModel isEqualToString:@"iPad3,3"]) return @"iPad 3";
    if ([phoneModel isEqualToString:@"iPad3,4"] ||
        [phoneModel isEqualToString:@"iPad3,5"] ||
        [phoneModel isEqualToString:@"iPad3,6"]) return @"iPad 4";
    if ([phoneModel isEqualToString:@"iPad4,1"] ||
        [phoneModel isEqualToString:@"iPad4,2"] ||
        [phoneModel isEqualToString:@"iPad4,3"]) return @"iPad Air";
    if ([phoneModel isEqualToString:@"iPad5,3"] ||
        [phoneModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
    if ([phoneModel isEqualToString:@"iPad6,3"] ||
        [phoneModel isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7-inch";
    if ([phoneModel isEqualToString:@"iPad6,7"] ||
        [phoneModel isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9-inch";
    if ([phoneModel isEqualToString:@"iPad6,11"] ||
        [phoneModel isEqualToString:@"iPad6,12"]) return @"iPad 5";
    if ([phoneModel isEqualToString:@"iPad7,1"] ||
        [phoneModel isEqualToString:@"iPad7,2"]) return @"iPad Pro 12.9-inch 2";
    if ([phoneModel isEqualToString:@"iPad7,3"] ||
        [phoneModel isEqualToString:@"iPad7,4"]) return @"iPad Pro 10.5-inch";
    
    if ([phoneModel isEqualToString:@"iPad2,5"] ||
        [phoneModel isEqualToString:@"iPad2,6"] ||
        [phoneModel isEqualToString:@"iPad2,7"]) return @"iPad mini";
    if ([phoneModel isEqualToString:@"iPad4,4"] ||
        [phoneModel isEqualToString:@"iPad4,5"] ||
        [phoneModel isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
    if ([phoneModel isEqualToString:@"iPad4,7"] ||
        [phoneModel isEqualToString:@"iPad4,8"] ||
        [phoneModel isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
    if ([phoneModel isEqualToString:@"iPad5,1"] ||
        [phoneModel isEqualToString:@"iPad5,2"]) return @"iPad mini 4";
    
    if ([phoneModel isEqualToString:@"iPod1,1"]) return @"iTouch";
    if ([phoneModel isEqualToString:@"iPod2,1"]) return @"iTouch2";
    if ([phoneModel isEqualToString:@"iPod3,1"]) return @"iTouch3";
    if ([phoneModel isEqualToString:@"iPod4,1"]) return @"iTouch4";
    if ([phoneModel isEqualToString:@"iPod5,1"]) return @"iTouch5";
    if ([phoneModel isEqualToString:@"iPod7,1"]) return @"iTouch6";
    
    if ([phoneModel isEqualToString:@"i386"] || [phoneModel isEqualToString:@"x86_64"]) return @"iPhone Simulator";
    
    return @"Unknown";



//MARK: - Emoji表情检测
/**!
 * 是否含有Emoji 表情(true 含有)
 */
+(BOOL)stringContainsEmoji:(NSString *)string
    
    __block BOOL returnValue = FALSE;
    [string enumerateSubstringsInRange:NSMakeRange(0, string.length)
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) 
                                
                                unichar hs = [substring characterAtIndex:0];
                                // surrogate pair
                                if (0xd800 <= hs && hs <= 0xdbff) 
                                    if (substring.length > 1) 
                                        unichar ls =[substring characterAtIndex:1];
                                        
                                        NSInteger uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                                        if (0x1d000 <= uc && uc <= 0x1f77f)
                                            returnValue = YES;
                                        
                                    
                                
                                else if (substring.length > 1) 
                                    unichar ls =[substring characterAtIndex:1];
                                    if (ls == 0x20e3)
                                        returnValue = YES;
                                    
                                
                                else 
                                    // non surrogate
                                    if (0x2100 <= hs && hs <= 0x27ff)
                                        returnValue = YES;
                                    
                                    else if (0x2B05 <= hs && hs <= 0x2b07)
                                        returnValue = YES;
                                    
                                    else if (0x2934 <= hs && hs <= 0x2935)
                                        returnValue = YES;
                                    
                                    else if (0x3297 <= hs && hs <= 0x3299)
                                        returnValue = YES;
                                    
                                    else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50)
                                        returnValue = YES;
                                    
                                
                            ];
    
    return returnValue;



//MARK: - 时间处理
/** 将Linux时间装换为字符串时间 */
+(NSString *)formatDateToString:(NSTimeInterval)linuxTime WithFormat:(NSString *)format
    
    long long _timeInterval = linuxTime;
    NSString *_temp = [NSString stringWithFormat:@"%.0f",linuxTime];
    if (_temp.length > 10) 
        _temp = [_temp substringToIndex:10];
        
        _timeInterval = [_temp longLongValue];
    
    
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:_timeInterval];
    NSDateFormatter *fomatter = [[NSDateFormatter alloc] init];
    [fomatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC+8"]];
    [fomatter setDateFormat:format];
    
    NSString *_strInfo = [fomatter stringFromDate:date];
    return _strInfo;


/** 获取当前时间 */
+(NSString *)getCurrentDateToString:(NSString *)format
    NSDate *date = [NSDate date];
    
    NSDateFormatter *fomatter = [[NSDateFormatter alloc] init];
    [fomatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC+8"]];
    [fomatter setDateFormat:format];
    
    NSString *_strInfo = [fomatter stringFromDate:date];
    return _strInfo;



//MARK: - 缓存相关设置
/**! 
 * 获取系统缓存 
 * //缓存目录
#define K_APPLICATION_CACHE_PATH [NSString stringWithFormat:@"%@/%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject],K_APP_BUNDLE_ID]
 */
+(NSString *)getAppCacheSize
    
    NSFileManager *fileManage = [NSFileManager defaultManager];
    NSString *strResult = @"0M";
    BOOL isDirectory = NO;
    
    //是否存在
    if ([fileManage fileExistsAtPath:K_APPLICATION_CACHE_PATH isDirectory:&isDirectory]) 
        
        @try 
            float fsize = 0.0;
            NSDictionary *attributDic;
            
            //文件夹
            if(isDirectory) 
                
                NSString *tempPath;
                
                //获取该目录下所有文件
                for (NSString *strItem in [fileManage subpathsAtPath:K_APPLICATION_CACHE_PATH]) 
                    tempPath = [NSString stringWithFormat:@"%@/%@",K_APPLICATION_CACHE_PATH,strItem];
                    
                    //存在,且为文件
                    if ([fileManage fileExistsAtPath:tempPath isDirectory:&isDirectory] && isDirectory == NO) 
                        attributDic = [fileManage attributesOfItemAtPath:tempPath error:nil];
                        fsize = fsize + [[attributDic valueForKey:NSFileSize] floatValue];
                    
                
            
            else
                attributDic = [fileManage attributesOfItemAtPath:K_APPLICATION_CACHE_PATH error:nil];
                fsize = [[attributDic valueForKey:NSFileSize] floatValue];
            
            
            //计算缓存大小
            fsize = fsize / (1024.0 * 1024.0);
            if (fsize > 0.0) 
                strResult = [NSString stringWithFormat:@"%.2fM",fsize];
            
         @catch (NSException *exception) 
            NSLog(@"获取缓存异常:%@",exception);
        
    
    
    return strResult;


/**!
 * 清理系统缓存
 */
+(BOOL)clearnAppCache
    
    NSFileManager *fileManage = [NSFileManager defaultManager];
    NSString *tempPath;
    BOOL isDic = NO;
    BOOL isOk = NO;

    //路径存在,且为文件夹
    if ([fileManage fileExistsAtPath:K_APPLICATION_CACHE_PATH isDirectory:&isDic] && isDic) 

        @try 
            for (NSString *strItem in [fileManage subpathsAtPath:K_APPLICATION_CACHE_PATH]) 
                tempPath = [NSString stringWithFormat:@"%@/%@",K_APPLICATION_CACHE_PATH,strItem];
                
                //移除
                if ([fileManage fileExistsAtPath:tempPath]) 
                    [fileManage removeItemAtPath:tempPath error:nil];
                
            
            
            isOk = YES;
         @catch (NSException *exception) 
            NSLog(@"清理缓存异常:%@",exception);
        
    

    return isOk;



//MARK: - 公共的请求方法
/**! 开启设置权限 */
+(void)openSetting
    NSString *strUrl = UIApplicationOpenSettingsURLString;
    NSURL *url = [NSURL URLWithString:strUrl];
    
    if ([[UIApplication sharedApplication] canOpenURL:url]) 
        [[UIApplication sharedApplication] openURL:url];
    



//MARK: - 获取文本的宽度
/**!
 * 获取文本的宽度
 */
+(CGFloat)getWidthForString:(NSString *)value andFontSize:(UIFont *)font andHeight:(CGFloat)height
    CGSize sizeToFit = [value sizeWithFont:font constrainedToSize:CGSizeMake(CGFLOAT_MAX, height) lineBreakMode:NSLineBreakByWordWrapping];//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
    
    return sizeToFit.width;


/** 获取文本的高度 */
+(CGFloat)getHeightForString:(NSString *)value andFontSize:(UIFont *)font andWidth:(CGFloat)width
    CGSize sizeToFit = [value sizeWithFont:font constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置
    
    return sizeToFit.height;


/**!
 * 获取文本框的高度
 */
+(CGFloat)getTextViewHeight:(UITextView *)textView AndFixedWidth:(CGFloat)width 
    
    CGFloat fw = 0.0;
    
    CGSize size = CGSizeMake(width, CGFLOAT_MAX);
    CGSize constraint = [textView sizeThatFits:size];
    fw = constraint.height + 10.0;
    
    return fw;



//MARK: - 设置富文本
/**! 设置富文本 */
+(NSAttributedString *)setAttributeStringText:(NSString *)strFullText andFullTextFont:(UIFont *)textFont andFullTextColor:(UIColor *)textColor withChangeText:(NSString *)changeText withChangeFont:(UIFont *)changFont withChangeColor:(UIColor *)changeColor isLineThrough:(BOOL)lineThrough
    
    NSDictionary<NSAttributedStringKey,id> *dicAttr;
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:strFullText];
    
    //需要改变的文本
    NSRange range = [strFullText rangeOfString:changeText];
    
    dicAttr = @
               NSFontAttributeName:changFont,
               NSForegroundColorAttributeName:changeColor
               ;
    
    if (lineThrough) 
        [dicAttr setValue:[[NSNumber alloc] initWithInt:1] forKey:NSStrikethroughStyleAttributeName];
    
    [attributeString addAttributes:dicAttr range:range];
    
    //不需要改变的文本
    NSString *oldText = [strFullText stringByReplacingOccurrencesOfString:changeText withString:@""];
    range = [strFullText rangeOfString:oldText];
    
    dicAttr = @
               NSFontAttributeName:textFont,
               NSForegroundColorAttributeName:textColor
               ;
    [attributeString addAttributes:dicAttr range:range];
    
    return attributeString;



//MARK: - Json 与 字典、数组类型转换
/**!
 * 数组转换为NString
 * @returns: NString
 */
+(NSString *)getJSONStringFromData:(id)idData
    
    if (![NSJSONSerialization isValidJSONObject:idData]) 
        NSLog(@"无法解析出JSONString");
        return @"";
    
    
    NSData *data = [NSJSONSerialization dataWithJSONObject:idData
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:nil];
    NSString *strReturn = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return strReturn;



//MARK: - 网络请求方法
/**
 * 格式化请求参数
 * @param dicParasm NSDictionary
 */
+(NSDictionary *)formatRequestParams:(NSDictionary *)dicParasm
    
    NSMutableDictionary *_dicTemp = [[NSMutableDictionary alloc] initWithDictionary:dicParasm];
    if ([TDUser userIsLogin]) 
        [_dicTemp setObject:[TDUser getLoginToken] forKey:@"token"];
    
    
    return _dicTemp;


/**!
 * post 接口请求
 * @para strUrl   String 请求地址
 * @para paras    [String:Any] 请求参数
 * @para successBack  成功回调
 * @para failureBack  失败回调
 */
+(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
    
    NSLog(@"请求地址:%@,参数:%@",strUrl,paras);
    
    if (![K_APP_REACHABILITY isReachable]) 
        dispatch_async(dispatch_get_main_queue(), ^
            [MBProgressHUD showError:@"网络连接异常"];
        );
        
        NSLog(@"网络连接异常");
        return;
    
    
    __block UIView *_view;
    if (isLoading) 
        dispatch_async(dispatch_get_main_queue(), ^
            _view = [[AppDelegate shareInstance] window].rootViewController.view;
            if (_view) 
                [MBProgressHUD showMessage:@"" toView:_view];
            
            else 
                [MBProgressHUD showMessage:@""];
            
        );
    
    
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    
    //设置HTTPHeaderField
    if (headerField) 
        AFHTTPRequestSerializer *_requestSerializer = [AFHTTPRequestSerializer serializer];
        headerField(_requestSerializer);
        sessionManager.requestSerializer = _requestSerializer;
    
    
    //提交请求
    [sessionManager POST:strUrl
              parameters:paras
                progress:nil
                 success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
                     
                     if (isLoading) 
                         dispatch_async(dispatch_get_main_queue(), ^
                             if (_view != nil)
                                 BOOL exists = NO;
                                 for (UIView *object in _view.subviews) 
                                     if ([object isMemberOfClass:[MBProgressHUD class]]) 
                                         exists = YES;
                                         break;
                                     
                                 
                                 
                                 if (!exists) 
                                     [MBProgressHUD showMessage:@"" toView:_view];
                                 
                             
                             else
                                 [MBProgressHUD hideHUD];
                         );
                     
                     
                     NSLog(@"请求结果:%@",responseObject);
                     
                     NSDictionary *jsonData = responseObject;
                     NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
                     NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
                     
                     //成功
                     if (resultCode == K_APP_REQUEST_SUCCESS_CODE) 
                         if (successBack != nil) 
                             successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
                         
                     
                     else if(resultCode == 200)
                         if (successBack != nil) 
                             successBack(jsonData);
                         
                     
                     //token 失效,需重新登录
                     else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE)
                         
                         if (failureBack != nil) 
                             failureBack(strMessage);
                         
                         
                         NSLog(@"登录Token 失效");
                         [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
                     
                     else
                         [MBProgressHUD showError:strMessage];
                     
                 
                 failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 
                     if (isLoading) 
                         dispatch_async(dispatch_get_main_queue(), ^
                             if (_view != nil)
                                 [MBProgressHUD hideHUDForView:_view];
                             else
                                 [MBProgressHUD hideHUD];
                         );
                     
                     
                     if (failureBack != nil) 
                         failureBack([error localizedDescription]);
                     
                     
                     NSLog(@"请求异常:%@",[error localizedDescription]);
                 ];



/**!
 * get 接口请求
 * @para strUrl   String 请求地址
 * @para paras    [String:Any] 请求参数
 * @para successBack  成功回调
 * @para failureBack  失败回调
 */
+(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
    
    NSLog(@"请求地址:%@,参数:%@",strUrl,paras);
    
    if (![K_APP_REACHABILITY isReachable]) 
        dispatch_async(dispatch_get_main_queue(), ^
            [MBProgressHUD showError:@"网络连接异常"];
        );
        
        NSLog(@"网络连接异常");
        return;
    
    
    __block UIView *_view;
    if (isLoading) 
        dispatch_async(dispatch_get_main_queue(), ^
            _view = [[AppDelegate shareInstance] window].rootViewController.view;
            if (_view) 
                [MBProgressHUD showMessage:@"" toView:_view];
            
            else 
                [MBProgressHUD showMessage:@""];
            
        );
    
    
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    
    //设置HTTPHeaderField
    if (headerField) 
        AFHTTPRequestSerializer *_requestSerializer = [AFHTTPRequestSerializer serializer];
        headerField(_requestSerializer);
        sessionManager.requestSerializer = _requestSerializer;
    
    
    //提交请求
    [sessionManager GET:strUrl
              parameters:paras
                progress:nil
                 success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
                     
                     if (isLoading) 
                         dispatch_async(dispatch_get_main_queue(), ^
                             if (_view != nil)
                                 BOOL exists = NO;
                                 for (UIView *object in _view.subviews) 
                                     if ([object isMemberOfClass:[MBProgressHUD class]]) 
                                         exists = YES;
                                         break;
                                     
                                 
                                 
                                 if (!exists) 
                                     [MBProgressHUD showMessage:@"" toView:_view];
                                 
                             
                             else
                                 [MBProgressHUD hideHUD];
                         );
                     
                     
                     NSLog(@"请求结果:%@",responseObject);
                     
                     NSDictionary *jsonData = responseObject;
                     NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
                     NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
                     
                     //成功
                     if (resultCode == K_APP_REQUEST_SUCCESS_CODE) 
                         if (successBack != nil) 
                             if ([jsonData.allKeys containsObject:K_APP_REQUEST_DATA]) 
                                 successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
                             
                             else
                                 successBack(jsonData);
                             
                         
                     
                     else if(resultCode == 200 || resultCode == 0)
                         //token 失效,需重新登录
                         if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE && [strMessage containsString:@"token"])
                             if (failureBack != nil) 
                                 failureBack(strMessage);
                             
                             
                             NSLog(@"登录Token 失效");
                             [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
                         
                         else
                             if (successBack != nil) 
                                 successBack(jsonData);
                             
                         
                     
                     else
                         [MBProgressHUD showError:strMessage];
                     
                 
                 failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 
                     if (isLoading) 
                         dispatch_async(dispatch_get_main_queue(), ^
                             if (_view != nil)
                                 [MBProgressHUD hideHUDForView:_view];
                             else
                                 [MBProgressHUD hideHUD];
                         );
                     
                     
                     if (failureBack != nil) 
                         failureBack([error localizedDescription]);
                     
                     
                     NSLog(@"请求异常:%@",[error localizedDescription]);
                 ];


/**
 *  异步POST请求:以body方式,支持数组
 *
 *  @param url     请求的url
 *  @param body    body数据
 *  @param success 成功回调
 *  @param failure 失败回调
 *  @param isLoading BOOL
 */
+(void)postWithUrl:(NSString *)url body:(NSData *)body WithSuccess:(void(^)(id _Nonnull response))success WithFailure:(void(^)(NSString *error))failure WithisLoading:(BOOL)isLoading
    NSLog(@"请求地址:%@",url);
    
    if (![K_APP_REACHABILITY isReachable]) 
        dispatch_async(dispatch_get_main_queue(), ^
            [MBProgressHUD showError:@"网络连接异常"];
        );
        NSLog(@"网络连接异常");
        return;
    
    
    __block UIView *_view;
    if (isLoading) 
        dispatch_async(dispatch_get_main_queue(), ^
            _view = [[AppDelegate shareInstance] window].rootViewController.view;
            if (_view) 
                BOOL exists = NO;
                for (UIView *object in _view.subviews) 
                    if ([object isMemberOfClass:[MBProgressHUD class]]) 
                        exists = YES;
                        break;
                    
                
                
                if (!exists) 
                    [MBProgressHUD showMessage:@"" toView:_view];
                
            
            else 
                [MBProgressHUD showMessage:@""];
            
        );
    
    
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    
    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
    request.timeoutInterval = K_APP_URLTIME_OUT_INTERVAL;
    [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/x-www-form-urlencoded;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/x-plist;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    //设置body
    [request setHTTPBody:body];
    
    AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer];
    responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
                                                 @"text/html",
                                                 @"text/json",
                                                 @"text/javascript",
                                                 @"text/plain",
                                                 nil];
    manager.responseSerializer = responseSerializer;
    
    [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) 
        
         NSLog(@"请求结果:%@",responseObject);
        
        if (isLoading) 
            dispatch_async(dispatch_get_main_queue(), ^
                if (_view != nil)
                    [MBProgressHUD hideHUDForView:_view];
                else
                    [MBProgressHUD hideHUD];
            );
        
        
        if (error == nil) 
            NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[responseObject mj_JSONData]
                                                                     options:NSJSONReadingMutableContainers
                                                                       error:nil];
            
            NSLog(@"请求结果2:%@",responseObject);
            NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
            NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
            
            //成功
            if (resultCode == K_APP_REQUEST_SUCCESS_CODE) 
                if (success) 
                    if ([jsonData.allKeys containsObject:K_APP_REQUEST_DATA]) 
                        success([jsonData valueForKey:K_APP_REQUEST_DATA]);
                    
                    else
                        success(jsonData);
                    
                
            
            //token 失效,需重新登录
            else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE)
                if (failure != nil) 
                    failure(strMessage);
                
                
                NSLog(@"登录Token 失效");
                [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
            
            else
                if (failure != nil) 
                    if (strMessage && ![strMessage isEqualToString:@""]) 
                        failure(strMessage);
                    
                    else
                        failure([error localizedDescription]);
                    
                
            
        
        else 
            if (failure != nil) 
                failure([error localizedDescription]);
            
        
    ] resume];


/**!
 * 文件或图片上传
 * @para strUrl String 上传地址
 * @para uploadformDataBack 上传参数设置
 * @para successBack  成功回调
 * @para failureBack  失败回调
 */
+(void)postImageUploadToServer:(NSString *)strUrl AndUploadformDataBack:(void(^)(id<AFMultipartFormData> formData))formDataBack AndSuccessBack:(void(^)(NSObject *_responseData))successBack AndFailureBack:(void(^)(NSString *_strError))failureBack WithisLoading:(BOOL)isLoading

    NSLog(@"请求地址:%@",strUrl);
    
    if (![K_APP_REACHABILITY isReachable]) 
        [MBProgressHUD showError:@"网络连接异常"];
        NSLog(@"网络连接异常");
        return;
    
    
    __block UIView *_view;
    if (isLoading) 
        dispatch_async(dispatch_get_main_queue(), ^
            _view = [[AppDelegate shareInstance] window].rootViewController.view;
            if (_view) 
                BOOL exists = NO;
                for (UIView *object in _view.subviews) 
                    if ([object isMemberOfClass:[MBProgressHUD class]]) 
                        exists = YES;
                        break;
                    
                
                
                if (!exists) 
                    [MBProgressHUD showMessage:@"" toView:_view];
                
            
            else 
                [MBProgressHUD showMessage:@""];
            
        );
    
    
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    [sessionManager POST:strUrl
              parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) 
                //指定参数
                if (formDataBack) 
                    formDataBack(formData);
                

                progress:nil
                success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) 
        
                    NSLog(@"请求结果:%@",responseObject);
                    
                    if (isLoading) 
                        dispatch_async(dispatch_get_main_queue(), ^
                            if (_view != nil)
                                [MBProgressHUD hideHUDForView:_view];
                            else
                                [MBProgressHUD hideHUD];
                        );
                    
                    
                    NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                    NSInteger resultCode = [[jsonData valueForKey:K_APP_REQUEST_CODE] integerValue];
                    NSString *strMessage = [jsonData valueForKey:K_APP_REQUEST_MSG];
                    
                    //成功
                    if (resultCode == K_APP_REQUEST_SUCCESS_CODE) 
                        if (successBack) 
                            successBack([jsonData valueForKey:K_APP_REQUEST_DATA]);
                        
                    
                    //token 失效,需重新登录
                    else if(resultCode == K_APP_REQUEST_TOKEN_FAILURE_CODE)
                        if (failureBack != nil) 
                            failureBack(strMessage);
                        
                        
                        NSLog(@"登录Token 失效");
                        [[NSNotificationCenter defaultCenter] postNotificationName:K_APP_TOKEN_FAILURE_NOTICE object:nil];
                    
                    else
                        [MBProgressHUD showError:strMessage];
                    
    
                 failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) 
                     if (isLoading) 
                         dispatch_async(dispatch_get_main_queue(), ^
                             if (_view != nil)
                                 [MBProgressHUD hideHUDForView:_view];
                             else
                                 [MBProgressHUD hideHUD];
                         );
                     
                    
                    if (failureBack != nil) 
                        failureBack([error localizedDescription]);
                    
                    
                    NSLog(@"请求结果:%@",[error localizedDescription]);
    ];



/// 访问Bundle资源包中的图片
/// - Parameters:
///   - bclass: Bundle的class([self class]?可选)
///   - bName: Bundle的名称
///   - imgName: 带后缀的图片名 "xx.png"
///   - _imgFileName: 图片资源所在文件夹名称,可选
+(UIImage *_Nullable)imageForBuncleClass:(Class _Nullable)_bclass
                           andBundleName:(NSString *_Nonnull)_bName
                           withImageName:(NSString *_Nonnull)_imgName
                       andImagesFileName:(NSString *_Nonnull)_imgFileName 
    
    UIImage *_img;
    @try 
        Class _class = _bclass;
        if(!_bclass)
            _class = NSClassFromString(_bName);
        
        
        NSBundle *_bundle = [NSBundle bundleForClass:_class];
        NSURL *_url = [_bundle URLForResource:_bName withExtension:@"bundle"];
        
        NSString *_imgFN = _imgName;
        if(_imgFileName && ![_imgFileName isEqualToString:@""]) 
            _imgFN = [NSString stringWithFormat:@"%@/%@",_imgFileName,_imgName];
        
        
        if (@available(ios 13.0, *)) 
            NSBundle *_imageBundle = [NSBundle bundleWithURL:_url];
            _img = [UIImage imageNamed:_imgFN inBundle:_imageBundle withConfiguration:nil];
         else 
            // Fallback on earlier versions
            NSString *_path = [NSString stringWithFormat:@"%@/%@",[_url path],_imgFN];
            _img = [UIImage imageWithContentsOfFile:_path];
        
        
     @catch (NSException *exception) 
        NSLog(@"%@-%@",@"imageForBuncleClass",exception);
     @finally 
        return _img;
    


/// 获取资源包里面的Xib
/// - Parameters:
///   - _bclass: Bundle的class([self class]可选)
///   - _bName: Bundle的名称
///   - _xibName: xib的名称
-(UINib *_Nullable)xibForBuncleClass:(Class _Nullable)_bclass
                       andBundleName:(NSString *_Nonnull)_bName
                         withXibName:(NSString *_Nonnull)_xibName
    
    UINib *nib;
    @try 
        Class _class = _bclass;
        if(!_bclass)
            _class = NSClassFromString(_bName);
        
        
        NSBundle *_bundleClass = [NSBundle bundleForClass:_class];
        NSURL *_url = [_bundleClass URLForResource:_bName withExtension:@"bundle"];
        NSBundle *_bundle = [NSBundle bundleWithURL:_url];
        if(!_bundle) 
            _bundle = [NSBundle mainBundle];
        
            
        nib = [UINib nibWithNibName:_xibName bundle:_bundle];
     @catch (NSException *exception) 
        NSLog(@"%@-%@",@"xibForBuncleClass",exception);
     @finally 
        return nib;
    

以上是关于IOS 常用工具类方法(OC版本)的主要内容,如果未能解决你的问题,请参考以下文章

IOS-OC-基本控件之UIButton

ios 整理(一)swift和oc的区别

iOS开发中OC和swift的对比

ios开发 oc 的类方法与对象方法

IOS-OC-基本控件之UIPageControl

IOS-OC-基本控件之UIPageControl