前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-Swift 完整登录方案(touchID&faceID&keychain)二iOS-Swift 完整登录方案(touchID&faceID&keychain)二

iOS-Swift 完整登录方案(touchID&faceID&keychain)二iOS-Swift 完整登录方案(touchID&faceID&keychain)二

作者头像
用户8893176
发布2021-08-09 14:22:58
1.2K0
发布2021-08-09 14:22:58
举报
文章被收录于专栏:小黑娃Henry小黑娃Henry

登录流程

核心代码逻辑在这3个类中:

  1. UserInfo
  2. LoginManage
  3. LogoutManage

UserInfo 用户信息管理类(单例)

单例初始化,将核心对象从本地取出以及核心逻辑

代码语言:javascript
复制
private override init(){
    super.init()
    if let loginModel = UserTokenModel.getLoginInfoModel() {
        self.userLoginInfoModel = loginModel
    }
    if let infoModel = UserInfoModel.getInfoModel()  {
        self.userInfoModel = infoModel
    }
}

/// 更新本地登录信息
public class func setUserInfoModel(_ userAccout:String, accessToken:String)
{
    if let model = UserTokenModel.updateUserLoginInfoModel(userAccout, accessToken: accessToken)
    {
        shared.userLoginInfoModel = model
    }
}

/// 更新本地个人信息,清空本地用户数据
......

包含:用户登录信息、用户个人信息、用户偏好设置、设备信息等等;

其中主要介绍:UserTokenModel、UserInfoModel;

UserTokenModel用于保存用户登录信息

  • UserTokenModel包含用户名、用户唯一识别码
  • 使用keychain保存。
  • 包含增、删、改、查。

UserInfoModel用于保存用户个人信息

  • UserInfoModel包含用户个人信息、配置等等。
  • 使用归档方式保存,其实也可以考虑使用FMDB、CoreData
  • 需要实现NSCoding协议
  • 包含增、删、改、查。

LoginManage登录操作管理类 有两种方式:密码登录,生物验证登录 密码登录方式:

  1. 密码RSA加密避免明文传输
  2. 进行登录操作
  3. 登录成功后进行首次生物验证,
  4. 验证成功后,保存相关登录信息用于生物验证登录
代码语言:javascript
复制
public class func passWordLogin(userAccout:String, password:String, fail:@escaping failCallBack) {
    //密码RSA加密
    let resPassWord = RSAHandler.RSAEncryptedHandler(password) ?? ""
    /*
        与后端交互,此处省略
     */
    LocalAuthManager.userLocalAuth("开启生物验证") {(state, error) -> (Void) in
        if state == .success {
            UserInfo.setUserInfoModel(userAccout, accessToken: resPassWord)
            loginSucess()
        }else{
            //生物识别虽然失败但登录依旧成功,所以不保存用户登录信息。
            loginSucess()
            fail(state.rawValue)
            print("认证失败")
        }
    }
}

生物验证登录 前提:在使用此种方式之前必须有一次成功的密码登录。

代码语言:javascript
复制
public class func authLogin(fail:@escaping failCallBack) {
    LocalAuthManager.userLocalAuth("生物验证") {(state, error) -> (Void) in
        if state == .success {
            loginSucess()
        }else{
            fail(state.rawValue)
            print("登录失败")
        }
    }
}

退出流程

LogoutManage 退出操作管理类 本地数据清理,页面跳转.(代码省略)

Window.RootVC的值

代码语言:javascript
复制
//rootVC切换
    let vcLogin = UIApplication.shared.keyWindow?.rootViewController
    let vcRoot = RootViewController()
    UIApplication.shared.keyWindow?.rootViewController = vcRoot
    //手动释放登录页面
    vcLogin?.dismiss(animated: false, completion: nil)

iOS-Swift 完整登录方案(touchID&faceID&keychain)一 传送门

git源码地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019/6/6 下午,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • git源码地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档