Ios Keychain如何仅删除特定项目
我是iOS新手。我需要在本地保存数据。和android一样,我们可以在SharedReferences中保存数据。开发人员可以清除整个共享首选项,还可以删除/删除特定密钥 我使用钥匙链就是为了这个目的。但现在我只想删除/删除一个密钥。但我在如何做到这一点上遇到了问题。这是我从SO那里得到的钥匙链密码Ios Keychain如何仅删除特定项目,ios,iphone,keychain,Ios,Iphone,Keychain,我是iOS新手。我需要在本地保存数据。和android一样,我们可以在SharedReferences中保存数据。开发人员可以清除整个共享首选项,还可以删除/删除特定密钥 我使用钥匙链就是为了这个目的。但现在我只想删除/删除一个密钥。但我在如何做到这一点上遇到了问题。这是我从SO那里得到的钥匙链密码 public class KeychainService: NSObject { static let USER_PIN : String = "USER_PIN" sta
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 }
}
}
公共类密钥链服务:NSObject{
静态let USER\u PIN:String=“USER\u PIN”
静态let LOGGEDIN\u ID:String=“LOGGEDIN\u ID”
静态let USER\u NAME:String=“USER\u NAME”
静态let IS\u USER\u LOGGEDIN:String=“IS\u USER\u LOGGEDIN”
静态let是否已下载应用程序设置:String=“是否已下载应用程序设置”
静态让应用程序设置下载:String=“应用程序设置下载”
静态let APP\u NAME:String=“APP\u NAME”
类func iterateKeychainItems(日志:Bool,删除:Bool){
设secItemClasses=[
kSecClassGenericPassword,
kSecClassInternetPassword,
kSecClassCertificate,
kSecClassKey,
kSecClassIdentity
]
如果(日志){
对于secItemClass中的secItemClass{
let query:[字符串:任意]=[
kSecReturnAttributes作为字符串:kCFBooleanTrue,
kSecMatchLimit作为字符串:kSecMatchLimitAll,
kSecClass作为字符串:secItemClass
]
var结果:AnyObject?
let status=SecItemCopyMatching(查询为CFDictionary,&结果)
如果状态==noErr{
打印(结果如有)
}
}
打印(“AppUsageMetadata.iterateKeychainItems结束”)
}
如果(删除){
对于secItemClass中的secItemClass{
let dictionary=[kSecClass as String:secItemClass]
SecItemDelete(字典作为CFDictionary)
}
}
}
类func save(键:String,数据:data)->OSStatus{
让查询=[
kSecClass作为字符串:kSecClassGenericPassword作为字符串,
kSecAttrAccount作为字符串:键,
kSecValueData作为字符串:数据]作为[字符串:任意]
SecItemDelete(作为CFDictionary查询)
返回SecItemAdd(查询为CFDictionary,nil)
}
类func加载(键:字符串)->数据{
让查询=[
kSecClass as字符串:kSecClassGenericPassword,
kSecAttrAccount作为字符串:键,
kSecReturnData作为字符串:kCFBooleanTrue,
kSecMatchLimit as String:kSecMatchLimitOne]as[String:Any]
var dataTypeRef:AnyObject?=nil
let状态:OSStatus=SecItemCopyMatching(作为CFDictionary和dataTypeRef查询)
如果状态==noErr{
是否将dataTypeRef返回为!数据?
}否则{
归零
}
}
类func createUniqueID()->字符串{
让uuid:CFUUID=CFUUIDCreate(nil)
让cfStr:CFString=CFUUIDCreateString(nil,uuid)
让swifftString:String=cfStr作为字符串
返回快捷键
}
}
扩展数据{
初始值(起始值:T){
var值=价值
init(缓冲区:UnsafeBufferPointer(开始:&值,计数:1))
}
func to(类型:T.type)->T{
返回self.withUnsafeBytes{$0.pointee}
}
}
现在告诉我如何删除一个键/项。例如,我想
remove IS_USER_LOGGEDIN键。需要如何做??请帮帮我
您可以像使用共享首选项一样使用用户默认值 对于Swift 3: 用于使用键设置字符串值 UserDefaults.standard.set(“2”,forKey:“LOGINID”) 用于使用键获取字符串值 让LoginID=UserDefaults.standard.string(forKey:“LoginID”) 用于通过键移除 UserDefaults.standard.removeObject(forKey:“LOGINID”) 适用于Swift2.2 让defaults=NSUserDefaults.standardUserDefaults()
defaults.setObject(“2”,forKey:“LOGINID”)在GitHub上有一个很好的用于访问系统密钥链的包装器:
只需根据您的需要使用“setPassword”和“deletePassword”功能。您能在您的delete方法中添加这段代码吗?如果(status!=errSecSuccess){if let err=seccopyrormessagestring(status,nil){print(“Remove failed:(err)”,我们至少可以跟踪密钥是否被删除}我知道用户默认设置。所以问题是关于钥匙链的