20. Apr 2023iOS

Náš 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.

Marek VricaniOS Developer

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ň!

iOS 6 Minút čítania

Náš iOS toolbox - Spracovanie sieťových požiadaviek vo Swifte

Marek Vrican20 Apr 2023
Marek VricaniOS Developer