美文网首页
Swift使用KeyedUnarchiver存取数据

Swift使用KeyedUnarchiver存取数据

作者: 左方 | 来源:发表于2021-11-08 11:03 被阅读0次
    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存取数据

          本文链接:https://www.haomeiwen.com/subject/iwduzltx.html