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).