20. Apr 2023
iOSNáš iOS toolbox - Ako ukladať hodnoty do UserDefaults a KeyChain vo Swifte
Swift UserDefaults predstavuje jednoduchý a ľahký spôsob ukladania menších údajov v apkách, ako sú napríklad používateľské preferencie, nastavenia prípadne stav aplikácie. Práca s UserDefaults a Keychain však môže byť ťažkopádna, tu prichádza na rad náš swift package GoodPersistence.
Ukladanie dát v UserDefaults
Používame triedu UserDefaultValue
, čo je v podstate wrapper, ktorý umožňuje ukladanie akejkoľvek hodnoty vyhovujúcej Codable
protokolu v UserDefaults.
Ak chceme použiť túto triedu, stačí jednoducho vytvoriť jej inštanciu a nastaviť kľúč a predvolenú hodnotu pre tento wrapper.
Napríklad, ak chceme uložiť meno používateľa do UserDefaults, môžete vytvoriť inštanciu UserDefaultValue
takto:
@UserDefaultValue("userName", defaultValue: "Guest")
var userName: String
Vo vyššie uvedenom príklade sa kľúč „userName“ použije na uloženie mena používateľa do UserDefaults. Ak pre tento kľúč neexistuje žiadna hodnota, namiesto toho sa použije predvolená hodnota „Guest“.
Tento wrapper poskytuje aj ďalšiu užitočnú funkciu, pozorovanie zmien pomocou funkcie Combine, ale o tom neskôr.
🔐 Ukladanie dát v KeyChain
Ak si niekedy mal problémy s ukladaním citlivých údajov v Keychain, s balíkom GoodPersistence to nikdy nebolo jednoduchšie.
Na uloženie hodnôt do KeyChain používame ďalší wrapper - KeychainValue
. Funguje to takto:
struct UserSensitiveInformation {
let userId: String
let dateOfBirth: Date
let address: String
}
@KeychainValue(
String(describing: UserSensitiveInformation.self),
defaultValue: nil
accessibility: .afterFirstUnlockThisDeviceOnly
)
var userSensitiveInformation: UserSensitiveInformation?
Vo vyššie uvedenom príklade máme štruktúru s názvom UserSensitiveInformation
, ktorá obsahuje všetky citlivé údaje, ktoré chceme bezpečne uložiť v Keychain
.
Ako vidíš, implementácia je veľmi podobná predchádzajúcemu príkladu, ktorý používa UserDefaults
.
Deklarujeme kľúč a jeho predvolenú hodnotu, no okrem toho je tu parameter accessibility
, ktorý môžeme tiež špecifikovať. Tento parameter má predvolenú hodnotu nil, čo znamená, že v prípade potreby ho môžeme nechať prázdny.
Zapisovanie zmeny hodnôt
Okrem primárneho účelu ukladania hodnôt ponúkajú wrappery UserDefaultValue
a KeychainValue
okrem iného aj funkciu na sledovanie zmien hodnôt pomocou Combine.
Povedzme, že chceme dostávať aktualizácie vždy, keď sa zmení hodnota userName.
Po deklarovaní premennej userName
pomocou UserDefaultValue
, ako je znázornené v prvom príklade, môžeme pre ňu jednoducho deklarovať publishera pomocou Combine:
lazy var userNamePublisher = _userName
.dropFirst()
.eraseToAnyPublisher()
Tento publisher poskytne novú hodnotu vždy, keď sa zmení premenná userName
. Pre odber aktualizovanch hodnôt z nášho publishera môžeme použiť Combine metódu sink
alebo assign
, ktorá dostane novú hodnotu vždy, keď sa zmení premenná userName
.
V tomto príklade jednoducho nastavíme text štítku v metóde assing
:
var cancellable: AnyCancellable?
let userNameLabel = UILabel()
cancellable = userNamePublisher
.removeDuplicates()
.assing(to: \\.text, on: userNameLabel, ownership: .weak)
Tento príklad rovnako funguje aj pre KeychainValue
wraper, žiadne ďalšie nastavovanie nie je potrebné.
Congrats!
Po úspešnom uložení údajov pomocou balíka GoodPersistence sa možno zaujímaš o to, ako to presne funguje v rámci aplikácie. Našťastie, package obsahuje aj ukážkový kód, ktorý môžeš preskúmať a lepšie porozumieť jeho funkciám.
Ak bol pre teba tento balík užitočný, určite sa pozri aj na naše ďalšie balíky. Kto vie, možno nájdeš ďalší, ktorý ti pomôže posunúť tvoju appku na vyššiu úroveň!