2017-05-29 63 views
0

我想在用戶註銷時從我的服務中刪除鑰匙串值。但是,我對這樣做的最佳實踐方式感到困惑。用戶註銷時在鑰匙串中的清除值

這裏是我的服務

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) { 

    } 

} 

很顯然,我不是舒爾我是否應該刪除任何形式的鑰匙鏈實際上

回答

0

您可以清除您的數據。請嘗試以下線

keychain["yourKey"] = nil 

do { 
try keychain.remove("yourKey") 
} catch let error { 
print("error: \(error)") 
} 

感謝

0

如果你想刪除使用KeychainItemWrapper的項目,使用-resetKeychainItem。這以正確的值調用SecItemDelete()。

+0

不,實際上我不使用任何包裝 – dand1