|
//
// KeyChain.swift
// PaiAi
//
// Created by FFIB on 16/5/3.
// Copyright © 2016年 FFIB. All rights reserved.
//
import Foundation
protocol DataConvertable {
init?(data: Data)
func toData() -> Data?
}
extension String: DataConvertable {
init?(data: Data) {
self.init(data: data, encoding: String.Encoding.utf8)
}
func toData() -> Data? {
return self.data(using: String.Encoding.utf8)
}
}
func GetInfoFromKeyChain<T: DataConvertable>(_ intoType: T.Type, key: String) -> T? {
let keyChainDic = NSMutableDictionary()
keyChainDic.setObject(String(kSecClassGenericPassword), forKey: kSecClass as! NSCopying)
keyChainDic.setObject(key, forKey: kSecAttrAccount as! NSCopying)
keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnAttributes as! NSCopying)
keyChainDic.setObject(kCFBooleanTrue, forKey: kSecReturnData as! NSCopying)
var result: AnyObject?
var resultObj: T? = nil
SecItemCopyMatching(keyChainDic, &result)
if let resultDic = result as? NSDictionary {
if let data = resultDic.object(forKey: kSecValueData) as? Data {
resultObj = T(data: data)
}
}
return resultObj
}
enum KeyChainErrorCode: Int, Error {
case alreadyExist = 10
case dataConvertFail
case keyChainWriteFail
}
func SaveInfoToKeyChain<T: DataConvertable>(_ info: T, key: String, override: Bool = true) throws {
let existObj = GetInfoFromKeyChain(type(of: info), key: key)
guard existObj == nil || override else {
throw KeyChainErrorCode.alreadyExist
}
let keyChainDic = NSMutableDictionary()
keyChainDic.setObject(String(kSecClassGenericPassword), forKey: kSecClass as! NSCopying)
keyChainDic.setObject(key, forKey: kSecAttrAccount as! NSCopying)
guard let data = info.toData() else {
throw KeyChainErrorCode.dataConvertFail
}
let updateDic: NSDictionary = [String(kSecValueData): data]
var success: OSStatus = 0
if existObj == nil {
keyChainDic.addEntries(from: updateDic as! [AnyHashable: Any])
success = SecItemAdd(keyChainDic, nil)
} else {
success = SecItemUpdate(keyChainDic, updateDic)
}
guard success == errSecSuccess else {
throw KeyChainErrorCode.keyChainWriteFail
}
}
|