|
//
// 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)
}
}
}
}
}
|