美文网首页
浅谈验证

浅谈验证

作者: lotawei | 来源:发表于2018-01-30 09:51 被阅读18次

用户的数据如何保证是有效的?我就慢慢看着说说话.只说方式不说原理有兴趣的请自行查阅
互联网中有许多保护措施传统的方式有cookie session 基本上用于网页端,因为算是比较透明.网页上不太安全随着各种加密算法被大家广泛了解.网页上是变得越来越不安全了,或者说可以达到一定的安全但是在某些需求上或许在安全上在网页上会下更大的成本,目前很多行业在验证上采用的是token这种方式在好一点的是手机验证加客户端扫码验证,来验证更合法的用户.
但是今天不是说传统的验证模式的,在简书中发现简书的验证和火车票验证的图片验证方式貌似很有趣,而且那些图片不经意中可以给人打广告深入人心.那就是极验验证,百度查了下我就不秀了.
如何在iOS 上实现类似效果的验证呢??
要快速实现可以采用第三方服务搜索极验验证即可.
算是个挑战自己实现这一套吧!
实现的效果类似简书的效果


image.png makeanimation.gif

思路什么的无非控制的视图panview 实现 begin move end 时进行控制视图,然后是裁剪的图的位置或者不需要裁剪放在想要的地方进行拖拽验证,时间记录也在begin中记录开始时间,end中记录结束时间即可这部分有需要的自行实现吧

//
//  ManualView.swift
//  SlideAuthorizon
//
//  Created by lotawei on 2018/1/30.
//  Copyright © 2018年 lotawei. All rights reserved.
//

import Foundation
import UIKit

//目前支持两种 从左滑到右的 点击的
enum  ManualType:Int{
    case  leftrightslide=0,clickmusic
}
protocol PanViewDelegate {
    func     poschange(_ pos:CGPoint)
    //每次end产生一个结果
    func    isendchange( ispass:Bool)
    
}
//一个元组  右边界  每个item的大小
var   targetpos:(CGFloat,CGFloat) = (0,50)
extension  CGPoint {
    static  func  checkinValue(_ prevalue:Int,px1:CGFloat,px2:CGFloat) -> Bool{
        let  hasx = abs(Int32( px1 - px2))
        if hasx < Int32(prevalue){
            return true
        }
        return  false
    }
}
class  PanView:UIView{
 
    var   delegate:PanViewDelegate?
    private  var  originalcentx:CGFloat = 0
    //目标矩形框
    private  var  tartrec:CGRect = CGRect.zero
    //当前移动的矩形框
    private  var  currect:CGRect = CGRect.zero
    var   begindata:Date!
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //改变x
        originalcentx = self.center.x
        
        
        
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let pos    = touches.first?.location(in: self.superview)
        
        let asuperview = self.superview!
        let  maxx = asuperview.frame.size.width
        
        if  (pos?.x)! <= maxx - self.frame.size.width{
            
            self.frame.origin.x =  (pos?.x)!
        }
        else{
            self.frame.origin.x =   maxx - self.frame.size.width
        }
        //记录当前的矩形框
        currect  = CGRect.init(x:  self.frame.origin.x, y: 0, width: self.frame.size.width, height: self.frame.size.height)
        
        
        if  delegate  != nil {
            
            
            self.delegate?.poschange(pos!)
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let pos    = touches.first?.location(in: self.superview)
        
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
                self.center.x = self.originalcentx
        })
        let  ispass = CGPoint.checkinValue(2, px1: pos!.x, px2: targetpos.0)
        if  delegate != nil {
            self.delegate?.isendchange(ispass: ispass)
        }
    }
    override func awakeFromNib() {
        clipsToBounds = true
        layer.cornerRadius = 15
        backgroundColor = #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)
        
    }
    func   setdelegate(_ delegate:PanViewDelegate){
        
        self.delegate = delegate

    }
}
class  ManualView:UIView,PanViewDelegate{
    private var  originalx:CGFloat = 10
    private  var  originaly:CGFloat = 0
    @IBOutlet weak var panview: PanView!
    @IBOutlet weak var codeimg: UIImageView!
    //需要移动的滑块
    lazy  var   movesizeview:UIImageView = {
        let  aview = UIImageView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
        return aview
    }()
    lazy  var   fadeview:UIView = {
        let  aview = UIView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
        aview.alpha = 0.5
        aview.backgroundColor = UIColor.white
        return aview
    }()
    static  let  shareview:ManualView = {
        let aview = Bundle.main.loadNibNamed("ManualView", owner: nil, options: nil)?.first as! ManualView
        return  aview
    }()
    @IBOutlet weak var   slideview:UIView!
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    func  setimageview(_ codeimg:UIImage,_ targetsize:CGSize){
        movesizeview.frame.size = targetsize
        
        let   disimage = UIImage.convertView(toImage: self.codeimg)
        
        let  atrrec = CGRect.init(x: self.codeimg.frame.size.width - 80, y: self.codeimg.center.y - targetsize.height/2.0 , width: targetsize.width, height: targetsize.height)
        movesizeview.image = UIImage.clipfacnewimage(disimage, atrrec)
        //带阴影的区域
        fadeview.frame = atrrec
        movesizeview.frame.origin = CGPoint.init(x: originalx, y: atrrec.minY)
        self.panview.delegate = self
        
        //更改全局的位置信息
        targetpos.0 = self.codeimg.frame.size.width - 80
         targetpos.1 = targetsize.width
    }
    override func draw(_ rect: CGRect) {
        debugPrint("draw")
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        debugPrint("awakeFromNib")
        slideview.clipsToBounds  = true
        slideview.layer.cornerRadius = 15
        self.codeimg.addSubview(movesizeview)
        self.codeimg.addSubview(fadeview)
    }
    /// 获取到的坐标改变
    ///
    /// - Parameter pos: 移动到的坐标
    func poschange(_ pos: CGPoint) {
        self.movesizeview.frame.origin.x = pos.x
    }
    func isendchange(ispass: Bool) {
        if  ispass {
         
            //fadeview的动画
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
                self.movesizeview.frame.origin.x = self.originalx
                self.movesizeview.transform  = CGAffineTransform.init(scaleX: 1.5, y: 1.5)
                    self.movesizeview.transform  = CGAffineTransform.identity
                
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 2, y: 1)
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 0.5, y: 1)
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 1, y: 1)
            })
            
        }else{
           UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
                self.movesizeview.frame.origin.x = self.originalx
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 2, y: 1)
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 0.5, y: 1)
                self.fadeview.transform  = CGAffineTransform.init(scaleX: 1, y: 1)
            })
            
        }
    }
}

extension  UIImage {
    static   func  clipfacnewimage(_ orimg:UIImage,_ rec:CGRect) -> UIImage {
       let   ref =  orimg.cgImage!.cropping(to: rec)
        let  scal = UIImage.init(cgImage: ref!)
   
        return  scal
    }
   static   func convertView(toImage v: UIView) -> UIImage {
        let s: CGSize = v.bounds.size
        // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
        UIGraphicsBeginImageContextWithOptions(s, true, UIScreen.main.scale)
        v.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image ?? UIImage()
    }
}

//使用方式
    lazy var  aview:ManualView = {
       return  ManualView.shareview
    }()

   
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(self.aview)
        aview.frame = CGRect.init(x:0, y: 100, width: 300, height: 300)
        aview.setimageview(#imageLiteral(resourceName: "codeimg"), CGSize.init(width: 60, height: 60))
        aview.center = view.center
        // Do any additional setup after loading the view, typically from a nib.
    }

相关文章

  • 浅谈验证

    用户的数据如何保证是有效的?我就慢慢看着说说话.只说方式不说原理有兴趣的请自行查阅互联网中有许多保护措施传统的方式...

  • cookie验证浅谈

    cookie和session为浏览器中的会话机制。 1、如何查看cookie回话? 可通过打开Chrome浏览器的...

  • 浅谈当代安全验证

    1、使用验证码的目的:进行强制的人机交互以此来抵御机器的自动化攻击。、 作用:防御暴力破解、撞库、用户遍历、...

  • 浅谈Http API验证

    0x01 首先我们得知道,目前web应用主要面临的安全问题: 1.数据篡改 2.数据窃取 3.重放攻击 4.非法参...

  • 2020-07-02

    浅谈 浅谈模块设计宏内核 浅谈接口设计Flags 浅谈稳定性设计重试 浅谈人员业务结构设计矩阵式 浅谈接口设计 |...

  • 浅谈Filecoin(二)

    浅谈Filecoin(二) 浅谈Filecoin(一)链接:浅谈Filecoin(一) (Verifiable)M...

  • 浅谈Web安全验证码

    春运又称“年度全球最大规模的人口流动”,是一部“人民的斗争史”,起初只是与黄牛斗智斗勇,后来为了整治黄牛12306...

  • 浅谈短信验证码漏洞

    前言 在日常的授权测试中,很大一部分只有一个登录界面,在这个登录界面其实可以测试的东西有很多,比如用户名枚举,弱密...

  • 浅谈runtime关联

    浅谈runtime关联 浅谈runtime关联

  • 浅谈编译过程

    浅谈编译过程浅谈编译过程

网友评论

      本文标题:浅谈验证

      本文链接:https://www.haomeiwen.com/subject/khpqzxtx.html