Swift使用KeyedUnarchiver存取数据

func keyChainIdentifier(identifier:String) -> [CFString : Any] {
        return [kSecClass:kSecClassGenericPassword,
          kSecAttrService:identifier,
          kSecAttrAccount:identifier,
       kSecAttrAccessible:kSecAttrAccessibleAfterFirstUnlock]
    }
  1. 保存数据
/**
     保存数据
     - parameter data: 要存储的数据
     - parameter identifier: 存储数据的标示
     
     - returns 成功/失败
     */
    func keyChainSaveData(data:Any, identifier:String) -> Bool {
        //存储数据的条件
        var saveQueryInfo = keyChainIdentifier(identifier: identifier)
        //删除旧的数据
        SecItemDelete((saveQueryInfo as CFDictionary))
        //设置新的数据
        saveQueryInfo[kSecValueData] = NSKeyedArchiver.archivedData(withRootObject: data)
        //添加数据
        let saveState = SecItemAdd((saveQueryInfo as CFDictionary), nil)
        // 判断是否存储成功
        if saveState == errSecSuccess {
            return true
        }
        return false
    }
  1. 读取数据
/**
     读取数据
     
     - parameter identifier: 存储数据的标示
     */
    func keyChainReadData(identifier:String) -> String? {
        //通过标记获取数据查询条件
        var readQueryInfo:[CFString : Any] = keyChainIdentifier(identifier: identifier)
        // 设置搜索条件:这是获取数据的时,必须提供的两个属性
        // 查询结果返回到 kSecValueData
        readQueryInfo[kSecReturnData] = kCFBooleanTrue
        // 只返回搜索到的第一条数据
        readQueryInfo[kSecMatchLimit] = kSecMatchLimitOne
        
        // 创建一个数据对象
        var extractedData: AnyObject?
        // 通过条件查询数据
        SecItemCopyMatching(readQueryInfo as CFDictionary, &extractedData)
        
        if extractedData == nil {
            return nil
        }
        let unarchiverData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(extractedData as! Data)
        if unarchiverData is String {
            return (unarchiverData as!String)
        }
        return nil
    }
  1. 修改数据
/**
     更新数据
     - parameter data: 要更新的数据
     - parameter identifier: 数据存储时的标示
     
     - returns 成功/失败
     */
    func keyChainUpdata(data:Any, identifier:String) -> Bool {
        // 通过标记获取数据更新的条件
        let updataQueryInfo = keyChainIdentifier(identifier: identifier)
        // 创建更新数据字典
        let updataInfo:[CFString : Any] = [kSecValueData:NSKeyedArchiver.archivedData(withRootObject: data)]
        // 获取存储的状态
        let updataStatus = SecItemUpdate(updataQueryInfo as CFDictionary, updataInfo as CFDictionary)
        // 判断是否存储成功
        if updataStatus == errSecSuccess {
            return true
        }
        return false
    }
  1. 删除数据
/**
     删除数据
     
     - parameter identifier: 存储数据的标示
     */
    func keyChainDelete(identifier:String) {
        //获取删除数据的查询条件
        let deleteQueryInfo:[CFString : Any] = keyChainIdentifier(identifier: identifier)
        SecItemDelete(deleteQueryInfo as CFDictionary)
    }

你可能感兴趣的:(Swift使用KeyedUnarchiver存取数据)