iOS常用驗證

驗證郵箱

+ (BOOL)isValidUsername:(NSString *)username {
    
    // 驗證用戶名 - 郵箱
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    
    return [emailTest evaluateWithObject:username];
}

驗證手機(jī)號

+ (BOOL)isTelephone:(NSString *)mobile
{
    if (mobile.length < 11)
    {
        return NO;
    }else{
        /**
         * 移動號段正則表達(dá)式
         */
        NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";
        /**
         * 聯(lián)通號段正則表達(dá)式
         */
        NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";
        /**
         * 電信號段正則表達(dá)式
         */
        NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";
        NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];
        BOOL isMatch1 = [pred1 evaluateWithObject:mobile];
        NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];
        BOOL isMatch2 = [pred2 evaluateWithObject:mobile];
        NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
        BOOL isMatch3 = [pred3 evaluateWithObject:mobile];
        
        if (isMatch1 || isMatch2 || isMatch3) {
            return YES;
//            if (isMatch1) {
//                return @"該號碼是一個正確的移動手機(jī)號碼";
//            }else if (isMatch2) {
//                return @"該號碼是一個正確的聯(lián)通手機(jī)號碼";
//            }else {
//                return @"該號碼是一個正確的電信手機(jī)號碼";
//            }
        }else{
            return NO;
        }
    }
    return nil;
}

驗證身份證是否合法

+ (BOOL)validateIDCardNumber:(NSString *)valueStr{   
    valueStr = [valueStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];  
    NSUInteger length =0;    
    if (!valueStr) {        
        return NO;       
    }else {      
        length = valueStr.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 = [valueStr substringToIndex:2]; 
    BOOL areaFlag =NO;    
    for (NSString *areaCode in areasArray) {      
        if ([areaCode isEqualToString:valueStart2]) {           
            areaFlag =YES;          
            break;           
        }
    } 
    if (!areaFlag) {    
        return false;      
    }  
    NSRegularExpression *regularExpression;   
    NSUInteger numberofMatch; 
    int year =0;
    switch (length) {         
        case15:          
            year = [valueStr 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:valueStr                                                                                          options:NSMatchingReportProgress                                                                                             range:NSMakeRange(0, valueStr.length)];            
            if(numberofMatch >0) {                
                return YES;                
            }else {               
                return NO;               
            }            
        case18:
            year = [valueStr 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[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[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:valueStr
options:NSMatchingReportProgress
                range:NSMakeRange(0, valueStr.length)];
            if(numberofMatch >0) {
                int S = ([valueStr substringWithRange:NSMakeRange(0,1)].intValue + [valueStr substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([valueStr substringWithRange:NSMakeRange(1,1)].intValue + [valueStr substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([valueStr substringWithRange:NSMakeRange(2,1)].intValue + [valueStr substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([valueStr substringWithRange:NSMakeRange(3,1)].intValue + [valueStr substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([valueStr substringWithRange:NSMakeRange(4,1)].intValue + [valueStr substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([valueStr substringWithRange:NSMakeRange(5,1)].intValue + [valueStr substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([valueStr substringWithRange:NSMakeRange(6,1)].intValue + [valueStr substringWithRange:NSMakeRange(16,1)].intValue) *2 + [valueStr substringWithRange:NSMakeRange(7,1)].intValue *1 + [valueStr substringWithRange:NSMakeRange(8,1)].intValue *6 + [valueStr 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:[valueStr substringWithRange:NSMakeRange(17,1)]]) {
                    return YES;// 檢測ID的校驗位
                }else {
                    return NO;                    
                }
            }else {               
                return NO;   
            }
        default:    
            return false;
    }    
}

獲取星期

+(NSString *)dateTomorrow:(NSDate *)date
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSInteger unitFlags = NSYearCalendarUnit |
    NSMonthCalendarUnit |
    NSDayCalendarUnit |
    NSWeekdayCalendarUnit |
    NSHourCalendarUnit |
    NSMinuteCalendarUnit |
    NSSecondCalendarUnit;
    NSDateComponents *comps = [calendar components:unitFlags fromDate:date];
    long month = [comps month];
    long day = [comps day];
    long hour = [comps hour];
    long minute = [comps minute];
    long weekday = [comps weekday];
    NSString *weekdayString = @"";
    switch (weekday) {
        case 1:
            weekdayString = @"周日";
            break;
        case 2:
            weekdayString = @"周一";
            break;
        case 3:
            weekdayString = @"周二";
            break;
        case 4:
            weekdayString = @"周三";
            break;
        case 5:
            weekdayString = @"周四";
            break;
        case 6:
            weekdayString = @"周五";
            break;
        case 7:
            weekdayString = @"周六";
            break;
        default:
            break;
    }
    
    NSString *dayStr = nil;
    if (day < 10) {
        dayStr = [NSString stringWithFormat:@"0%ld",day];
    }else{
        dayStr = [NSString stringWithFormat:@"%ld",day];
    }
    
    NSString *hourStr = nil;
    if (hour < 10) {
        hourStr = [NSString stringWithFormat:@"0%ld",hour];
    }else{
        hourStr = [NSString stringWithFormat:@"%ld",hour];
    }
    
    NSString *minuteStr = nil;
    if (minute < 10) {
        minuteStr = [NSString stringWithFormat:@"0%ld",minute];
    }else{
        minuteStr = [NSString stringWithFormat:@"%ld",minute];
    }
    
    return [NSString stringWithFormat:@"%ld/%@ %@:%@",month,dayStr,hourStr,minuteStr];
   
}

禁止手機(jī)睡眠

[UIApplication sharedApplication].idleTimerDisabled = YES;

編譯的時候遇到 no such file or directory: /users/apple/XXX

答:是因為編譯的時候,在此路徑下找不到這個文件,解決這個問題,首先是是要檢查缺少的文件是不是在工程中,如果不在工程中,需要從本地拖進(jìn)去,如果發(fā)現(xiàn)已經(jīng)存在工程中了,或者拖進(jìn)去還是報錯,這時候需要去build phases中搜索這個文件,這時候很可能會搜出現(xiàn)兩個相同的文件,這時候,有一個路徑是正確的,刪除另外一個即可。如果刪除了還是不行,需要把兩個都刪掉,然后重新往工程里拖進(jìn)這個文件即可

顏色轉(zhuǎn)換成圖片

+ (UIImage *)cl_imageWithColor:(UIColor *)color {
  CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  UIGraphicsBeginImageContext(rect.size);
  CGContextRef context = UIGraphicsGetCurrentContext();
 
  CGContextSetFillColorWithColor(context, [color CGColor]);
  CGContextFillRect(context, rect);
 
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
 
  return image;
}

獲取app緩存大小

- (CGFloat)getCachSize {
 
    NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];
    //獲取自定義緩存大小
    //用枚舉器遍歷 一個文件夾的內(nèi)容
    //1.獲取 文件夾枚舉器
    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
    NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath];
    __block NSUInteger count = 0;
    //2.遍歷
    for (NSString *fileName in enumerator) {
        NSString *path = [myCachePath stringByAppendingPathComponent:fileName];
        NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
        count += fileDict.fileSize;//自定義所有緩存大小
    }
    // 得到是字節(jié)  轉(zhuǎn)化為M
    CGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;
    return totalSize;
}

清理app緩存

- (void)handleClearView {
    //刪除兩部分
    //1.刪除 sd 圖片緩存
    //先清除內(nèi)存中的圖片緩存
    [[SDImageCache sharedImageCache] clearMemory];
    //清除磁盤的緩存
    [[SDImageCache sharedImageCache] clearDisk];
    //2.刪除自己緩存
    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
    [[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];
}

常用權(quán)限判斷

    if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {
        NSLog(@"沒有定位權(quán)限");
    }
    AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    if (statusVideo == AVAuthorizationStatusDenied) {
        NSLog(@"沒有攝像頭權(quán)限");
    }
    //是否有麥克風(fēng)權(quán)限
    AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
    if (statusAudio == AVAuthorizationStatusDenied) {
        NSLog(@"沒有錄音權(quán)限");
    }
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        if (status == PHAuthorizationStatusDenied) {
            NSLog(@"沒有相冊權(quán)限");
        }
    }];

獲取手機(jī)和app信息

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
 CFShow(infoDictionary);  
// app名稱  
 NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
 // app版本  
 NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
 // app build版本  
 NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];  
    //手機(jī)序列號  
    NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];  
    NSLog(@"手機(jī)序列號: %@",identifierNumber);  
    //手機(jī)別名: 用戶定義的名稱  
    NSString* userPhoneName = [[UIDevice currentDevice] name];  
    NSLog(@"手機(jī)別名: %@", userPhoneName);  
    //設(shè)備名稱  
    NSString* deviceName = [[UIDevice currentDevice] systemName];  
    NSLog(@"設(shè)備名稱: %@",deviceName );  
    //手機(jī)系統(tǒng)版本  
    NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];  
    NSLog(@"手機(jī)系統(tǒng)版本: %@", phoneVersion);  
    //手機(jī)型號  
    NSString* phoneModel = [[UIDevice currentDevice] model];  
    NSLog(@"手機(jī)型號: %@",phoneModel );  
    //地方型號  (國際化區(qū)域名稱)  
    NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];  
    NSLog(@"國際化區(qū)域名稱: %@",localPhoneModel );  
 
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
    // 當(dāng)前應(yīng)用名稱  
    NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
    NSLog(@"當(dāng)前應(yīng)用名稱:%@",appCurName);  
    // 當(dāng)前應(yīng)用軟件版本  比如:1.0.1  
    NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
    NSLog(@"當(dāng)前應(yīng)用軟件版本:%@",appCurVersion);  
    // 當(dāng)前應(yīng)用版本號碼   int類型  
    NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];  
    NSLog(@"當(dāng)前應(yīng)用版本號碼:%@",appCurVersionNum);

獲取一個類的所有屬性

id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

身份證號驗證

- (BOOL)validateIdentityCard {
    BOOL flag;
    if (self.length <= 0) {
        flag = NO;
        return flag;
    }
    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    return [identityCardPredicate evaluateWithObject:self];
}

合并兩個圖片

+ (UIImage*)mergeImage:(UIImage*)firstImage withImage:(UIImage*)secondImage {
    CGImageRef firstImageRef = firstImage.CGImage;
    CGFloat firstWidth = CGImageGetWidth(firstImageRef);
    CGFloat firstHeight = CGImageGetHeight(firstImageRef);
    CGImageRef secondImageRef = secondImage.CGImage;
    CGFloat secondWidth = CGImageGetWidth(secondImageRef);
    CGFloat secondHeight = CGImageGetHeight(secondImageRef);
    CGSize mergedSize = CGSizeMake(MAX(firstWidth, secondWidth), MAX(firstHeight, secondHeight));
    UIGraphicsBeginImageContext(mergedSize);
    [firstImage drawInRect:CGRectMake(0, 0, firstWidth, firstHeight)];
    [secondImage drawInRect:CGRectMake(0, 0, secondWidth, secondHeight)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

畫水印

- (void) setImage:(UIImage *)image withWaterMark:(UIImage *)mark inRect:(CGRect)rect
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0)
    {
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
    }
    //原圖
    [image drawInRect:self.bounds];
    //水印圖
    [mark drawInRect:rect];
    UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    self.image = newPic;
}

獲取視頻的時長

+ (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {
    NSURL *videoUrl = [NSURL URLWithString:urlString];
    AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];
    CMTime time = [avUrl duration];
    int seconds = ceil(time.value/time.timescale);
    return seconds;
}

-[ViewController aMethod:]: unrecognized selector sent to instance 0x7fe91e607fb0

這是一個經(jīng)典錯誤,ViewController不能響應(yīng)aMethod這個方法,錯誤原因可能viewController文件中沒有實現(xiàn)aMethod這個方法

讓手機(jī)震動一下

#import
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
或者
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

將一個image保存在相冊中

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
或者
#import
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        changeRequest.creationDate          = [NSDate date];
    } completionHandler:^(BOOL success, NSError *error) {
        if (success) {
            NSLog(@"successfully saved");
        }
        else {
            NSLog(@"error saving to photos: %@", error);
        }
    }];

UITextView中打開或禁用復(fù)制,剪切,選擇,全選等功能

// 繼承UITextView重寫這個方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
// 返回NO為禁用,YES為開啟
    // 粘貼
    if (action == @selector(paste:)) return NO;
    // 剪切
    if (action == @selector(cut:)) return NO;
    // 復(fù)制
    if (action == @selector(copy:)) return NO;
    // 選擇
    if (action == @selector(select:)) return NO;
    // 選中全部
    if (action == @selector(selectAll:)) return NO;
    // 刪除
    if (action == @selector(delete:)) return NO;
    // 分享
    if (action == @selector(share)) return NO;
    return [super canPerformAction:action withSender:sender];
}

runtime為一個類動態(tài)添加屬性

// 動態(tài)添加屬性的本質(zhì)是: 讓對象的某個屬性與值產(chǎn)生關(guān)聯(lián)
        objc_setAssociatedObject(self, WZBPlaceholderViewKey, placeholderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

KVO監(jiān)聽某個對象的屬性

// 添加監(jiān)聽者
[self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:nil];

// 當(dāng)監(jiān)聽的屬性值變化的時候會來到這個方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"property"]) {
       [self textViewTextChange];
       } else {
     }
}

網(wǎng)絡(luò)監(jiān)測

NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
    if (status == NotReachable) {
        NSLog(@"當(dāng)前設(shè)備無網(wǎng)絡(luò)");
    }
    if (status == ReachableViaWiFi) {
        NSLog(@"當(dāng)前wifi網(wǎng)絡(luò)");
    }
    if (status == NotReachable) {
        NSLog(@"當(dāng)前蜂窩移動網(wǎng)絡(luò)");
    }

webView中url特殊字符處理

中文的話會出現(xiàn)請求不成功的情況。

NSString *urlString = @"http://baidu?n=我們"; 
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL *url = [NSURL urlWithString:urlString]; 

特殊字符的問題。

空格  URL中的空格可以用+或者編碼%20
/  分隔目錄和子目錄   %2F
?  分隔實際的URL和參數(shù)  %3F
%  制定特殊字符  %25
 #  表示書簽  %23
&  URL中指定的參數(shù)間的分隔符  %26
 =   URL中指定參數(shù)的值  %3D

以空格為例
NSString *urlString = @"http://baidu?t=2012/9/1 20:00:30"; 
urlString = [urlString replaceOccurrencesOfString:@" " withString:@"%20"]; 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容