钥匙串如何仅删除特定项目



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

我为此目的使用钥匙串。但是现在我只想删除/删除一个密钥。但我在如何做到这一点方面遇到了问题。这是我从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密钥。需要怎么做??请帮助我

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 类与您的保存函数相同,但如果您需要删除的密钥具有不同的类,您也可以更改它

GitHub上有一个很好的包装器用于访问系统钥匙串:

山姆链

只需使用"设置密码"和"删除密码"功能即可满足您的需求。

您可以像共享首选项一样使用用户默认值对于Swift 3:对于使用键设置字符串值UserDefaults.standard.set("2", forKey: "LOGINID")

对于使用键获取字符串值let LoginID = UserDefaults.standard.string(forKey: "LOGINID")!

用于按键删除UserDefaults.standard.removeObject(forKey: "LOGINID")

对于 Swift2.2,letdefaults = NSUserDefaults.standardUserDefaults()defaults.setObject("2", forKey: "LOGINID")

最新更新