全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Objective-C实现身份证验证的方法示例

前言

最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌二次开发。因为这这个二次开发的项目太老,代码太乱,毫无层次感。可是令人欣慰的是,我在里面发现了一段有用的代码,感兴趣的可以参考学习。

直接上代码

- (BOOL)isValidIdCardNum
{
 NSString *value = [self copy];
 value = [value stringByReplacingOccurrencesOfString:@"X" withString:@"x"];
 value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
 int length = 0;
 if (!value) {
  return NO;
 }else {
  length = (int)value.length;
  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;
 switch (length) {
  case 15:
   year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
   if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) {
    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];// 测试出生日期的合法性
   }
   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-9][0-9]{5}19|20[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}[0-9Xx]$"options:NSRegularExpressionCaseInsensitive error:nil];// 测试出生日期的合法性
    
   }else {
    regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19|20[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}[0-9Xx]$"
                   options:NSRegularExpressionCaseInsensitive error:nil];// 测试出生日期的合法性
   }
   numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];
   if(numberofMatch > 0) {
    int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [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;
    int Y = S % 11;
    NSString *M = @"F";
    NSString *JYM = @"10X98765432";
    M = [JYM substringWithRange:NSMakeRange(Y,1)]; // 判断校验位
    if ([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) {
     return YES;// 检测ID的校验位
    }else {
     return NO;
    }
   }else {
    return NO;
   }
   
  default:
   return NO;
 }
 return NO;
}

上面的代码验证十分全面。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# c  # 身份证验证  # objective  # 教程  # iOS 中使用正则表达式判断身份证格式及银行卡号格式是否正确(推荐)  # IOS开发之由身份证号码提取性别的实现代码  # iOS身份证号码识别示例  # IOS 身份证校验详细介绍及示例代码  # iOS正则表达式验证手机号、邮箱、身份证号等  # IOS身份证识别(OCR源码)详解及实例代码  # iOS判断身份证号码是否正确的方法  # iOS Touch ID 身份认证  # 出生日期  # 的是  # 我在  # 感兴趣  # 我一直  # 校验位  # 这篇文章  # 谢谢大家  # 太乱  # 发现了  # 这这  # 有疑问  # areasArray  # NSArray  # brush  # class  # pre  # isValidIdCardNum  # BOOL  # cpp 


相关文章: 如何在Golang中指定模块版本_使用go.mod控制版本号  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何通过万网虚拟主机快速搭建网站?  建站之星logo尺寸如何设置最合适?  Thinkphp 中 distinct 的用法解析  如何快速搭建高效香港服务器网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  北京制作网站的公司,北京铁路集团官方网站?  淘宝制作网站有哪些,淘宝网官网主页?  linux top下的 minerd 木马清除方法  如何在Windows服务器上快速搭建网站?  建站之星上传入口如何快速找到?  如何快速查询网址的建站时间与历史轨迹?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  如何快速搭建自助建站会员专属系统?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何通过虚拟主机快速搭建个人网站?  如何在香港服务器上快速搭建免备案网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站之星如何防范黑客攻击与数据泄露?  如何用景安虚拟主机手机版绑定域名建站?  宝塔建站无法访问?如何排查配置与端口问题?  家庭服务器如何搭建个人网站?  如何快速生成ASP一键建站模板并优化安全性?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何快速搭建FTP站点实现文件共享?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站之星代理费用多少?最新价格详情介绍  建站之星安装步骤有哪些常见问题?  建站之星如何开启自定义404页面避免用户流失?  如何快速生成可下载的建站源码工具?  如何在VPS电脑上快速搭建网站?  免费网站制作appp,免费制作app哪个平台好?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何选择高效稳定的ISP建站解决方案?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  ,巨量百应是干嘛的?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何在企业微信快速生成手机电脑官网?  ,制作一个手机app网站要多少钱?  建站之星安装后界面空白如何解决?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何将凡科建站内容保存为本地文件?  济南网站制作的价格,历城一职专官方网站?  表情包在线制作网站免费,表情包怎么弄?  如何通过cPanel快速搭建网站?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何快速搭建安全的FTP站点?  Swift中循环语句中的转移语句 break 和 continue  小建面朝正北,A点实际方位是否存在偏差? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。