首页 > 解决方案 > 钥匙串如何仅删除特定项目

问题描述

我是 iOS 新手。我需要在本地保存数据。与在 android 中一样,我们可以将数据保存在 sharedPreferences 中。开发人员可以清除整个共享首选项,也可以删除/删除特定密钥。

我为此目的使用钥匙串。但是现在我只想删除/删除一个键。但我对如何做到这一点有疑问。这是我从 SO 获得的钥匙串代码。

    public class KeychainService: NSObject {

    static let USER_PIN : String = "USER_PIN"
    static let LOGGEDIN_ID : String = "LOGGEDIN_ID"
    static let USER_NAME : String = "USER_NAME"
    static let IS_USER_LOGGEDIN : String = "IS_USER_LOGGEDIN"


    static let IS_APP_SETTINGS_DOWNLOADED : String = "IS_APP_SETTINGS_DOWNLOADED"
    static let APP_SETTINGS_DOWNLOADED : String = "APP_SETTINGS_DOWNLOADED"
    static let APP_NAME : String = "APP_NAME"

    class func iterateKeychainItems(log: Bool, delete: Bool) {
        let secItemClasses = [
            kSecClassGenericPassword,
            kSecClassInternetPassword,
            kSecClassCertificate,
            kSecClassKey,
            kSecClassIdentity
        ]

        if (log) {
            for secItemClass in secItemClasses {
                let query: [String: Any] = [
                    kSecReturnAttributes as String: kCFBooleanTrue,
                    kSecMatchLimit as String: kSecMatchLimitAll,
                    kSecClass as String: secItemClass
                ]

                var result: AnyObject?
                let status = SecItemCopyMatching(query as CFDictionary, &result)
                if status == noErr {
                    print(result as Any)
                }
            }
            print("AppUsageMetadata.iterateKeychainItems ended.")
        }

        if (delete) {
            for secItemClass in secItemClasses {
                let dictionary = [kSecClass as String:secItemClass]
                SecItemDelete(dictionary as CFDictionary)
            }
        }
    }

        class func save(key: String, data: Data) -> OSStatus {
            let query = [
                kSecClass as String       : kSecClassGenericPassword as String,
                kSecAttrAccount as String : key,
                kSecValueData as String   : data ] as [String : Any]

            SecItemDelete(query as CFDictionary)

            return SecItemAdd(query as CFDictionary, nil)
        }

        class func load(key: String) -> Data? {
            let query = [
                kSecClass as String       : kSecClassGenericPassword,
                kSecAttrAccount as String : key,
                kSecReturnData as String  : kCFBooleanTrue,
                kSecMatchLimit as String  : kSecMatchLimitOne ] as [String : Any]

            var dataTypeRef: AnyObject? = nil

            let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)

            if status == noErr {
                return dataTypeRef as! Data?
            } else {
                return nil
            }
        }

        class func createUniqueID() -> String {
            let uuid: CFUUID = CFUUIDCreate(nil)
            let cfStr: CFString = CFUUIDCreateString(nil, uuid)

            let swiftString: String = cfStr as String
            return swiftString
        }
    }

    extension Data {

        init<T>(from value: T) {
            var value = value
            self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
        }

        func to<T>(type: T.Type) -> T {
            return self.withUnsafeBytes { $0.pointee }
        }




}

所以现在告诉我如何删除一个键/项目。例如,我想删除 IS_USER_LOGGEDIN 键。需要怎么做??请帮我

标签: iosiphonekeychain

解决方案


class func delete(key: String) {
    let query = [
        kSecClass as String             : kSecClassGenericPassword as String,
        kSecAttrAccount as String       : key] as [String : Any]

    SecItemDelete(query as CFDictionary)
}

它类似于您的保存功能。我只是没有设置数据,并且 kSecClass 类与您的保存功能相同,但是如果您需要删除的密钥具有不同的类,您也可以更改它


推荐阅读