multiplatform-settings для простого хранения

Когда база данных избыточна: единый key-value API поверх платформенных хранилищ.

multiplatform-settings — библиотека с общим key-value API, реализованным поверх SharedPreferences на Android и NSUserDefaults на iOS.

Когда хватает settings, а когда нужна БД

Не всё стоит хранить в SQLite. Флаг «онбординг пройден», токен авторизации, выбранная тема, последний выбранный фильтр — это пары ключ-значение. Для них SQLDelight избыточен. multiplatform-settings даёт лёгкий общий API, под которым на каждой платформе лежит родное хранилище простых настроек.

Единый API

// commonMain
class AppPreferences(private val settings: Settings) {
    var onboardingDone: Boolean
        get() = settings.getBoolean("onboarding_done", false)
        set(value) = settings.putBoolean("onboarding_done", value)

    var authToken: String?
        get() = settings.getStringOrNull("auth_token")
        set(value) {
            if (value == null) settings.remove("auth_token")
            else settings.putString("auth_token", value)
        }
}

Платформенная инициализация

Сам объект Settings создаётся платформенно и передаётся в общий код (через DI или expect/actual):

// androidMain — поверх SharedPreferences
actual fun createSettings(): Settings =
    SharedPreferencesSettings(appContext.getSharedPreferences("app", 0))
// iosMain — поверх NSUserDefaults
actual fun createSettings(): Settings =
    NSUserDefaultsSettings(NSUserDefaults.standardUserDefaults)

Как работает под капотом

Библиотека определяет интерфейс Settings с методами getX/putX/remove и даёт платформенные реализации-адаптеры. Каждый адаптер просто транслирует вызовы в родное хранилище: putString на Android вызывает SharedPreferences.Editor, на iOS — NSUserDefaults.setObject. Никакой синхронизации между платформами нет — данные локальны для устройства, как и у нативных хранилищ под капотом. Общий код работает с интерфейсом и не знает разницы.

Безопасность токенов

Важный нюанс: SharedPreferences и NSUserDefaults — не защищённые хранилища. Токены лучше держать в Android Keystore / iOS Keychain. Для этого есть отдельные реализации (например, поверх encrypted-хранилищ), которые подключают тем же интерфейсом, не меняя общий код.

Частые ошибки

Хранить чувствительные данные в обычных settings — это небезопасно; для секретов берите защищённую реализацию. Вторая ошибка — складывать в settings сложные структуры (списки, объекты), для которых нужна сериализация и в идеале БД. settings — для простых скалярных значений.

Итоги

  • multiplatform-settings — общий key-value API поверх SharedPreferences/NSUserDefaults.
  • Подходит для флагов, токенов, простых настроек — не для сложных данных.
  • Объект Settings создаётся платформенно и внедряется в общий код.
  • Для секретов используйте защищённые реализации (Keystore/Keychain).
Проверьте себя
1. Поверх чего работает multiplatform-settings на iOS?
ASQLite
BNSUserDefaults
CCore Data
DФайловой системы напрямую
2. Что НЕ стоит хранить в обычных multiplatform-settings?
AФлаг онбординга
BВыбранную тему
CЧувствительные токены без шифрования
DПоследний фильтр