SoFunction
Updated on 2025-04-12

Example of Objective-C method to implement ID card verification

Preface

Recently I saw an OC code for ID verification in a secondary development project, although I have always hated secondary development. Because this secondary development project is too old, the code is too messy, and there is no sense of layering. But it is gratifying that I found a useful piece of code in it. If you are interested, you can refer to it.

Directly upload the code

- (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);
  if (length != 15 && length !=18) {
   return NO;
  }
 }
 // Province code 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];// Test the legality of the date of birth   }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];// Test the legality of the date of birth   }
   numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, )];
   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];// Test the legality of the date of birth    
   }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];// Test the legality of the date of birth   }
   numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, )];
   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)]; //Judge the check bit    if ([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) {
     return YES;// Check bit of the detection ID    }else {
     return NO;
    }
   }else {
    return NO;
   }
   
  default:
   return NO;
 }
 return NO;
}

The above code verification is very comprehensive.

Summarize

The above is the entire content of this article. I hope the content of this article will be of some help to your study or work. If you have any questions, you can leave a message to communicate. Thank you for your support.