1. 程式人生 > >iOS之註冊、修改密碼、忘記密碼、設定支付密碼、忘記支付密碼、修改支付密碼

iOS之註冊、修改密碼、忘記密碼、設定支付密碼、忘記支付密碼、修改支付密碼

#import <Foundation/Foundation.h>

@interface LYZZShareManager : NSObject

+(instancetype)sharedManager;

+(BOOL) IsIdentityCard:(NSString *)IDCardNumber;//身份證

+ (BOOL)checkUserIdCard: (NSString *)idCard ;//省份證(全)

+ (BOOL) IsPhoneNumber:(NSString *)number;//手機

+(NSString *)checkTreephoneOperate:(NSString *)phoneNum;//判斷手機三大運營商

+ (BOOL)checkPhone:(NSString *)phoneNumber;

+(BOOL)phoneAndfixtel:(NSString *)mobileNum;//手機和固話的正則

+ (BOOL) IsBankCard:(NSString *)cardNumber;//銀行卡

+ (BOOL)checkEmail:(NSString *)email;//郵箱

+(NSString*)deviceVersion;//判斷手機型號iphone4 5 6 plus

+(BOOL) deptNameInputShouldChinese:(NSString *)text;//輸入中文

+(BOOL) deptNumInputShouldNumber:(NSString

*)text;//輸入數字

+(BOOL) deptPassInputShouldAlpha:(NSString *)text;//輸入字母

+(BOOL) deptIdInputShouldAlphaNum:(NSString *)text;//輸入字母或數字

@end

*********

#import "LYZZShareManager.h"

#import "sys/utsname.h"

@implementation LYZZShareManager

+(instancetype)sharedManager{

staticLYZZShareManager *lyZZ;

    static dispatch_once_t

onceToken;

    dispatch_once(&onceToken, ^{

        lyZZ =[[LYZZShareManager alloc]init];

    });

    return lyZZ;

}

//身份證正則

+(BOOL) IsIdentityCard:(NSString *)IDCardNumber

{

    for (int i=0; i<IDCardNumber.length; i++) {

NSString *c=[NSStringstringWithFormat:@"%c",[IDCardNumber characterAtIndex:i]];

if(![c isEqualToString:@"0"]&&![c isEqualToString:@"1"]&&![c isEqualToString:@"2"]&&![c isEqualToString:@"3"]&&![c isEqualToString:@"4"]&&![c isEqualToString:@"5"]&&![c isEqualToString:@"6"]&&![c isEqualToString:@"7"]&&![c isEqualToString:@"8"]&&![c isEqualToString:@"9"]){

        return NO;

    }

}

    if (IDCardNumber.length <= 0) {

        return NO;

    }

NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";

    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];

    return [identityCardPredicate evaluateWithObject:IDCardNumber];

}

//手機號正則

+ (BOOL) IsPhoneNumber:(NSString *)number

{

NSString *phoneRegex1=@"1[34578]([0-9]){9}";

    NSPredicate *phoneTest1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex1];

    return  [phoneTest1 evaluateWithObject:number];

}

//銀行卡正則

+ (BOOL) IsBankCard:(NSString *)cardNumber

{

    for (int i=0; i<cardNumber.length; i++) {

        NSString *c=[NSString stringWithFormat:@"%c",[cardNumber characterAtIndex:i]];

if(![c isEqualToString:@"0"]&&![c isEqualToString:@"1"]&&![c isEqualToString:@"2"]&&![c isEqualToString:@"3"]&&![c isEqualToString:@"4"]&&![c isEqualToString:@"5"]&&![c isEqualToString:@"6"]&&![c isEqualToString:@"7"]&&![c isEqualToString:@"8"]&&![c isEqualToString:@"9"]){

              NSLog(@"銀行卡正則");

            return NO;

        }

    }

    if(cardNumber.length==0)

    {

        return NO;

    }

    NSString *digitsOnly = @"";

    char c;

    for (int i = 0; i < cardNumber.length; i++)

    {

        c = [cardNumber characterAtIndex:i];

        if (isdigit(c))

        {

            digitsOnly =[digitsOnly stringByAppendingFormat:@"%c",c];

        }

    }

    int sum = 0;

    int digit = 0;

    int addend = 0;

    BOOL timesTwo = false;

    for (NSInteger i = digitsOnly.length - 1; i >= 0; i--)

    {

        digit = [digitsOnly characterAtIndex:i] - '0';

        if (timesTwo)

        {

            addend = digit * 2;

            if (addend > 9) {

                addend -= 9;

            }

        }

        else {

            addend = digit;

        }

        sum += addend;

        timesTwo = !timesTwo;

    }

    int modulus = sum % 10;

    return modulus == 0;

}

#pragma mark --判斷手機號合法性

+ (BOOL)checkPhone:(NSString *)phoneNumber

{

NSString *regex = @"^((13[0-9])|(147)|(15[^4,\\D])|(18[0-9])|(17[0-9]))\\d{8}$";

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    BOOL isMatch = [pred evaluateWithObject:phoneNumber];

    if (!isMatch)

    {

        return NO;

    }

returnYES;

}

//手機和固話的正則

+(BOOL)phoneAndfixtel:(NSString *)mobileNum{

    {

        if (mobileNum.length != 11)

        {

            return NO;

        }

        /**

         * 手機號碼:

         * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9]

         * 移動號段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705

         * 聯通號段: 130,131,132,155,156,185,186,145,176,1709

         * 電訊號段: 133,153,180,181,189,177,1700

         */

NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[03678])\\d{8}$";

        /**

         * 中國移動:China Mobile

         * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705

         */

NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)";

        /**

         * 中國聯通:China Unicom

         * 130,131,132,155,156,185,186,145,176,1709,175

         */

NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[56]|8[56])\\d{8}$)|(^1709\\d{7}$)";

        /**

         * 中國電信:China Telecom

         * 133,153,180,181,189,177,1700

         */

NSString *CT = @"(^1(33|53|77|8[019]|99)\\d{8}$)|(^1700\\d{7}$)";

        /**

         25     * 大陸地區固話及小靈通

         26     * 區號:010,020,021,022,023,024,025,027,028,029

         27     * 號碼:七位或八位

         28     */

//  NSString * PHS = @"^(0[0-9]{2})\\d{8}$|^(0[0-9]{3}(\\d{7,8}))$";

        NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];

        NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];

        NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];

        NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];

        if (([regextestmobile evaluateWithObject:mobileNum] == YES)

            || ([regextestcm evaluateWithObject:mobileNum] == YES)

            || ([regextestct evaluateWithObject:mobileNum] == YES)

            || ([regextestcu evaluateWithObject:mobileNum] == YES))

        {

            return YES;

        }

        else

        {

            return NO;

        }

    }

}

#pragma mark 判斷郵箱

+ (BOOL)checkEmail:(NSString *)email{

//^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})$

NSString *regex = @"^[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";

    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    return [emailTest evaluateWithObject:email];

}

//使用者身份證號15或18位

+ (BOOL)checkUserIdCard: (NSString *)idCard {

    idCard = [idCard stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];

    NSInteger length =0;

    if (!idCard) {

        return NO;

    }else {

        length = idCard.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 = [idCard 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 = [idCard substringWithRange:NSMakeRange(6,2)].intValue +1900;

            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

//建立正則表示式 NSRegularExpressionCaseInsensitive:不區分字母大小寫的模式

                regularExpression = [[NSRegularExpressionalloc]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 = [[NSRegularExpressionalloc]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:idCard

                                                               options:NSMatchingReportProgress

                                                                 range:NSMakeRange(0, idCard.length)];

            if(numberofMatch >0) {

                return YES;

            }else {

                return NO;

            }

        case 18:

            year = [idCard substringWithRange:NSMakeRange(6,4)].intValue;

            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

                regularExpression = [[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19[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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性

            }else {

                regularExpression = [[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19[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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性

            }

            numberofMatch = [regularExpression numberOfMatchesInString:idCard

                                                               options:NSMatchingReportProgress

                                                                 range:NSMakeRange(0, idCard.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 = [idCard substringWithRange:NSMakeRange(0,1)].intValue*7 + [idCard substringWithRange:NSMakeRange(10,1)].intValue *7 + [idCard substringWithRange:NSMakeRange(1,1)].intValue*9 + [idCard substringWithRange:NSMakeRange(11,1)].intValue *9 + [idCard substringWithRange:NSMakeRange(2,1)].intValue*10 + [idCard substringWithRange:NSMakeRange(12,1)].intValue *10 + [idCard substringWithRange:NSMakeRange(3,1)].intValue*5 + [idCard substringWithRange:NSMakeRange(13,1)].intValue *5 + [idCard substringWithRange:NSMakeRange(4,1)].intValue*8 + [idCard substringWithRange:NSMakeRange(14,1)].intValue *8 + [idCard substringWithRange:NSMakeRange(5,1)].intValue*4 + [idCard substringWithRange:NSMakeRange(15,1)].intValue *4 + [idCard substringWithRange:NSMakeRange(6,1)].intValue*2 + [idCard substringWithRange:NSMakeRange(16,1)].intValue *2 + [idCard substringWithRange:NSMakeRange(7,1)].intValue *1 + [idCard substringWithRange:NSMakeRange(8,1)].intValue *6 + [idCard 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";