暂无描述

UserInfo.swift 6.4KB

    // // UserInfo.swift // HuaXueQuan // // Created by yangbin on 15/9/9. // Copyright © 2015年 hxq. All rights reserved. // import UIKit extension UserDefaults { struct Account: BoolUserDefaultable, StringUserDefaultable, IntUserDefaultable{ enum BoolDefaultKey: String { case isUserLoggedIn case isAudit } enum StringDefaultKey: String { case userId case username case token case photoPath case name case country case province case city case sex case phonenumber case realName } enum IntDefaultKey: String { case age } static func removeAll(){ UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier ?? "") } } } private let tokenKey = "tokenKey" private let userIdKey = "userIdKey" var SharedUserInfo: UserInfo { get { return UserInfo.sharedUserInfo } } class UserInfo: NSObject { static let sharedUserInfo = UserInfo() var isLogin: Bool { get { return UserDefaults.Account.bool(forKey: .isUserLoggedIn) } } var userName = "" var password = "" var userId = "" var token = "" var photoPath = "" var name = "" var age = 0 var country = "" var province = "" var city = "" var sex = "" var uuid: String { get { let keyChainDic = NSMutableDictionary() keyChainDic.setObject(String(kSecClassGenericPassword), forKey: kSecClass as! NSCopying) keyChainDic.setObject("uuid", forKey: kSecAttrAccount as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnAttributes as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnData as! NSCopying) var result: AnyObject? var uuidStr: String? = nil SecItemCopyMatching(keyChainDic, &result) if let resultDic = result as? NSDictionary { if let data = resultDic.object(forKey: kSecValueData) as? Data { uuidStr = NSString(data: data, encoding: String.Encoding.ascii.rawValue) as String? } } if uuidStr == nil { uuidStr = UUID().uuidString let data = uuidStr!.data(using: String.Encoding.ascii) keyChainDic.setObject(data!, forKey: kSecValueData as! NSCopying) SecItemAdd(keyChainDic, nil) } return uuidStr! } } func deleteSecurity() { let queryDic: [String : AnyObject] = [String(kSecClass): kSecClassGenericPassword, String(kSecAttrAccount): userIdKey.digestString(algorithm: .md5) as AnyObject] SecItemDelete(queryDic as CFDictionary) } func saveScurity() { let keyChainDic = NSMutableDictionary() keyChainDic.setObject(kSecClassGenericPassword, forKey: kSecClass as! NSCopying) keyChainDic.setObject(userIdKey, forKey: kSecAttrAccount as! NSCopying) var update = [AnyHashable: Any]() let security = [userIdKey: userId.AES128EncryptToBase64String(), tokenKey: token] let data = try! JSONSerialization.data(withJSONObject: security, options: []) update.updateValue(data, forKey: (kSecValueData as! NSCopying) as! AnyHashable) var status = SecItemUpdate(keyChainDic, update as CFDictionary) if status != errSecSuccess { keyChainDic.addEntries(from: update) status = SecItemAdd(keyChainDic, nil) } } func synchronize() { saveScurity() UserDefaults.Account.set(true, forKey: .isUserLoggedIn) UserDefaults.Account.set(userId.digestString(algorithm: .md5), forKey: .userId) UserDefaults.Account.set(userName, forKey: .username) UserDefaults.Account.set(token, forKey: .token) UserDefaults.Account.set(photoPath, forKey: .photoPath) UserDefaults.Account.set(name, forKey: .name) UserDefaults.Account.set(age, forKey: .age) UserDefaults.Account.set(country, forKey: .country) UserDefaults.Account.set(province, forKey: .province) UserDefaults.Account.set(city, forKey: .city) UserDefaults.Account.set(sex, forKey: .sex) loadFromLocal() } fileprivate override init() { super.init() loadFromLocal() } func clearUserInfo() { deleteSecurity() UserDefaults.Account.removeAll() SharedUserInfo.userId = "" loadFromLocal() } fileprivate func loadFromLocal() { userName = UserDefaults.Account.string(forKey: .username) token = UserDefaults.Account.string(forKey: .token) photoPath = UserDefaults.Account.string(forKey: .photoPath) name = UserDefaults.Account.string(forKey: .name) age = UserDefaults.Account.int(forKey: .age) country = UserDefaults.Account.string(forKey: .country) province = UserDefaults.Account.string(forKey: .province) city = UserDefaults.Account.string(forKey: .city) sex = UserDefaults.Account.string(forKey: .sex) let keyChainDic = NSMutableDictionary() keyChainDic.setObject(kSecClassGenericPassword, forKey: kSecClass as! NSCopying) keyChainDic.setObject(userIdKey, forKey: kSecAttrAccount as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnAttributes as! NSCopying) keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnData as! NSCopying) var result: AnyObject? SecItemCopyMatching(keyChainDic, &result) if let resultDic = result as? NSDictionary { if let data = resultDic.object(forKey: kSecValueData as! NSCopying) as? Data { do { let securityDic = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) guard let securityInfo = securityDic as? [String:String], let user_id = securityInfo[userIdKey] else { return } self.userId = user_id.AES128DecryptFromBase64StringToString() self.token = securityInfo[tokenKey] ?? "" } catch { printLog("读取用户账号信息有误:\n\(error)") SecItemDelete(keyChainDic) } } } } }