Что такое plist файл? Для чего он использутеся? Какие типы данных можно хранить в plist файле?ios-98

Что такое PLIST-файл?

PLIST (Property List) — это специальный формат файлов, используемый Apple для хранения структурированных данных. Это XML-файл с определенной структурой, который iOS/macOS могут легко читать и записывать.

// Пример создания пути к plist-файлу
let plistURL = Bundle.main.url(forResource: "Config", withExtension: "plist")!

Основные сценарии использования PLIST

  1. Конфигурация приложения:

    • Хранение настроек по умолчанию
    • Конфигурация API endpoints
    • Флаги функциональности
  2. Хранение данных:

    • Простые структуры данных
    • Кэшированная информация
    • Локализованные строки
  3. Системные файлы:

    • Info.plist — обязательный файл с метаданными приложения
    • Настройки entitlements
    • Конфигурация проектов Xcode

Поддерживаемые типы данных

PLIST поддерживает следующие типы данных:

Тип данныхПример в кодеПримечание
String "Hello World" UTF-8 строка
Number 42, 3.14 Integer или Double
Boolean true/false Логическое значение
Date 2023-01-01 Дата в ISO формате
Data ... Бинарные данные в Base64
Array [1, 2, 3] Упорядоченный список
Dictionary {"key": "value"} Неупорядоченные пары ключ-значение

Пример структуры PLIST-файла

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AppName</key>
    <string>MyAwesomeApp</string>
    <key>ApiConfig</key>
    <dict>
        <key>BaseURL</key>
        <string>https://api.example.com</string>
        <key>Timeout</key>
        <integer>30</integer>
    </dict>
    <key>Features</key>
    <array>
        <string>NewUI</string>
        <string>DarkMode</string>
    </array>
</dict>
</plist>

Работа с PLIST в коде

Чтение из Bundle

guard let url = Bundle.main.url(forResource: "Config", withExtension: "plist"),
      let data = try? Data(contentsOf: url),
      let plist = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else {
    fatalError("Couldn't load plist file")
}
print(plist["AppName"] as? String ?? "")

Запись в Documents

let config: [String: Any] = ["Token": "abc123", "Expires": Date()]
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("user.plist")

do {
    let data = try PropertyListSerialization.data(fromPropertyList: config, format: .xml, options: 0)
    try data.write(to: url)
} catch {
    print("Error saving plist: \(error)")
}

Особенности и лучшие практики

  1. Info.plist:

    • Содержит критическую информацию о приложении (версия, разрешения, etc.)
    • Автоматически создается Xcode
    • Не следует изменять вручную без необходимости
  2. Безопасность:

    • Не храните чувствительные данные в plist
    • Для паролей/токенов используйте Keychain
  3. Производительность:

    • Большие plist-файлы (>1MB) могут замедлять запуск
    • Для больших данных лучше использовать Core Data или SQLite
  4. Локализация:

    • Strings-файлы технически тоже plist
    • Можно создавать локализованные версии plist-файлов

Резюмируем

  1. PLIST — это XML-файл для хранения структурированных данных в iOS/macOS
  2. Основные использования: конфигурация, хранение простых данных, метаинформация приложения
  3. Поддерживаемые типы: строки, числа, даты, массивы, словари, бинарные данные
  4. Главные преимущества:
    • Человекочитаемый формат (XML)
    • Встроенная поддержка в iOS SDK
    • Удобство для конфигурационных файлов
  5. Ограничения:
    • Не подходит для сложных реляционных данных
    • Нет встроенного шифрования
    • Плохая производительность с большими объемами данных

PLIST — это "рабочая лошадка" для хранения простых структурированных данных в iOS-экосистеме.