ios - 钥匙串如何仅删除特定项目
问题描述
我是 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 键。需要怎么做??请帮我
解决方案
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 类与您的保存功能相同,但是如果您需要删除的密钥具有不同的类,您也可以更改它
推荐阅读
- laravel - 在 Laravel 中使用 npm run prod (Webpack) 的 CSS 加载器中的 ValidationError
- visual-studio - 为什么处理的异常仍然显示在控制台中以及如何完全抑制它们
- c++ - 为什么这个演员会失败?- 虚幻引擎 4
- javascript - Javascript单击HTML元素不起作用
- javascript - 如何在没有抗锯齿的情况下在画布上绘制像素字体
- angular - 图标未以页脚角度显示
- vue.js - Vue 版本 2.4.2/vue.js 到 3.1.5/vue.cjs.js
- r - 如何从标题中传递一个元素,然后传递给 R Notebook 中的函数?
- java - Javadoc 忽略子包
- javascript - React 使变量随机上升一个随机值,直到达到阈值