利用KeychainAccess存储用户信息

本文章包含以下几个知识点,
一,KeychainAccess存,读,删
二,model序列化和反序列化的实现

注意事项
model序列化需要添加@objcMembers,否则class_copyPropertyList遍历的属性数组为空

以下为相关代码:

XLUserInfoTool

import UIKit
import KeychainAccess

let user_path = "user.db"

class XLUserInfoTool: NSObject {

    var userPath = FileManager.getCurrentStoreagePath(user_path)
    static let shareUserInfoTool = XLUserInfoTool()
    var  userInfo: userInfoModel!

    override init() {
        super.init()
        if FileManager.checkFileIsExist(userPath) == true {
            userInfo = NSKeyedUnarchiver.unarchiveObject(withFile: userPath) as? userInfoModel
            loginStatus = (userInfo?.id != nil)
        }
    }
    var loginStatus: Bool? {
        didSet {
            if loginStatus == false {
                XLLogout()
                userInfo = UserInfoModel()
            }
            loginStatusChange()
        }
    }
    /// 保存用户
    public func saveUser() {
        guard let user = userInfo else { return }
        DispatchQueue.global().async {
            let suc = NSKeyedArchiver.archiveRootObject(user, toFile: self.userPath)
            if suc == false {
                NSLog(message:"保存user失败")
            }
        }
    }
    ///清除用户
    fileprivate func clearUser() {
        guard userInfo != nil else { return }
        let suc = FileManager.removePath(self.userPath)
        if suc == false {
            NSLog(message:"用户清除失败")
        }
    }
    ///退出登录
    func XLLogout() {
        RootVCApplicationService.init().switchToRootViewControllerByDestinationType(type: .homeLogin)
    }
    ///登录状态变更
    func loginStatusChange() {

    }
}

userInfoModel

@objcMembers class userInfoModel: : NSObject,HandyJSON,NSCoding,CodeArchive {
    var username : String?
    var token : String?
    var id : String?
    required override init() {
        super.init()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init()
        codeDecoder(coder: aDecoder)
    }
    func encode(with aCoder: NSCoder) {
        codeEncoder(with: aCoder)
    }
}

NSObject+Extension.swift

import Foundation
extension NSObject {
protocol CodeArchive {
    func codeDecoder(coder aDecoder: NSCoder)
    func codeEncoder(with aCoder: NSCoder)
}
extension CodeArchive where Self: NSObject {
    func codeDecoder(coder aDecoder: NSCoder) {
        // 这个类型可以使用CUnsignedInt,对应Swift中的UInt32
        var count: UInt32 = 0
        let properties = class_copyPropertyList(self.classForCoder, &count)
        var propertyNames: [String] = []
        // Swift中类型是严格检查的,必须转换成同一类型
        for i in 0 ..< Int(count) {
            // UnsafeMutablePointer<objc_property_t>是
            // 可变指针,因此properties就是类似数组一样,可以
            // 通过下标获取
            let property = properties![i]
            let name = property_getName(property)
            // 这里还得转换成字符串
            let propertyName = String(cString: name)
            propertyNames.append(propertyName)
            if let value = aDecoder.decodeObject(forKey: propertyName) {
                setValue(value, forKey: propertyName)
            }
        }
        // 释放内存,否则C语言的指针很容易成野指针的
        free(properties)
    }
    func codeEncoder(with aCoder: NSCoder) {
        // 这个类型可以使用CUnsignedInt,对应Swift中的UInt32
        var count: UInt32 = 0
        NSLog(message:self.classForCoder)
        let properties = class_copyPropertyList(self.classForCoder, &count)
        for i in 0 ..< Int(count) {
            // 获取属性名称
            let property = properties![i]
            let name = property_getName(property)
            let propertyName = String(cString: name)
            if (!propertyName.isEmpty) {
                // 获取Value数据
                let propertyValue = self.value(forKey: propertyName)
                if let value = propertyValue {
                    aCoder.encode(value, forKey: propertyName)
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年...
    申国骏阅读 64,752评论 15 98
  • 《来,我们说说孤独》 1·他们都在写孤独 一个诗人 如果 不说说 内心的孤独 不将孤独 写进诗里 是不是很掉价呢 ...
    听太阳升起阅读 4,420评论 1 7
  • 自幼贫民窟长大的女子,侥幸多念了两本书,枉以为可以与人平起平坐。可是人生从来都是接力赛,我们却天真的当成了百米冲刺...
    Leeanran阅读 5,798评论 1 5
  • 云舒老师,姓甚名谁,男的女的,多大岁数,这些我全然不知。之所以要写写云舒老师,完全是因为他写的文章,如一个巨大的磁...
    数豆者m阅读 2,413评论 6 9
  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 3,276评论 0 5