ユーザーがログアウトしたときに、サービスからキーチェーンの値を削除したい。しかし、私はそれを行うベストプラクティスの方法について混乱していると感じています。ユーザーのログアウト時にキーチェーンの値がクリアされる
は、ここで私は、私はあなたがあなたのデータをクリアすることができます何でもフォームキーホルダー実際
ユーザーがログアウトしたときに、サービスからキーチェーンの値を削除したい。しかし、私はそれを行うベストプラクティスの方法について混乱していると感じています。ユーザーのログアウト時にキーチェーンの値がクリアされる
は、ここで私は、私はあなたがあなたのデータをクリアすることができます何でもフォームキーホルダー実際
を削除する必要があるかどうかSHUREていないよ、明らかに私のサービス
let userAccount = "AuthenticatedUser"
let accessGroup = "SecuritySerivice"
let passwordKey = "KeyForPassword"
let kSecClassValue = NSString(format: kSecClass)
let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
let kSecValueDataValue = NSString(format: kSecValueData)
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
let kSecAttrServiceValue = NSString(format: kSecAttrService)
let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
let kSecReturnDataValue = NSString(format: kSecReturnData)
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
public class KeychainService: NSObject {
public class func savePassword(token: String) {
self.save(service: passwordKey, data: token)
}
public class func loadPassword() -> String? {
return self.load(service: passwordKey)
}
public class func removePassword() {
}
private class func save(service: String, data: String) {
let dataFromString: Data = data.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue), allowLossyConversion: false)!
let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue])
SecItemDelete(keychainQuery as CFDictionary)
SecItemAdd(keychainQuery as CFDictionary, nil)
}
private class func load(service: String) -> String? {
let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])
var dataTypeRef :AnyObject?
// Search for the keychain items
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
var contentsOfKeychain: String? = nil
if status == errSecSuccess {
if let retrievedData = dataTypeRef as? Data {
contentsOfKeychain = String(data: retrievedData, encoding: String.Encoding.utf8)
}
} else {
print("KEY: Nothing was retrieved from the keychain. Status code \(status)")
}
return contentsOfKeychain
}
private class func remove(service: String) {
}
}
です。ライン
keychain["yourKey"] = nil
または
do {
try keychain.remove("yourKey")
} catch let error {
print("error: \(error)")
}
おかげ
あなたがKeychainItemWrapperを使用してアイテムを削除したい場合は、-resetKeychainItemを使用して下にしてみてください。これにより、SecItemDelete()が正しい値で呼び出されます。
いいえ、実際はラッパーは使用していません – dand1