KeyValueStorageSwift 2.1.0

KeyValueStorageSwift 2.1.0

Maintained by Narek Sahakyan.



  • By
  • Narek Sahakyan

KeyValueStorage

Build & Test Coverage Swift Package Manager compatible CocoaPods compatible


An elegant, fast, thread-safe, multipurpose key-value storage, compatible with all Apple platforms.


Supported Platforms

iOS macOS watchOS tvOS
9.0+ 10.10+ 2.0+ 9.0+

Installation

Swift Package Manager

Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.

Once you have your Swift package set up, adding KeyValueStorage as a dependency is as easy as adding it to the dependencies value of your Package.swift.

dependencies: [
    .package(url: "https://github.com/narek-sv/KeyValueStorage.git", .upToNextMajor(from: "1.0.1"))
]

or

In any file you'd like to use KeyValueStorage in, don't forget to import the framework with import KeyValueStorage.

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate KeyValueStorage into your Xcode project using CocoaPods, specify it in your Podfile:

pod 'KeyValueStorageSwift'

Then run pod install.

In any file you'd like to use KeyValueStorage in, don't forget to import the framework with import KeyValueStorageSwift.


Usage

Main functionality

First, initialize the storage:

let storage = KeyValueStorage()

then declare the key by specifing the key name and the type of the item:

let key = KeyValueStorageKey<Int>(name: "myAge")

after which you can save:

// Saves the item and associates it with the key or overrides the value if there is already such item. 

let myAge = 21
storage.save(myAge, forKey: key)

fetch:

// Fetches and returns the item associated with the key or returns nil if there is no such item.

let fetchedAge = storage.fetch(forKey: key) 

delete:

// Deletes the item associated with the key or does nothing if there is no such item.

storage.delete(forKey: key)

set:

// Sets the item identified by the key to the provided value.

let newAge = 24
storage.set(newAge, forKey: key) // save

storage.set(nil, forKey: key) // delete

or clear the whole storage content:

storage.clear()

KeyValueStorage works with any type that conforms to Codable protocol.

Storage types

The KeyValueStorage supports 3 storage types

  • In-memory (This storage type persists the items only within an app session.)
  • User-Defaults (This storage type persists the items within the whole app lifetime.)
  • Keychain (This storage type keeps the items in secure storage and persists even app re-installations. Supports iCloud synchronization.)

You specify the storage type when declaring the key:

let key1 = KeyValueStorageKey<Int>(name: "id", storage: .inMemory)
let key2 = KeyValueStorageKey<Date>(name: "birthday", storage: .userDefaults)
let key3 = KeyValueStorageKey<String>(name: "password", storage: .keychain())

If you don't specify a storage type .userDefaults will be used.

Xcode autocompletion

To get the advantages of the Xcode autocompletion it is recommended to declare all your keys in the extension of the KeyValueStorageKey like so:

extension KeyValueStorageKey {
    static var key1: KeyValueStorageKey<Int> {
        .init(name: "id", storage: .inMemory)
    }
    
    static var key2: KeyValueStorageKey<Date> {
        .init(name: "birthday", storage: .userDefaults)
    }
    
    static var key3: KeyValueStorageKey<String> {
        .init(name: "password", storage: .keychain())
    }
}

then Xcode will suggest all the keys specified in the extension when you put a dot: Screen Shot 2022-08-20 at 18 04 02

App Groups

KeyValueStorage also supports working with shared containers, which allows you to share your items among different App Extensions or your other Apps. To do so, first, you need to configure your app by following the steps described in this article.

Then you simply have to initialize your KeyValueStorage with the init(accessGroup:teamID:) initializer by providing your newly created accessGroup identifier and your development teamID. That's it; you are ready to use App Groups.

Keychain

Use accessibility parameter to specify the security level of the keychain storage. By default the .whenUnlocked option is used. It is one of the most restrictive options and provides good data protection.

let key = KeyValueStorageKey<String>(name: "password", storage: .keychain(accessibility: .whenUnlocked))

You can use .afterFirstUnlock if you need your app to access the keychain item while in the background. Note that it is less secure than the .whenUnlocked option.

Here are all the supported accessibility types:

  • afterFirstUnlock
  • afterFirstUnlockThisDeviceOnly
  • whenPasscodeSetThisDeviceOnly
  • whenUnlocked
  • whenUnlockedThisDeviceOnly

Set synchronizable property to true to enable keychain items synchronization across user's multiple devices. The synchronization will work for users who have the Keychain enabled in the iCloud settings on their devices. Deleting a synchronizable item will remove it from all devices.

let key = KeyValueStorageKey<String>(name: "password", storage: .keychain(accessibility: .afterFirstUnlock, isSynchronizable: true))

License

See License.md for more information.