IOS最严格身份证号验证

简介: IOS最严格身份证号验证
//身份证号  
+ (BOOL)CheckIsIdentityCard: (NSString *)identityCard  
{  
    //判断是否为空  
    if (identityCard==nil||identityCard.length <= 0) {  
        return NO;  
    }  
    //判断是否是18位,末尾是否是x  
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";  
    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];  
    if(![identityCardPredicate evaluateWithObject:identityCard]){  
        return NO;  
    }  
    //判断生日是否合法  
    NSRange range = NSMakeRange(6,8);  
    NSString *datestr = [identityCard substringWithRange:range];  
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
    [formatter setDateFormat : @"yyyyMMdd"];  
    if([formatter dateFromString:datestr]==nil){  
        return NO;  
    }  
    //判断校验位  
    if(identityCard.length==18)  
    {  
        NSArray *idCardWi= @[ @"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2" ]; //将前17位加权因子保存在数组里  
        NSArray * idCardY=@[ @"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2" ]; //这是除以11后,可能产生的11位余数、验证码,也保存成数组  
        int idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和  
        for(int i=0;i<17;i++){  
            idCardWiSum+=[[identityCard substringWithRange:NSMakeRange(i,1)] intValue]*[idCardWi[i] intValue];  
        }  
        int idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置  
        NSString *idCardLast=[identityCard substringWithRange:NSMakeRange(17,1)];//得到最后一位身份证号码  
        //如果等于2,则说明校验码是10,身份证号码最后一位应该是X  
        if(idCardMod==2){  
            if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){  
                return YES;  
            }else{  
                return NO;  
            }  
        }else{  
            //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码  
            if([idCardLast intValue]==[idCardY[idCardMod] intValue]){  
                return YES;  
            }else{  
                return NO;  
            }  
        }  
    }  
    return NO;  
}  
相关文章
|
8月前
|
数据安全/隐私保护 Android开发 iOS开发
解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
127 0
|
开发者 iOS开发
iOS开发 - 用AFNetworking实现https单向验证,双向验证
iOS开发 - 用AFNetworking实现https单向验证,双向验证
351 0
iOS开发 - 用AFNetworking实现https单向验证,双向验证
|
iOS开发
iOS开发-https免证书验证
iOS开发-https免证书验证
140 0
|
移动开发 算法 iOS开发
iOS小技能:【营业执照编号校验】18位社会信用代码验证
需求:商户进件的子模块证件信息页面新增营业执照编号校验
345 0
iOS小技能:【营业执照编号校验】18位社会信用代码验证
|
iOS开发
iOS自动化真机测试验证环境过程中常见问题解析
iOS自动化真机测试验证环境过程中常见问题解析
|
iOS开发
iOS - 深拷贝、浅拷贝探索验证
本文已同步掘金:iOS - 深拷贝、浅拷贝探索验证
iOS自动化真机测试验证环境过程中常见问题解析
本章节主要讲解 iOS 自动化真机配置以及在 iOS 真机执行自动化时常见问题与解决方法。 ## 真机使用的Capability 与模拟器不同,真机测试需要如下的 Capability 方式一:设置 App 路径,启动 App(自动安装 App) ``` { &quot;app&quot;: &quot;/Users/seveniruby/Library/Developer/Xcode/DerivedData/UI
iOS自动化真机测试验证环境过程中常见问题解析
本章节主要讲解 iOS 自动化真机配置以及在 iOS 真机执行自动化时常见问题与解决方法。 ## 真机使用的Capability 与模拟器不同,真机测试需要如下的 Capability 方式一:设置 App 路径,启动 App(自动安装 App) ``` { "app": "/Users/seveniruby/Library/Developer/Xcode/DerivedData/UI
|
传感器 安全 生物认证
iOS传感器开发——为APP添加手机密码、指纹进行安全验证
iOS传感器开发——为APP添加手机密码、指纹进行安全验证
228 0
iOS传感器开发——为APP添加手机密码、指纹进行安全验证