Ответ
Keychain — это системное безопасное хранилище для небольших битов конфиденциальной информации. Core Data — это фреймворк для управления графом объектов и их сохранения (объектно-реляционное отображение, ORM).
| Аспект | Keychain | Core Data |
|---|---|---|
| Основная цель | Безопасное хранение секретов (пароли, ключи, сертификаты). | Моделирование, хранение и запросы структурированных данных приложения. |
| Модель данных | Пары «ключ-значение» или небольшие бинарные данные. | Сложная объектная модель с отношениями (один-ко-многим, многие-ко-многим). |
| Запросы | Только поиск по атрибутам (аккаунт, сервис). | Мощный язык запросов (NSPredicate), сортировка (NSSortDescriptor). |
| Стойкость данных | Сохраняется между установками приложения. | Обычно удаляется с приложением (хранится в sandbox). |
| Бэкенд | Зашифрованное системное хранилище. | SQLite, XML, бинарный формат или только в памяти (In-Memory). |
| Миграция схемы | Нет. Данные сохраняются «как есть». | Есть, поддерживаются автоматические и ручные миграции. |
Пример Core Data:
// 1. Определяем сущность `User` в модели данных.
// 2. Сохраняем объект.
let context = persistentContainer.viewContext
let newUser = UserEntity(context: context)
newUser.id = UUID()
newUser.name = "John Doe"
newUser.email = "john@example.com"
// Токен НЕ следует хранить в Core Data. Используйте Keychain.
// newUser.token = "secret" // ❌ Плохая практика
do {
try context.save()
} catch {
print("Ошибка сохранения: (error)")
}
// 3. Запрос (Fetch) данных.
let fetchRequest: NSFetchRequest<UserEntity> = UserEntity.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", "John Doe")
let users = try? context.fetch(fetchRequest)
Вывод: Используйте Keychain для секретов. Используйте Core Data (или Realm, SQLite.swift) для хранения основной структурированной информации вашего приложения (пользователи, посты, настройки).