Формат Plist, чем открыть

Обновлено: 24.11.2024

Список свойств — это представление иерархии объектов, которые можно хранить в файловой системе и воссоздавать позже. Списки свойств предоставляют приложениям легкий и переносимый способ хранения небольших объемов данных. Они представляют собой иерархии данных, созданных из объектов определенного типа — по сути, это граф объектов. Списки свойств легко создавать программно, и еще проще их сериализовать в постоянное представление. Приложения могут впоследствии считывать статическое представление обратно в память и воссоздавать исходную иерархию объектов. И Cocoa Foundation, и Core Foundation имеют API, связанные с сериализацией и десериализацией списка свойств.

Типы данных

Списки свойств состоят только из определенных типов данных: словарей, массивов, строк, чисел (целых и с плавающей запятой), дат, двоичных данных и логических значений. Словари и массивы являются особыми типами, поскольку являются коллекциями; они могут содержать один или несколько типов данных, включая другие словари и массивы. Эта иерархическая вложенность объектов создает граф объектов. Абстрактные типы данных имеют соответствующие классы Foundation, основные типы Foundation и элементы XML для объектов-коллекций и объектов-значений.

Форматы данных

Вы можете создавать списки свойств в XML, JSON и двоичных форматах. Двоичный формат намного компактнее, чем версия XML, и, следовательно, более эффективен. Рекомендуется для большинства ситуаций. Однако при необходимости вы можете вручную отредактировать список свойств XML. Вы также можете редактировать файл JSON, потому что это просто объединенный текст и гораздо менее подробный, чем чистый XML. Файлы списка свойств имеют расширение plist.

Не следует использовать списки свойств для хранения больших и сложных графиков объектов, особенно если объекты имеют переменные настройки изменяемости. И вы не можете использовать списки свойств для хранения объектов, которые не поддерживаются архитектурой, таких как объекты модели. В этих случаях вместо этого используйте архивирование. Хотя списки свойств могут включать объекты NSData, лучше не использовать объекты данных в списках свойств для хранения больших объемов двоичных данных.

XML, JSON или двоичный файл?

Тип файла списка свойств можно определить с помощью команды file в macOS:

Преобразование между различными форматами plist можно выполнить с помощью утилиты командной строки plutil в macOS:

Информация.plist

Каждое приложение для macOS и iOS зависит от наличия специальных метаданных в каждом приложении или пакете. Эти метаданные используются по-разному. Некоторые из них отображаются пользователю, некоторые используются внутри системы для определения местоположения вашего приложения, значка для отображения, типов документов, которые оно поддерживает, и многих других поведений, которые имеют влияние за пределами самого пакета. Некоторые метаданные используются системными фреймворками для облегчения запуска приложений. Приложение предоставляет свои метаданные системе с помощью специального файла, называемого файлом списка информационных свойств, который называется Info.plist.

Создание Info.plist

Самый простой способ создать файл списка информационных свойств для приложения macOS — позволить Lazarus создать его для вас. Когда вы используете Проект Lazarus > Параметры проекта и выбираете параметр Создать пакет приложения, Lazarus создает пакет приложения по умолчанию и файл Info.plist, который вы можете найти в имя_проекта.app/Подкаталог содержимого. Файл, созданный Lazarus, поставляется с предварительно настроенными парами основных значений, которые должны быть в каждом списке информационных свойств.

Вот пример файла Info.plist, созданного Lazarus для простого приложения macOS:

Редактирование Info.plist

Чтобы отредактировать содержимое файла Info.plist, вы можете использовать любой текстовый редактор, использующий UTF-8, хотя может быть безопаснее использовать Xcode, который понимает XML-форматирование файлов списка информационных свойств. . Дважды щелкните имя файла Info.plist в Finder, после чего автоматически откроется редактор списка свойств Xcode.

Примечание. Редактор списка свойств в Xcode по умолчанию отображает удобочитаемые строки (вместо фактического имени ключа) для многих ключей. Чтобы отобразить фактические имена ключей в том виде, в каком они появляются в файле Info.plist, щелкните любой из ключей в окне редактора, удерживая нажатой клавишу Control, и включите элемент Показать необработанные ключи/значения в контекстном меню.

Чтобы изменить значение для указанного ключа, дважды щелкните значение в редакторе списка свойств Xcode, чтобы выбрать его, а затем введите новое значение. Большинство значений указываются в виде строк, но Xcode также поддерживает несколько других скалярных типов. Вы также можете указать сложные типы, такие как массив или словарь. Редактор списка свойств отображает соответствующий интерфейс для редактирования каждого типа. Чтобы изменить тип заданного значения, убедитесь, что значение не выбрано, и щелкните его, удерживая клавишу Control, чтобы отобразить его контекстное меню.В подменю «Тип значения» выберите тип, который вы хотите использовать для значения.

Добавление ключей в Info.plist

Хотя файл Info.plist, сгенерированный Lazarus, содержит наиболее важные ключи, необходимые системе, в большинстве приложений обычно следует указывать несколько дополнительных ключей. Многие подсистемы и системные приложения используют файл Info.plist для сбора информации о вашем приложении. Например, когда пользователь выбирает «Файл» > «Получить информацию» для вашего приложения, Finder отображает информацию из многих из этих ключей в результирующем информационном окне.

Чтобы добавить пару ключ/значение:

  • Нажмите кнопку "Добавить" (+) рядом с ключом в редакторе списка свойств или выберите существующее свойство и нажмите клавишу "Ввод".
  • Выберите ключ во всплывающем меню (нажмите клавишу со стрелкой вниз, чтобы отобразить его, если он не отображается) или введите новое имя ключа в столбце "Ключ".
  • Выберите тип во всплывающем меню в столбце «Тип».
  • Введите значение в столбце "Значение".

Чтобы добавить значение в массив или словарь, разверните треугольник раскрытия рядом с массивом или словарем. Затем нажмите кнопку "Добавить" (+) или клавишу "Return", чтобы добавить дочернее свойство.

Чтобы удалить пару "ключ-значение":

  • Нажмите кнопку «Удалить» (—) рядом с ключом в редакторе списка свойств или выберите свойство и нажмите «Удалить».

Проверка синтаксиса

В тех случаях, когда вы редактировали файл списка свойств вручную, а не с помощью редактора списка свойств Xcode, целесообразно проверить синтаксис файла с помощью утилиты командной строки plutil в macOS. Это очень удобно, поскольку plutil сообщит вам номер строки, в которой обнаружена ошибка.

Успешная проверка синтаксиса:

Проверка синтаксиса при обнаружении проблемы:

Конечно, plutil будет проверять синтаксис любого файла со списком свойств, а не только Info.plist.

Рекомендуемые пары "ключ-значение"

Приложение iOS должно включать следующие ключи в свой файл списка информационных свойств:

  • Регион разработки CFBundle
  • Отображаемое имя CFBundle
  • CFBundleExecutable
  • CFBundleIconFiles
  • Идентификатор CFBundle
  • CFBundleInfoDictionaryVersion
  • CFBundlePackageType
  • CFBundleVersion
  • LSRequiresIPhoneOS

В дополнение к этим ключам обычно включаются еще несколько:

  • UIRequiredDeviceCapabilities (обязательно)
  • UIStatusBarStyle
  • UIInterfaceOrientation
  • UIRequiresPersistentWiFi

Какао для macOS

Приложение macOS Cocoa должно включать следующие ключи в свой файл списка информационных свойств. Большинство из них устанавливаются Lazarus автоматически при создании пакета приложений, но некоторые из них необходимо отредактировать, а некоторые добавить.

  • Регион разработки CFBundle
  • Отображаемое имя CFBundle
  • CFBundleExecutable
  • CFBundleIconFile
  • Идентификатор CFBundle
  • CFBundleInfoDictionaryVersion
  • CFBundleName
  • CFBundlePackageType
  • CFBundleShortVersionString
  • CFBundleVersion
  • NSHumanReadableАвторское право

Локализация файла Info.plist

Значения многих ключей в файле списка информационных свойств представляют собой удобочитаемые строки, которые отображаются пользователю в Finder или в вашем собственном приложении. Когда вы локализуете свое приложение, вы должны обязательно локализовать значения этих строк в дополнение к остальному содержимому вашего приложения.

Локализованные значения не сохраняются в самом файле Info.plist. Вместо этого вы сохраняете значения для конкретной локализации в файле строк с именем InfoPlist.strings. Вы помещаете этот файл в тот же каталог проекта для конкретного языка, который вы используете для хранения других ресурсов для той же локализации. Содержимое файла InfoPlist.strings — это отдельные ключи, которые вы хотите локализовать, и соответствующим образом переведенное значение. Подпрограммы, которые ищут значения ключа в файле Info.plist, принимают во внимание языковые предпочтения пользователя и возвращают локализованную версию ключа (из соответствующего файла InfoPlist.strings), если он существует. Если локализованной версии ключа не существует, подпрограммы возвращают значение, хранящееся в файле Info.plist.

Помимо рекомендуемых ключей, есть несколько ключей, которые следует локализовать и поместить в файлы InfoPlist.strings для конкретного языка:

  • Отображаемое имя CFBundle
  • CFBundleName
  • CFBundleShortVersionString
  • NSHumanReadableАвторское право

Например, TextEdit имеет несколько клавиш, которые отображаются в Finder, поэтому их необходимо локализовать. Предположим, что в вашем файле списка информационных свойств определены следующие ключи:

Французская локализация для TextEdit включает следующие строки в InfoPlist.strings в его каталоге Contents/Resources/French.lproj:

Защищенные ресурсы

С появлением macOS 10.15 (Catalina) пользователи должны дать согласие на использование приложения:

  • Камера
  • Микрофон
  • Запись экрана
  • Контроль ввода с клавиатуры (кроме собственного ввода приложений)
  • Защита файлов и папок:
    • Данные, для доступа к которым требуется согласие пользователя
    • Личные данные, которыми управляет система.

    Новые охраняемые территории Каталины:

    • Компьютер
    • Документы
    • Загрузки
    • iCloud Диск
    • Стороннее облачное хранилище (Dropbox, OneDrive, Box и т. д.)
    • Съемные тома
    • Сетевые тома

    Для создания новых файлов в защищенных местах согласия пользователя не требуется. Только чтение данных из защищенных мест. Файлы можно проверить на доступность для чтения/записи, не вызывая диалоговых окон согласия.

    Личные данные, управляемые системой:

    Приложению не требуется полный доступ к диску для перемещения файла в корзину, но требуется авторизация для перемещаемого файла. Вызывающий сохраняет доступ к файлу, даже если он находится в Корзине.

    Когда приложение пытается получить доступ, например, к папке "Документы" пользователя, будет отображаться диалоговое окно по умолчанию с запросом разрешения у пользователя.

    Слева приведен пример стандартного диалогового окна из macOS 11.2.3 (Big Sur), запрашивающего согласие пользователя.

    Это диалоговое окно отображается пользователю только при первом запуске приложения. Обратите внимание, что если разработчик пересобирает приложение, и оно не подписано, диалоговое окно будет показано снова.

    Чтобы разработчик мог отображать более полезное диалоговое окно согласия, объясняющее, почему требуется доступ к защищенному ресурсу, доступен ряд новых ключей списка свойств:

    Файл со списком свойств информации – это структурированный текстовый файл, содержащий важную информацию о конфигурации для связанного исполняемого файла. Сам файл обычно кодируется с использованием кодировки Unicode UTF-8, а содержимое структурируется с использованием XML. Корневой XML-узел представляет собой словарь, содержимое которого представляет собой набор ключей и значений, описывающих различные аспекты пакета. Система использует эти ключи и значения для получения информации о вашем приложении и о том, как оно настроено. В результате ожидается, что все связанные исполняемые файлы (подключаемые модули, платформы и приложения) будут иметь файл со списком информационных свойств.

    По соглашению имя файла списка информационных свойств — Info.plist . Имя этого файла чувствительно к регистру и должно начинаться с заглавной буквы I . В приложениях iOS этот файл находится на верхнем уровне каталога пакетов. В пакетах macOS этот файл находится в каталоге содержимого пакета. Обычно Xcode создает этот файл автоматически при создании проекта соответствующего типа.

    Важно! В следующих разделах обратите внимание на использование заглавных букв в именах файлов и каталогов, находящихся внутри пакета. Класс NSBundle и функции пакета Core Foundation учитывают регистр при поиске ресурсов внутри каталога пакета. Несоответствие регистра может помешать вам найти ресурсы во время выполнения.

    Создание и редактирование файла списка информационных свойств

    Самый простой способ создать файл списка информационных свойств — позволить Xcode создать его за вас. Каждый новый пакетный проект, который вы создаете в Xcode, поставляется с файлом с именем

    — название проекта. Во время сборки этот файл используется для создания файла Info.plist, который затем включается в результирующий пакет.

    Чтобы отредактировать содержимое файла списка информационных свойств, выберите значок

    -Info.plist в вашем проекте Xcode для отображения редактора списка свойств. На рис. 1 показан редактор файла списка информационных свойств нового проекта приложения Cocoa. Файл, созданный Xcode, поставляется с предварительно настроенными ключами, которые должны быть в каждом списке информационных свойств.

    Рис. 1. Редактирование списка информационных свойств в Xcode

    Чтобы изменить значение для указанного ключа, дважды щелкните значение в редакторе списка свойств Xcode, чтобы выбрать его, а затем введите новое значение. Большинство значений указываются в виде строк, но Xcode также поддерживает несколько других скалярных типов. Вы также можете указать сложные типы, такие как массив или словарь. Редактор списка свойств отображает соответствующий интерфейс для редактирования каждого типа. Чтобы изменить тип заданного значения, убедитесь, что значение не выбрано, и щелкните его, удерживая клавишу Control, чтобы отобразить его контекстное меню. В подменю «Тип значения» выберите тип, который вы хотите использовать для значения.

    Поскольку списки информационных свойств обычно представляют собой текстовые файлы, их также можно редактировать с помощью любого текстового редактора, поддерживающего кодировку файлов UTF-8. Однако, поскольку это XML-файлы, обычно не рекомендуется редактировать файлы списка свойств вручную.

    Добавление ключей в файл списка информационных свойств

    Хотя файл Info.plist, предоставляемый Xcode, содержит наиболее важные ключи, необходимые системе, в большинстве приложений обычно следует указывать несколько дополнительных ключей. Многие подсистемы и системные приложения используют файл Info.plist для сбора информации о вашем приложении. Например, когда пользователь выбирает «Файл» > «Получить информацию» для вашего приложения, Finder отображает информацию из многих из этих ключей в результирующем информационном окне.

    Вы добавляете ключи в файл Info.plist своего приложения с помощью редактора списка свойств Xcode. Сведения об использовании этого редактора см. в разделе «Редактирование списков свойств».

    Важно: Редактор списка свойств в Xcode по умолчанию отображает удобочитаемые строки (вместо фактического имени ключа) для многих ключей. Чтобы отобразить фактические имена ключей в том виде, в каком они отображаются в файле Info.plist, щелкните любой из ключей в окне редактора, удерживая клавишу Control, и включите элемент Показать необработанные ключи/значения в контекстном меню.

    Список рекомендуемых ключей, которые следует включить в типичное приложение, см. в разделе Рекомендуемые ключи Info.plist .

    Локализация значений списка свойств

    Значения многих ключей в файле списка информационных свойств представляют собой удобочитаемые строки, которые отображаются пользователю в Finder или в вашем собственном приложении. Когда вы локализуете свое приложение, вы должны обязательно локализовать значения этих строк в дополнение к остальному содержимому вашего приложения.

    Локализованные значения не сохраняются в самом файле Info.plist. Вместо этого вы сохраняете значения для конкретной локализации в файле строк с именем InfoPlist.strings. Вы помещаете этот файл в тот же каталог проекта для конкретного языка, который вы используете для хранения других ресурсов для той же локализации. Содержимое файла InfoPlist.strings — это отдельные ключи, которые вы хотите локализовать, и соответствующим образом переведенное значение. Подпрограммы, которые ищут значения ключа в файле Info.plist, принимают во внимание языковые предпочтения пользователя и возвращают локализованную версию ключа (из соответствующего файла InfoPlist.strings), если он существует. Если локализованной версии ключа не существует, подпрограммы возвращают значение, хранящееся в файле Info.plist.

    Например, в приложении TextEdit есть несколько клавиш, которые отображаются в Finder и поэтому должны быть локализованы. Предположим, что в вашем файле списка информационных свойств определены следующие ключи:

    Французская локализация для TextEdit включает следующие строки в файле InfoPlist.strings каталога Contents/Resources/French.lproj:

    Дополнительную информацию о размещении файлов InfoPlist.strings в пакете см. в Руководстве по программированию пакетов. Для получения информации о создании строковых файлов см. Руководство по программированию ресурсов. Дополнительную информацию о процессе локализации см. в Руководстве по интернационализации и локализации.

    Создание ключей для платформы и устройства

    Вы можете обозначить ключ в файле Info.plist как относящийся к определенной платформе, определенному типу устройства или и тому, и другому. Чтобы создать вариант ключа для конкретной платформы или устройства, объедините имя корневого ключа с одним или двумя квалификаторами, используя следующий шаблон:

    В этом шаблоне часть key_root представляет исходное имя ключа, которое вы найдете в этом документе.

    и части являются необязательными и ограничивают применимость ключа к определенной платформе или типу устройства. Обратите внимание: если вы используете квалификатор платформы, соедините его дефисом (-), а если вы используете квалификатор устройства, соедините его тильдой (~).

    Использование квалификатора устройства встречается гораздо чаще, чем использование квалификатора платформы.

    Для квалификатора устройства можно использовать одно из следующих значений:

    iphone Ключ применяется только к устройствам iPhone

    ipod Ключ применим только к устройствам iPod touch

    ipad Ключ применим только к устройствам iPad

    Для квалификатора платформы можно указать значение iphoneos или macos в зависимости от того, на какую из этих двух платформ вы ориентируетесь.

    При указании варианта ключа делайте это в дополнение к использованию соответствующего ключа без каких-либо квалификаторов, тем самым обеспечивая разумное значение по умолчанию. Когда система ищет ключ в файле Info.plist вашего приложения, она выбирает ключ, наиболее подходящий для текущего устройства и платформы. Если он не находит квалифицированный ключ, он ищет ключ без квалификаторов. Например, чтобы указать поддержку всех ориентаций устройства на iPad и трех ориентаций на iPhone, шаблоны Xcode указывают соответствующие ключи в файле Info.plist приложения:

    Пользовательские ключи

    iOS и macOS игнорируют пользовательские ключи, которые вы включаете в файл Info.plist.Если вы хотите включить информацию о конфигурации конкретного приложения в свой файл Info.plist, вы можете сделать это свободно, если ваши имена ключей не конфликтуют с именами, которые использует Apple. При определении пользовательских имен ключей добавляйте к ним уникальный префикс, например идентификатор пакета вашего приложения или доменное имя вашей компании, чтобы предотвратить конфликты.

    Рекомендуемые ключи Info.plist

    Каждый из шаблонов приложений Xcode включает файл Info.plist, но вы также можете создать его с нуля. При создании файла списка информационных свойств всегда следует включать несколько ключей. К этим ключам почти всегда обращается система, и их предоставление гарантирует, что у системы есть информация, необходимая ей для эффективной работы с вашим приложением.

    Рекомендуемые ключи для приложений iOS

    Рекомендуется, чтобы приложение iOS включало следующие ключи в свой файл списка информационных свойств. Большинство из них устанавливаются Xcode автоматически при создании проекта.

    Я отлично работал над своим проектом Xcode для iOS, но вдруг при попытке запустить его я начал получать сообщение об ошибке, показанное ниже:

    Я действительно запутался. Я просмотрел прошлые вопросы StackOverflow и до сих пор не смог это исправить. Можно ли просто создать новый информационный список? Что вы думаете, ребята?

    Иногда это происходит, если у вас есть конфликт слияния в этом файле из системы управления версиями. В этом случае откройте файл в обычном текстовом редакторе и найдите пометки из системы управления версиями, которые обычно начинаются с ">>>>>>>>>>>>>>"

    4 ответа 4

    Я столкнулся с той же ошибкой. Потребовалось довольно много времени, чтобы понять это. Вот как я это сделал:

    • Перейдите в свой терминал
    • Перейдите к месту, где находится файл plist, например cd /user/desktop/app/Runner/info.plist
    • Затем используйте команду plutil, например plutil info.plist

    Это покажет вам, где ошибка, и вы сможете ее исправить. Надеюсь, это поможет.

    согласен - это самое полезное решение многих потенциальных проблем. Моя последняя - пустая строка 2587.

    Это должен быть правильный/лучший ответ. Потребовались секунды, чтобы найти ошибку в моем plist-файле из 2000 строк, который я уже потратил 20 минут, просматривая строку за строкой, чтобы найти проблему. Мой файл plist представляет собой каталог сотрудников, который автоматически создается из базы данных, и в нем отсутствует строковое значение для одного из ключей.

    Файл plist – это XML-документ строго определенного формата. и XML, и структура списка свойств имеют очень строгие правила. Вы легко можете случайно все испортить, если попытаетесь отредактировать файл info.plist вручную (т. е. в виде текста), сказав «Открыть как» > «Исходный код»:

    Вряд ли вы правильно поймете этот формат. Таким образом, вы всегда должны редактировать info.plist с помощью команды «Открыть как» > «Список свойств»:

    Это позволяет редактору списка свойств сгенерировать XML для вас, и маловероятно, что он допустит ошибку в результирующей XML-структуре. Конечно, я полагаю, что вы могли перепутать значение чего-либо.

    В своем блоге, посвященном часто используемым местоположениям iOS, я упомянул, что местоположения хранятся в формате, который не очень удобен для аналитиков. Эти plist-файлы имеют двоичный формат plist — ничем не отличаются от других двоичных plist-файлов, за исключением того, что в их структуру сложно добавить контекст. Вместо непосредственно связанных пар ключ/значение ключи и значения хранятся случайным образом.

    Я заметил, что этот формат используется чаще, особенно в файлах устройств iOS. Двоичный формат plist не исчезнет в ближайшее время! Ожидайте увидеть их в системах iOS и OS X.

    О формате NSKeyedArchiver

    Вообще говоря, этот формат используется для упрощения доступа разработчиков к сохраненным данным. Их также можно использовать для обратной/прямой совместимости с их приложениями. Что касается криминалистического анализа, думайте о них как о данных, хранящихся в сериализованном древовидном формате. Нам нужно начать с основания дерева и работать оттуда, чтобы вручную добавить контекст к этим значениям. Следующие ссылки описывают формат NSKeyedArchiver более подробно.

    «Тьфу, почему!?» Момент

    Как аналитик, если вы когда-нибудь откроете plist-файл и увидите следующую структуру plist, вы можете быть уверены, что аналитик услышит стоны, ругательства и общие признаки недовольства. Анализировать этот файл будет не так просто, как просто вставить его в вашу любимую программу просмотра plist и прочитать ключи и значения, как в «обычном» двоичном файле plist.

    Недавно я просматривал новые и измененные артефакты в системе El Capitan (10.11), когда обнаружил резкое изменение в разделе «Последние элементы» для каждого пользователя. Файл com.apple.recentitems.plist больше не существует в пользовательском каталоге /Preferences. В предыдущих версиях файл plist выглядел так, как показано в примере ниже. Ключи и значения имеют контекст, и я могу быстро просмотреть десять последних приложений, к которым обращался пользователь.

    В версии 10.11 эти данные теперь используют формат NSKeyedArchiver. Расположение этого артефакта также изменилось. Эти файлы теперь расположены в каталоге ~/Library/Application Support/com.apple.sharedfilelist/.

    Расширение файла также изменилось с «.plist» на «.sfl». Однако они по-прежнему представляют собой двоичные списки, как показано на снимке экрана ниже. Обратите внимание на заголовок файла «bplist00».

    Из-за изменения расширения файла просто попытаться открыть их в средстве просмотра plist Xcode сложно. Приходим к следующему представлению. (Примечание. Не все двоичные списки файлов NSKeyedArchiver будут иметь собственное расширение файла, некоторые имеют ожидаемое расширение «.plist». Они должны открываться в Xcode, как ожидается.)

    Мы могли бы переименовать все эти файлы «.sfl» в «.plist», открыть их в Xcode и просмотреть. Вы увидите что-то вроде следующего скриншота. Обратите внимание на ключи с именами $version, $objects, $archiver (со значением NSKeyedArchiver) и $top. Это явные признаки того, что вы получили на руки двоичный plist NSKeyedArchiver. Вам повезло!

    Если мы немного расширим plist, мы увидим элементы, представляющие потенциальный интерес. Мы можем видеть имена приложений, пути к файлам, бинарные BLOB-объекты и многое другое! К сожалению, в этом нет контекста. Не гарантируется, что ключи в последовательном порядке связаны каким-либо образом.

    Xcode даже не показывает здесь все, лучшим инструментом для просмотра файлов такого типа является утилита командной строки plutil. (Примечание: другие просмотрщики plist могут показать вам эту информацию без необходимости использования других утилит, я смотрю на вас Blacklight — отличная работа!)

    В терминале мы будем использовать приведенную ниже команду для создания дампа этих файлов, что упростит их анализ. Флаг «-p» для plutil выводит на стандартный вывод в формате JSON. Я также перенаправил их в выходной файл, а не в стандартный вывод, чтобы мне было легче просматривать файл.

    Частичный вывод ниже показывает, чего не хватало в средстве просмотра Xcode. Обратите внимание на дополнительную информацию в ключе «1» из приведенного выше примера Xcode. Теперь мы можем просматривать «NS.keys» и «NS.objects» вместе с их значениями и типами классов. Это именно то, что нам нужно для контекста этих данных.

    Вот копия примера вывода, который я использую в этой статье, если вы хотите продолжить.

    Время анализа! Начиная с $top:

    Корневым корнем этих файлов является «корневой» ключ в $top. Всегда идите сюда первым, чтобы найти начало дерева. В приведенном ниже примере ключ «root» имеет значение «1». Это означает, что мы начинаем с клавиши «1». Время перейти к началу выходного файла!

    Глядя на ключ «1» в разделе «$objects», мы видим, что он имеет два вложенных ключа: «NS.keys» и «NS.objects».

    Ключи и объекты напрямую связаны, в приведенном ниже примере ключ со значением 2 связан со значением объекта 5, ключ 3 с объектом 6 и ключ 4 с объектом 10.

    Каждое число «значение» является ключом в plist, поэтому в этом разделе мы рассмотрим ключи 2, 3, 4, 5, 6 и 10.

    Здесь также указан $class (значение «9») — эти значения описывают тип содержащихся данных. В этом случае мы смотрим на тип данных «NSDictionary». Во многих случаях, в зависимости от файла plist, вы найдете проприетарные типы данных. Файлы StateModel, используемые в часто используемых местоположениях iOS, интенсивно используют их.

    Давайте посмотрим на ключи 2, 3, 4. «NS.keys» обычно говорит нам, как называется ключ:

    • 2 – «версия»
    • 3 — "свойства"
    • 4 – «предметы»

    Теперь давайте посмотрим на связанные с ними объекты в ключах 5, 6 и 10. Обычно здесь хранятся данные для каждого имени ключа, указанного выше.

    • 2 – «версия»
      • 5 – 1 
      • 6 – Другое поле данных NS.key/NS.object. Нам нужно копать дальше.
      • 10 – Поле данных NS.object. Нам нужно копать дальше.

      Хорошо, значит, мы рассматриваем версию 1 чего-то. Нам нужно продолжать копаться в этих вложенных значениях, чтобы понять, что это такое!

      Давайте посмотрим на ключ 3, объект 6. Мы видим, что он имеет значение $class 9 (NSDictionary). Перечисление этих данных дает нам ключ 7 со связанным объектом 8.

      Похоже, у нас есть максимальное количество файлов 10 для недавних LSSharedFileList. Это ожидаемо, 10 последних предметов – это максимальное количество за последние годы!

      Давайте вернемся и посмотрим на ключ 4, значение 10. Он указан как «элементы». Клавиша 10 содержит десять объектов (0-9) со следующими значениями 11, 21, 27, 33, 39, 45, 51, 57, 63, 69. Все они должны быть пронумерованы сами по себе. Давайте посмотрим на первый ключ «элемент» 11.

      Ключ «Элемент» 11 содержит следующие данные:

      • "$class" – (значение 20) – "SFListItem"
        • Один из тех «проприетарных» типов данных.
        • Скопируйте этот шестнадцатеричный код и просмотрите его в шестнадцатеричном редакторе.
        • Не заполняется в этом экземпляре.
        • Если мы проследим за этим с помощью ключа 16, мы получим «file:///Applications/System%20Preferences.app/».

        Теперь мы можем просмотреть и перечислить остальные «элементы», однако я оставлю эту задачу читателю для практики!

        Вы можете видеть, что эти файлы могут быть сильно вложены с различными типами данных. Просмотр этих файлов может быть очень ручным процессом, поэтому я ожидаю написать много скриптов, анализирующих эти файлы, когда у меня будет время (или я достаточно разочарован), чтобы сделать это.

        Каждый из этих файлов NSKeyedArchiver представляет собой отдельный специальный файл, не существует двух одинаковых файлов, что еще больше усложняет их синтаксический анализ. Для скриптеров: мне очень понравился ccl_bplist.py, который помогает в этом процессе.

        ОБНОВЛЕНИЕ (02.01.15) — Дополнительная статья в блоге и реализация Python для файлов SFL от @mikeymikey

        Читайте также: