验证码之图像验证码

Posted iOS的美丽岁月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码之图像验证码相关的知识,希望对你有一定的参考价值。

1、在App的开发中,各种验证码层出不穷。

   现在主流的验证码方式是: 1、手机验证码:就是用户使用手机获取短信得到验证码,在输入App中。2、就是App 生成图形,展示在用户的手机上,用户根据图片展示输入验证码。下面我们就对第二种进行探究。

2、先看本博客实现的效果


3、呼朋唤友

群的特点:

  1、iOS 开发交流群,每周都有更新新的内容。

  2、群里有3~5年的资深开发者。

  3、群员在App开发过程中遇到什么问题,可以在群里提问。

  4、群员在App开发中,如果遇到难实现的功能或者模块,可以在群里提出,有人员帮助你实现。

  5、加入群后,可以get到App 开发中的一些小功能模块。

  群号是:185341804   群名字:成功QQ吧

  群主号:1542100658 (qq)

4、代码展示

1》 工程中的使用代码

        VerificationCodeLable * lable = [[VerificationCodeLable alloc]initWithFrame:CGRectMake(130, 100+ i*80, 100, 30)];

        [self.view addSubview:lable];


2》网络获取验证码的数值

/**

 获取验证码的值

 */

-(void)getVerificationCodeValue

    /**

     防止重复点击

     */

    CFAbsoluteTime  startTime = CFAbsoluteTimeGetCurrent();

    CFAbsoluteTime  saveTime = [[[NSUserDefaults standardUserDefaults] objectForKey:@"CurrentTime"] doubleValue];

    if (startTime -saveTime >2000)

        [[NSUserDefaults standardUserDefaults] setObject:@(startTime) forKey:@"CurrentTime"];

        [[NSUserDefaults standardUserDefaults] synchronize];

        /**

         创建接受数据

         */

        responseData = [NSMutableData dataWithCapacity:0];

         /**

          可以重新获取验证码的值

          */

        NSURLSession * session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

        NSURLSessionDataTask * Task = [session dataTaskWithURL:[NSURL URLWithString:@""]];

        [Task resume];

    


3》颜色随机获取

/**

 颜色随机获取

 @return 颜色对象

 */

-(UIColor*)colorAcquisition:(float)alpha

    CGFloat R,G,B = 0.0;

    R = arc4random() % 255 /255.0;

    G = arc4random() % 255 /255.0;

    B = arc4random() % 255 /255.0;

    UIColor * color = [UIColor colorWithRed:R green:G blue:B alpha:alpha];

    return color;


4》底层乱线的绘制

/**

 绘制背景线条

 */

-(void)drawBackLine:(CGRect)rect

    /**

     获取上下文

     */

    CGContextRef contextRef  = UIGraphicsGetCurrentContext();

    /**

     色值画笔的宽度

     */

    CGContextSetLineWidth(contextRef, 1.0f);

    /**

     获取绘制点

     */

    for (unsigned i =0 ; i<8; i++)

        /**

          获取画笔的颜色

          */

        CGContextSetStrokeColorWithColor(contextRef, [self colorAcquisition:0.25f].CGColor);

        /**

         获取绘制的初始点

         */

        float pX = arc4random() % (int)rect.size.width;

        float pY = arc4random() % (int)rect.size.height;

        /**

         移动画笔

         */

        CGContextMoveToPoint(contextRef, pX, pY);

        float pend_X = arc4random() % (int)rect.size.width;

        float pend_Y = arc4random() % (int)rect.size.height;

        CGContextAddLineToPoint(contextRef, pend_X, pend_Y);

        CGContextStrokePath(contextRef);

   


5》验证码的绘制

- (void)drawRect:(CGRect)rect

    [super drawRect:rect];

    /**

     计算单个字体的大小

     */

    CGSize singleSize = [@"Z" sizeWithAttributes:@NSFontAttributeName:[UIFont systemFontOfSize:15]];

    /**

     单个字体剩余的宽

     */

    CGFloat singleSurplusWeight = rect.size.width / verificationCodeString.length - singleSize.width;

    /**

     单个字体剩余的宽

     */

    CGFloat singleSurplusHeight = rect.size.height - singleSize.height;

    /**

     获取绘制参数,并开始绘制

     */

    float pX ,pY;

    for (unsigned i = 0; i<verificationCodeString.length; i++)

         /**

          随机获取绘制的点

          */

        pX = arc4random() % (int)singleSurplusWeight + rect.size.width /verificationCodeString.length* i;

        pY = arc4random() % (int)singleSurplusHeight;

        /**

         获取要绘制的字

         */

        unichar objectChar = [verificationCodeString characterAtIndex:i];

        NSString * drawStr = [NSString  stringWithFormat:@"%c",objectChar];

        /**

         绘制对象

         */

        [drawStr drawAtPoint:CGPointMake(pX, pY) withAttributes:@NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[self colorAcquisition:1.0]];

   

    /**

     创建文本底线

     */

    [self drawBackLine:rect];


5、代码下载

https://pan.baidu.com/s/1pLAYMNL


以上是关于验证码之图像验证码的主要内容,如果未能解决你的问题,请参考以下文章

短信验证码之验证码回显

01_验证码之字符验证码

验证码之图片验证码

中文点选验证码之自动识别

网络安全丨中文点选验证码之自动识别

android 验证码之短信验证(云之讯短信平台)