Swift ライブラリ未使用でKeyChainでデータを保存/読み込む
KeyChainとUserDefaultsの比較
こちらの記事が大変わかりやすいです。
KeyChainを保存する
セキュアに保持したいデータを取り扱うと想定。
取り扱うデータはString型のみと想定。
func saveKeyChain(value: String) -> Bool {
let id = "id"
let key = "serviceName"
guard let data = value.data(using: .utf8) else {
return false
}
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: key,
kSecAttrAccount as String: id,
kSecValueData as String: data,
]
let status = SecItemCopyMatching(query as CFDictionary, nil)
var itemUpdateStatus: OSStatus?
print(status)
switch status {
case errSecItemNotFound:
itemUpdateStatus = SecItemAdd(query as CFDictionary, nil)
case errSecSuccess:
itemUpdateStatus = SecItemUpdate(query as CFDictionary, [kSecValueData as String: data] as CFDictionary)
default:
print("該当なし")
}
if itemUpdateStatus == errSecSuccess {
print("正常終了")
} else {
return false
}
return true
}
KeyChainを読み込む
func loadKeyChain() -> String? {
let id = "id"
let key = "serviceName"
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: key,
kSecAttrAccount as String: id,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecReturnAttributes as String: true,
kSecReturnData as String: true,
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
switch status {
case errSecItemNotFound:
return nil
case errSecSuccess:
guard let item = item,
let value = item[kSecValueData as String] as? Data else {
print("データなし")
return nil
}
guard let loadString = String(data: value, encoding: .utf8) else {
return nil
}
return loadString
default:
print("該当なし")
}
return nil
}
参考
参考記事はJSONEncoder
を利用してどのような型でも保存できるようにしています。
追記
読み込み時でクラッシュするプロジェクトがあり、その中では以下のように書き換えました。
let value = item[kSecValueData as String] as? Data else {
let value = item[kSecValueData as CFString] as? Data else {
少し説明すると、kSecValueDataはCFString
にもかかわらずString
でキャストしようとしているとエラー出ました。
itemのvalueを取り出す為のkeyとしてkSecValueDataをString型として利用したいので、CFString型にキャストするように変更しています。
Author And Source
この問題について(Swift ライブラリ未使用でKeyChainでデータを保存/読み込む), 我々は、より多くの情報をここで見つけました https://zenn.dev/tanukidevelop/articles/1618a5b2938044著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol