iOS身份證驗證

dfag 8年前發布 | 1K 次閱讀 Objective-C iOS開發

前言

在開發中,基本都需要到注冊,而注冊通常要輸入一些身份信息,當然前端也是需要驗證是否是合法的身份證才能提交。這篇文章只是放出個人的代碼,不代表全正確!!!

擴展NSString代碼

擴展NSString,添加以下方法:

 
- (BOOL)hyb_isValidPersonID {
  return [NSStringhyb_isValidPersonID:self];
}
 
+ (BOOL)hyb_isValidPersonID:(NSString *)personId {
  // 判斷位數
  if (personId.length != 15 && personId.length != 18) {
    return NO;
  }
  NSString *carid = personId;
  long lSumQT = 0;
  // 加權因子
  int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
  // 校驗碼
  unsigned char checkers[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'};
  
  // 將15位身份證號轉換成18位
  NSMutableString *str = [NSMutableStringstringWithString:personId];
  if (personId.length == 15) {
    [strinsertString:@"19"atIndex:6];
    long p = 0;
    const char *personId = [strUTF8String];
    
    for (int i = 0; i<= 16; i++) {
      p += (personId[i] - 48) * R[i];
    }
    
    int o = p % 11;
    NSString *string_content = [NSStringstringWithFormat:@"%c", checkers[o]];
    [strinsertString:string_contentatIndex:[strlength]];
    carid = str;
  }
  
  // 判斷地區碼
  NSString * sProvince = [caridsubstringToIndex:2];
  if (![self_areaCode:sProvince]) {
    return NO;
  }
  
  // 判斷年月日是否有效
  // 年份
  int strYear = [[self_substringWithString:caridbegin:6end:4]intValue];
  // 月份
  int strMonth = [[self_substringWithString:caridbegin:10end:2]intValue];
  // 日
  int strDay = [[self_substringWithString:caridbegin:12end:2]intValue];
  
  NSTimeZone *localZone = [NSTimeZone localTimeZone];
  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
  [dateFormattersetDateStyle:NSDateFormatterMediumStyle];
  [dateFormattersetTimeStyle:NSDateFormatterNoStyle];
  [dateFormattersetTimeZone:localZone];
  [dateFormattersetDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  NSDate *date=[dateFormatterdateFrostr:[NSStringstringWithFormat:@"%d-%d-%d 12:01:01",
                                              strYear, strMonth, strDay]];
  if (date == nil) {
    return NO;
  }
  
  const char *pid  = [caridUTF8String];
  // 檢驗長度
  if(18 != strlen(pid)) return NO;
  // 校驗數字
  for (int i = 0; i < 18; i++) {
    if ( !isdigit(pid[i]) && !(('X' == pid[i] || 'x' == pid[i]) && 17 == i) ) {
      return NO;
    }
  }
  
  // 驗證最末的校驗碼
  for (int i = 0; i <= 16; i++) {
    lSumQT += (pid[i]-48) * R[i];
  }
  
  if (checkers[lSumQT%11] != pid[17] ) {
    return NO;
  }
  return YES;
}
 
 
#pragma mark - Private
+ (NSString *)_substringWithString:(NSString *)strbegin:(NSInteger)beginend:(NSInteger )end {
  return [strsubstringWithRange:NSMakeRange(begin, end)];
}
 

關注我

Swift/ObjC技術群一: 324400294(已滿)

Swift/ObjC技術群二: 494669518

ObjC/Swift高級群: 461252383(注明年限,新手勿擾)

關注微信公眾號: iOSDevShares

關注新浪微博賬號:標哥Jacky

標哥的GITHUB地址: CoderJackyHuang

支持并捐助

如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!

支付寶捐助 微信捐助
 本文由用戶 dfag 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!