О пакетах
Пакеты являются удобным способом поставить программное обеспечение в OS X и iOS. Пакеты обеспечивают упрощенный интерфейс для конечных пользователей и одновременно предоставляют поддержку для разработки. Эта глава обеспечивает введение в пакеты и обсуждает роль, которую они играют в OS X и iOS.
Пакеты и пакеты
Несмотря на то, что пакеты и пакеты иногда именуются взаимозаменяемо, они фактически представляют очень отличные понятия:
Пакет является любым каталогом, который Средство поиска представляет пользователю, как будто это был единственный файл.
Пакет является каталогом со стандартизированной иерархической структурой, содержащей исполняемый код и ресурсы, используемые тем кодом.
Пакеты обеспечивают одну из фундаментальных абстракций, делающую OS X простым в использовании. При рассмотрении приложения или плагина на компьютере на что Вы фактически смотрите, каталог. В пакете каталог является кодом, и файлы ресурсов должны были подать заявку или выполненный плагин. Когда Вы взаимодействуете с каталогом пакета, однако, Средство поиска обрабатывает его как единственный файл. Это поведение препятствует тому, чтобы обычные пользователи внесли изменения, которые могли бы оказать негативное влияние на содержание пакета. Например, это препятствует тому, чтобы пользователи перестроили или удалили ресурсы или модули кода, которые могли бы препятствовать тому, чтобы приложение работало правильно.
Принимая во внимание, что пакеты должны там улучшить пользовательский опыт, пакеты приспособлены больше к помощи разработчикам упаковать их код и к помощи доступу операционной системы тот код. Пакеты определяют базовую структуру для организации кода и ресурсов, связанных с Вашим программным обеспечением. Присутствие этой структуры также помогает упростить важные функции, такие как локализация. Точная структура пакета зависит от того, создаете ли Вы приложение, платформу или плагин. Это также зависит от других факторов, таких как целевая платформа и тип плагина.
Причина пакеты и пакеты иногда считаются взаимозаменяемыми, состоит в том, что много типов пакетов являются также пакетами. Например, приложения и загружаемые пакеты являются пакетами, потому что они обычно обрабатываются как непрозрачные каталоги системой. Однако не все пакеты являются пакетами и наоборот.
Как система идентифицирует пакеты и пакеты
Средство поиска полагает, что каталог пакет, если какое-либо из следующих условий является истиной:
Каталог имеет известное расширение файла:
.app
,.bundle
,.framework
,.plugin
,.kext
, и т.д.Каталог имеет расширение, что некоторые другие требования приложения представляют тип пакета; посмотрите Пакеты документов.
Каталог имеет свой набор битов пакета.
Предпочтительный способ указать пакет состоит в том, чтобы дать каталогу пакета известное расширение файла. По большей части XCode заботится об этом для Вас путем обеспечения шаблонов, применяющих правильный номер. Все, что необходимо сделать, создают проект XCode надлежащего типа.
Большинство пакетов является также пакетами. Например, приложения и плагины обычно представляются как единственный файл Средством поиска. Однако это не истина для всех типов пакета. В частности платформа является типом пакета, обрабатывающегося как единый блок в целях соединения и использования во время выполнения, но каталоги платформы прозрачны так, чтобы разработчики могли просмотреть заголовочные файлы и другие ресурсы, которые они содержат.
Об именах дисплея пакета
Имена дисплея дают пользователю некоторый контроль над тем, как пакеты и пакеты появляются в Средстве поиска, не повреждая клиенты, полагающиеся на них. Принимая во внимание, что пользователь может переименовать файл свободно, переименовав приложение, или платформа могла бы вызвать связанные модули кода, обращающиеся к приложению или платформе по имени для повреждения. Поэтому, когда пользователь изменяет имя пакета, изменение является поверхностным только. Вместо того, чтобы изменять имя пакета в файловой системе, Средство поиска связывает отдельную строку (известный как имя дисплея) с пакетом и дисплеями та строка вместо этого.
Имена дисплея для представления пользователю только. Вы никогда не используете имена дисплея, чтобы открыть или получить доступ к каталогам в Вашем коде, но Вы действительно используете их при отображении имени каталога пользователю. По умолчанию имя дисплея пакета совпадает с самим именем пакета. Однако система может изменить имя дисплея по умолчанию в следующих случаях:
Если пакет является приложением, Средство поиска скрывается
.app
расширение в большинстве случаев.Если поддержки пакета локализовали имена дисплея (и пользователь явно не изменил имя пакета), Средство поиска выводит на экран имя, соответствующее текущие языковые настройки пользователя.
Несмотря на то, что Средство поиска скрывается .app
расширение для приложений большую часть времени, это может вывести на экран его для предотвращения беспорядка. Например, если пользователь изменяет имя приложения, и новое имя содержит другое расширение файла, Средство поиска показывает .app
. расширение, чтобы прояснить, что пакет является приложением. Например, если необходимо было добавить .mov
расширение Chess
приложение, Средство поиска вывело бы на экран Chess.mov.app
препятствовать тому, чтобы думали пользователи Chess.mov
файл QuickTime.
Для получения дополнительной информации об именах дисплея и указании локализованных имен пакета, см. Обзор Файловой системы.
Преимущества пакетов
Пакеты предоставляют следующие преимущества разработчикам:
Поскольку пакеты являются иерархиями каталогов в файловой системе, пакет просто содержит файлы. Поэтому можно использовать все те же основанные на файле интерфейсы для открытия ресурсов пакета, как Вы делаете для открытия других типов файлов.
Структура каталогов пакета упрощает поддерживать многократные локализации. Можно легко добавить новые локализованные ресурсы или удалить нежелательные.
Пакеты могут находиться на объемах многих различных форматов, включая многократные форматы ветвления как HFS, HFS +, и AFP и форматы единственного ветвления как UFS, SMB и NFS.
Пользователи могут установить, переместить и удалить пакеты просто путем перетаскивания их вокруг в Средстве поиска.
Пакеты, которые являются также пакетами и поэтому обрабатываются как непрозрачные файлы, менее восприимчивы к случайным пользовательским модификациям, таковы как удаление, модификация или переименование критических ресурсов.
Пакет может поддерживать многократные архитектуры кристалла (PowerPC, Intel) и различные требования адресного пространства (32-bit/64-bit). Это может также поддерживать включение специализированных исполнимых программ (например, библиотеки, оптимизированные для определенного набора векторных инструкций).
Большинство (но не все) исполняемый код может быть связано. Приложения, платформы (совместно использованные библиотеки), и плагины вся поддержка модель пакета. Статические библиотеки, динамические библиотеки, сценарии оболочки и инструменты командной строки UNIX не используют структуру пакета.
Связанное приложение может работать непосредственно от сервера. Никакие специальные совместно используемые библиотеки, расширения и ресурсы не должны быть установлены в локальной системе.
Типы пакетов
Несмотря на то, что все пакеты поддерживают те же основные функции, существуют изменения в способе, которым Вы определяете и создаете пакеты, определяющие их намеченное использование:
Приложение - комплект приложений управляет кодом и ресурсами, связанными с launchable процессом. Точная структура этого пакета зависит от платформы (iOS или OS X), что Вы предназначаетесь. Для получения информации о структуре комплектов приложений посмотрите Комплекты приложений.
Платформы - пакет платформы управляет динамической совместно используемой библиотекой и ее связанными ресурсами, такими как заголовочные файлы. Приложение может соединиться против одной или более платформ для использования в своих интересах кода, который они содержат. Для получения информации о структуре пакетов платформы посмотрите Анатомию Пакета Платформы.
Плагины - OS X поддерживает плагины для многих характеристик системы. Плагины являются путем к приложению для загрузки пользовательских модулей кода динамично. Следующий список идентифицирует некоторые ключевые типы плагинов, которые Вы могли бы хотеть разработать:
Пользовательские плагины являются плагинами, которые Вы определяете в своих собственных целях; посмотрите Анатомию Загружаемого Пакета.
Плагины Модуля изображения добавляют пользовательские способы поведения обработки изображений к Базовой технологии Изображения; см. Учебное руководство по Модулю Изображения.
Взаимодействуйте через интерфейс плагины Разработчика содержат пользовательские объекты, которые Вы хотите интегрировать в окно библиотеки Интерфейсного Разработчика; см. Интерфейсное Руководство по программированию разработчика Плуг-Ина.
Предпочтительные плагины Области определяют пользовательские предпочтения, которые Вы хотите интегрировать в приложение Установок системы; см. Предпочтительное Руководство по программированию Области.
Кварцевые плагины Композитора определяют пользовательские патчи для Кварцевого приложения Композитора; посмотрите Кварцевого Композитора Пользовательское Руководство по программированию Патча.
Плагины Беглого взгляда поддерживают дисплей пользовательских типов документов с помощью Беглого взгляда; см. Руководство по программированию Беглого взгляда.
Плагины центра внимания поддерживают индексацию пользовательских типов документов так, чтобы те документы могли искаться пользователем; см. Руководство по программированию Средства импорта Центра внимания.
Плагины WebKit расширяют типы контента, поддерживаемые общими веб-браузерами; посмотрите, что Плагин WebKit Программирует Темы.
Виджеты добавляют новые Основанные на HTML приложения на Инструментальную панель; посмотрите, что Инструментальная панель Программирует Темы.
Несмотря на то, что форматы документов могут эффективно использовать структуру пакета для организации их содержания, документы обычно не считают пакетами в самом чистом смысле. Документ, реализованный как каталог и обработанный как непрозрачный тип, считается пакетом документов, независимо от его внутреннего формата. Для получения дополнительной информации о пакетах документов, посмотрите Пакеты документов.
Создание пакета
По большей части Вы не создаете пакеты или пакеты вручную. Когда Вы создаете новый проект XCode (или добавьте цель к существующему проекту), XCode автоматически создает требуемую структуру пакета при необходимости. Например, приложение, платформа и загружаемый пакет предназначаются, все связали структуры пакета. При создании любой из этих целей XCode автоматически создает соответствующий пакет для Вас.
При использовании make-файлов (вместо XCode) для разрабатывания проектов, нет никакого волшебства к созданию пакета. Пакет является просто каталогом в файловой системе с четко определенной структурой и определенным расширением файла, добавленным до конца имени каталога пакета. Пока Вы создаете каталог пакета верхнего уровня и структурируете содержание Вашего пакета соответственно, можно получить доступ к тому содержанию с помощью программируемой поддержки доступа к пакетам. Для получения дополнительной информации о том, как структурировать Ваш каталог пакета, посмотрите Структуры Пакета.
Программируемая поддержка доступа к пакетам
Программы, относящиеся к пакетам или самостоятельно связывающиеся, могут использовать в своих интересах интерфейсы в Какао и Базовой Основе для доступа к содержанию пакета. Используя эти интерфейсы можно найти ресурсы пакета, получить информацию о конфигурации пакета и загрузить исполняемый код. В приложениях Objective C Вы используете NSBundle
класс, чтобы добраться и управлять информацией о пакете. Для приложений на базе С можно использовать функции, связанные с CFBundleRef
непрозрачный тип для управления пакетом.
Для получения информации о том, как использовать программируемую поддержку в Какао и Базовой Основе для доступа к пакетам, посмотрите Доступ к Содержанию Пакета.
Инструкции для Использования пакетов
Пакеты являются предпочтительным организационным механизмом для программного обеспечения в OS X и iOS. Структура пакета позволяет Вам исполняемый код группы и ресурсы для поддержки того кода в одном месте и организованным способом. Следующие инструкции дают некоторый дополнительный совет о том, как использовать пакеты:
Всегда включайте информационный список свойств (
Info.plist
) файл в Вашем пакете. Удостоверьтесь, что Вы включаете ключи, рекомендуемые для Вашего типа пакета. Для списка всех ключей можно включать в этот файл, видеть Инструкции по Конфигурации Во время выполнения.Если приложение не может работать без определенного файла ресурсов, включайте тот файл в комплекте приложений. Приложения должны всегда включать все изображения, строковые файлы, локализуемые ресурсы и плагины, которыми они должны управлять. Некритические ресурсы должны так же быть сохранены в комплекте приложений каждый раз, когда возможный, но может быть помещен вне пакета в случае необходимости. Для получения дополнительной информации о структуре пакета приложений, посмотрите Комплекты приложений.
Если Вы планируете загрузить код C++ из пакета, Вы могли бы хотеть отметить символы, которые Вы планируете загрузить как
extern “C”
. Ни одинNSBundle
ни базовая основаCFBundleRef
функции знают о соглашениях искажения имени C++, так маркировка Ваших символов, этот путь может сделать намного проще идентифицировать их позже.Вы не можете использовать
NSBundle
класс для загрузки кода Code Fragment Manager (CFM). Если необходимо загрузить основанный на CFM код, необходимо использовать функции дляCFBundleRef
илиCFPlugInRef
непрозрачные типы. Можно загрузить основанные на CFM плагины из Мужественной исполнимой программы с помощью этого метода.Необходимо всегда использовать
NSBundle
класс (в противоположность функциям связался сCFBundleRef
непрозрачный тип) для загрузки любого пакета, содержащего код Java.При загрузке пакетов, содержащих код Objective C, можно использовать любого
NSBundle
класс или функции связались сCFBundleRef
непрозрачный тип в OS X v10.5 и позже, но существуют различия в поведении для каждого. При использовании Базовых функций Основы для загрузки плагина или другого загружаемого пакета (в противоположность платформе или динамической совместно используемой библиотеке), функции загружают пакет конфиденциально и сразу связывают его символы; если Вы используетеNSBundle
, пакет загружается глобально, и его символы связываются лениво. Кроме того, пакеты загрузили использованиеNSBundle
причина класса генерацияNSBundleDidLoadNotification
уведомления, тогда как те загруженное использование Базовых функций Основы не делают.