Синхронизация средства поиска
В OS X точка расширения Синхронизации Средства поиска позволяет Вам чисто, и безопасно измените пользовательский интерфейс Средства поиска для выражения состояния синхронизации файлов и управления. В отличие от большинства точек расширения, Синхронизация Средства поиска не добавляет опции к приложению узла. Вместо этого это позволяет Вам изменить поведение самого Средства поиска.
Расширения синхронизации средства поиска
С расширением Синхронизации Средства поиска Вы регистрируете одну или более папок для системы для контроля. Ваше расширение Синхронизации Средства поиска тогда устанавливает значки, метки и контекстные меню для любых элементов в контролируемых папках. Можно также использовать API точки расширения для добавления кнопки на панели инструментов к окну Finder или значку боковой панели для контролируемой папки.
Синхронизация средства поиска поддерживает приложения, синхронизирующие содержание локальной папки с источником удаленных данных. Это улучшает пользовательский опыт путем обеспечения непосредственной визуальной обратной связи непосредственно в Средстве поиска. Значки выводят на экран синхронизирующее состояние каждого элемента, и контекстные меню позволяют пользователям управлять содержанием папки. Пользовательские кнопки на панели инструментов могут вызвать глобальные действия, такие как открытие контролируемой папки или принуждение синхронизирующей работы.
Расширение Синхронизации Средства поиска может:
Регистр ряд папок для контроля.
Получите уведомления, когда пользователь запустит или прекратит просматривать содержание контролируемой папки.
Например, расширение получает уведомление, когда пользователь открывает контролируемую папку в Средстве поиска или в Открытом, или Сохраните диалоговое окно.
Добавьте, удалите и обновите значки и метки на элементах в контролируемой папке.
Выведите на экран контекстное меню когда щелчки контроля за работой пользователей элемент в контролируемой папке.
Добавьте пользовательскую кнопку к панели инструментов Средства поиска.
В отличие от значков и элементов контекстного меню, эта кнопка всегда доступна, даже когда пользователь в настоящее время не просматривает контролируемую папку.
Создание расширения синхронизации средства поиска в XCode
Для создания расширения Синхронизации Средства поиска добавьте новую цель к проекту OS X использование шаблона Finder Sync Extension. Этот шаблон содержит пользовательский подкласс FIFinderSync
класс. Этот подкласс действует как основной класс Вашего расширения. Система автоматически инстанцирует этого класса и вызывает методы протокола в ответ на пользовательские действия.
Для получения дальнейшей информации на добавляющих расширениях, посмотрите Создание Расширения.
Установите требуемые значения списка свойств
Для OS X, чтобы распознать и автоматически загрузить расширение Синхронизации Средства поиска, дополнительная цель info.plist
файл должен содержать следующие записи:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict/>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.FinderSync</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).FinderSync</string>
</dict>
В частности NSExtensionPrincipalClass
ключ должен обеспечить имя Вашего FIFinderSync
подкласс. Когда Средство поиска сначала запускается, система автоматически инстанцирует этого класса. Это инстанцирует дополнительной копии каждый раз, когда Открытое или Сохраняет диалоговое окно, выведен на экран. Каждая копия работает в ее собственном процессе.
Шаблон Finder Sync Extension Xcode конфигурирует их Info.plist
ключи автоматически. Если Вы хотите изменить основной класс, измените значение NSExtensionPrincipalClass
ключ.
Укажите который папки контролировать
Вы указываете папки, которые Вы хотите контролировать в Вашем расширении Синхронизации Средства поиска init
метод, с помощью значения по умолчанию FIFinderSyncController
объект. В большинстве случаев Вы хотите позволить пользователю указать эти папки в UI, предоставленном содержанием приложения. Можно передать эти данные между содержанием приложения и расширением Синхронизации Средства поиска с помощью совместно использованных пользовательских значений по умолчанию.
Для включения совместно использованных пользовательских значений по умолчанию сначала добавьте и расширение Синхронизации Средства поиска и его содержание приложения к группе приложений. Эта группа создает совместно используемый контейнер, к которому могут получить доступ оба процесса. Для каждой цели откройте область возможностей XCode и включите возможность Групп приложений. Предоставьте уникальный идентификатор совместно используемой группе. Обязательно используйте тот же идентификатор и для расширения Синхронизации Средства поиска и для содержания приложения.
Этот процесс добавляет a com.apple.security.application-groups
запись в права целей.
<key>com.apple.security.application-groups</key>
<array>
<string>com.example.domain.MyFirstFinderSyncApp</string>
</array>
Для получения дополнительной информации о группах приложений, посмотрите Добавление Приложения к Группе приложений.
Затем, инстанцируйте нового NSUserDefaults
объект путем вызова initWithSuiteName:
и передача в идентификаторе совместно используемой группы. Это init
метод создает пользовательский объект значения по умолчанию, что загрузки и сохраняют данные к совместно используемому контейнеру.
// Set up the folder we are syncing.
NSUserDefaults *sharedDefaults =
[[NSUserDefaults alloc] initWithSuiteName:@"com.example.domain.MyFirstFinderSyncExtension"];
self.myFolderURL = [sharedDefaults URLForKey:MyFolderKey];
if (self.myFolderURL == nil) {
self.myFolderURL = [NSURL fileURLWithPath:[@"~/Documents/MyFirstFinderSyncExtension Documents" stringByExpandingTildeInPath]];;
}
[FIFinderSyncController defaultController].folderURLs = [NSSet setWithObject:self.myFolderURL];
Установите изображения значка
Создайте свои изображения значка так, чтобы каждый мог быть привлечен максимум в 320x320 пикселях. Для каждого изображения заполните весь от края к краю кадра своими иллюстрациями (другими словами, не используйте дополнение). Система определяет размер и размещение изображения значка на контролируемом элементе. Диапазоны размера пикселя, в которых мог бы быть выведен на экран Ваш значок, следующие:
Сетчатка экранирует 12x12 через 320x320
Несетчатка экранирует 8x8 через 160x160
Для добавления изображения значка к конфигурации контроллера Синхронизации Средства поиска используйте setBadgeImage:label:forBadgeIdentifier:
метод, как показано здесь:
[[FIFinderSyncController defaultController]
setBadgeImage: uploadedImage
label: NSLocalizedString(@"Uploaded", nil)
forBadgeIdentifier: @"UploadComplete"];
Вы обычно делали бы это в методе инициализации синхронизирующего контроллера. Можно установить столько изображений значка, сколько Вам нужно. Строка идентификатора значка, которую Вы указываете здесь, позволяет Вам позже получать изображение для применения его к контролируемому элементу, как описано в Типичном Варианте использования Синхронизации Средства поиска.
Реализуйте методы FIFinderSync
FIFinderSync
протокол объявляет много методов, которые можно реализовать, чтобы контролировать и управлять Средством поиска. Эти методы позволяют Вам получить уведомления, когда пользователь наблюдает контролируемые элементы, добавьте контекстные меню к контролируемым элементам и добавьте пользовательскую панель инструментов и значки боковой панели.
Получение уведомлений, когда пользователи наблюдают контролируемые элементы
Реализуйте эти методы для получения уведомлений, поскольку пользователь просматривает содержание контролируемых папок.
beginObservingDirectoryAtURL:
Системные вызовы этот метод, когда пользователь начинает смотреть на содержание контролируемой папки или одну из ее подпапок. Это передает URL в настоящее время открытой папки как параметр.
Системные вызовы
beginObservingDirectoryAtURL:
только один раз для каждого уникального URL. Пока содержание остается видимым по крайней мере в одном окне Finder, проигнорированы любые дополнительные окна Finder, открывающиеся к тому же URL.endObservingDirectoryAtURL:
Системные вызовы этот метод, когда пользователь больше не смотрит на содержание данного URL. Как с
beginObservingDirectoryAtURL:
, Открытые и Сохраняют диалоговые окна, прослежены отдельно от Средства поиска.requestBadgeIdentifierForURL:
Системные вызовы этот метод, когда новый элемент в контролируемой папке становится видимым пользователю. Этот метод вызывают один раз для каждого файла, первоначально показанного в представлении Средства поиска. Система продолжает вызывать этот метод, поскольку каждый новый файл прокручивает в представление.
Вы обычно реализуете этот метод, чтобы проверить состояние элемента в предоставленном URL, и затем вызвать контроллер Синхронизации Средства поиска
setBadgeIdentifier:forURL:
метод для установки надлежащего значка. Вы могли бы также хотеть отследить этот URLs для обновления их значков каждый раз, когда их изменения состояния.
Добавление элементов контекстного меню
Реализуйте menuForMenuKind:
метод для обеспечения пользовательского контекстного меню. menu
параметр указывает тип меню, которое должно создать Ваше расширение. Каждый вид меню соответствует другому типу взаимодействия с пользователем.
FIMenuKindContextualMenuForItems
Щелкнувший по контролю за работой пользователей или больше элементов в Вашей контролируемой папке. Ваше расширение должно представить пункты меню, влияющие на выбранные пункты.
FIMenuKindContextualMenuForContainer
Щелкнувший по контролю за работой пользователей фон окна Finder при просмотре контролируемой папки. Ваше расширение должно представить пункты меню, влияющие на содержание текущей папки.
FIMenuKindContextualMenuForSidebar
Щелкнувший по контролю за работой пользователей элемент боковой панели, представляющий контролируемую папку или часть ее содержания. Ваше расширение должно представить пункты меню, производящие содержание выбранного пункта.
FIMenuKindToolbarItemMenu
Пользователь щелкнул по кнопке на панели инструментов, предоставленной расширением. Поскольку кнопка на панели инструментов всегда доступна, пользователь может или может не просматривать контролируемую папку в это время. Ваше расширение может представить пункты меню, представляющие глобальные действия, которые должны всегда быть доступны пользователю. Это может также представить пункты меню, влияющие на выбранные пункты в Вашей контролируемой папке, если кто-либо существует.
Можно получить дополнительную информацию о в настоящее время выбранные пункты с помощью контроллера Синхронизации Средства поиска targetedURL
и selectedItemURLs
методы. targetedURL
метод возвращает URL файла или папки что щелкнувший по контролю за работой пользователей. selectedItemURLs
метод возвращает массив, содержащий URLs весь в настоящее время выбранные пункты в окне Finder.
targetedURL
и selectedItemURLs
возвратите допустимые значения только в menuForMenuKind:
метод или в одном из его действий меню. Если пользователь не просматривает контролируемую папку (например, если пользователь нажал кнопку на панели инструментов, в то время как вне контролируемой папки), возвращаются оба из этих методов nil
.
Добавление пользовательской кнопки на панели инструментов
Для добавления пользовательской кнопки на панели инструментов к окну Finder реализуйте методы получателя для следующих свойств:
toolbarItemName
— Возвратите имя кнопкиtoolbarItemImage
— Возвратите изображение кнопкиtoolbarItemToolTip
— Возвратите текст всплывающей подсказки для кнопки
Когда пользователь нажимает кнопку на панели инструментов, системные вызовы Ваш основной класс menuForMenuKind:
метод, передавая FIMenuKindToolbarItemMenu
как вид меню. Ваше расширение должно возвратить надлежащее меню. Система тогда выводит на экран это меню.
Добавление значка боковой панели
Можно обеспечить пользовательский значок боковой панели для любой из корневых папок, которые контролирует расширение. Если пользователь перетащит одну из этих корневых папок в боковую панель Средства поиска, то Ваш значок будет выведен на экран вместо значка папки по умолчанию.
Для обеспечения пользовательского значка боковой панели добавьте значки к содержанию приложения. Для этого для работы и значки приложения и значки боковой панели должны быть включены в inconset. При использовании каталога актива для управления значками приложения, необходимо будет переключиться на iconset.
Создать iconset
Создайте iconset папку. Это должно быть папкой, названной <именем папки>
.iconset
. Можно выбрать любое имя, которое Вы хотите для имени папки, но это должно закончиться.iconset
расширение.Создайте полный набор значков приложения. Ваши значки должны использовать следующие имена файлов и размеры изображения:
Имя файла
Размер изображения
icon_16x16.png
16 16 пкс
icon_16x16@2x .png
32 32 пкс
icon_32x32.png
32 32 пкс
icon_32x32@2x .png
64 64 пкс
icon_128x128.png
128 128 пкс
icon_128x128@2x .png
256 256 пкс
icon_256x256.png
256 256 пкс
icon_256x256@2x .png
512 512 пкс
icon_512x512.png
512 512 пкс
icon_512x512@2x .png
1 024 1 024 пкс
Поместите эти значки в свою iconset папку. Для получения дополнительной информации о создании значков приложения посмотрите значки приложения Разработки в Инструкциях по Интерфейсу пользователя OS X.
Создайте полный набор значков боковой панели. Эти значки должны быть шаблонными изображениями — монохроматические изображения, нарисованные просто с помощью черного цвета и прозрачности. Значки должны использовать следующие имена файлов и размеры:
Имя файла
Размер изображения
sidebar_16x16.png
16 16 пкс
sidebar_16x16@2x .png
32 32 пкс
sidebar_18x18.png
32 32 пкс
sidebar_18x18@2x .png
64 64 пкс
sidebar_32x32.png
128 128 пкс
sidebar_32x32@2x .png
256 256 пкс
Поместите эти значки в свою iconset папку. Для получения дополнительной информации о создании шаблонных изображений посмотрите, Создают Шаблонные Изображения для Вставления Средств управления Панелью инструментов в Инструкциях по Интерфейсу пользователя OS X.
Добавьте iconset папку к своему проекту XCode. Удостоверьтесь, что это включено в содержание цели приложения.
Откройте содержание приложения
info.plist
. Добавьте запись для Файла значка (CFBundleIconFile
). Значение должно быть именем Вашей iconset папки (все перед.iconset
расширение).В содержании общей области приложения удостоверьтесь, что источник значков приложения не использует каталог актива. Если каталог актива был выключен, источник выведет на экран кнопку, говоря “Каталог Актива Использования” (см. рисунок 9-1). Если исходная установка значка приложения выводит на экран кнопку всплывающего меню, нажмите кнопку и выберите «Do not use asset catalogs».
Типичный вариант использования синхронизации средства поиска
Этот раздел представляет типичный вариант использования. Ваше приложение управляет и значки все элементы в контролируемой папке. Поскольку пользователь может заполнить контролируемую папку с произвольным числом подпапок и файлов, список контролируемых элементов мог расти, чтобы быть очень большим. Необходимо поэтому рассмотреть импликации производительности добавления и обновления всех этих значков. В частности избегите добавлять или обновлять значок любого элемента, который не в настоящее время видим.
При контакте с потенциально большим количеством элементов всегда обеспечивайте значки по требованию. Обеспечьте значки для элементов только, поскольку они появляются в окне Finder и записывают весь URLs для значков, которые Вы устанавливаете, так, чтобы можно было обновить их по мере необходимости.
Системные вызовы
beginObservingDirectoryAtURL:
когда пользователь сначала открывает контролируемую папку или одну из ее подпапок.Системные вызовы
requestBadgeIdentifierForURL:
для каждого элемента, в настоящее время рисующегося на экране. В этом методе сделайте следующее:Проверьте состояние элемента и установите его значок путем вызова
setBadgeIdentifier:forURL:
.Ваше приложение ответственно за определение состояний и их соответствующих значков. Например, типичное приложение синхронизации могло бы иметь значки, указывающие не синхронизировавшие локальные изменения, синхронизируя происходящие операции, успешно синхронизировавшие элементы и элементы с синхронизацией ошибок или конфликтов.
Запишите URL каждого элемента, получившего значок.
Ваше приложение должно, чтобы продолжать контролировать состояние этих элементов и обновлять их значки по мере необходимости. Когда изменения состояния элемента, обновите его значок путем вызова
setBadgeIdentifier:forURL:
.
Системные вызовы
endObservingDirectoryAtURL:
когда пользователь закрывает папку. Удалите весь URLs для элементов под маркой в той папке и прекратите контролировать их состояние.
Проблемы производительности
Расширения Синхронизации средства поиска могут иметь намного более длинную продолжительность жизни, чем большинство других расширений. Из-за этой длинной продолжительности жизни необходимо проявить определенную заботу для предотвращения любых возможных проблем производительности. Идеально, расширения Синхронизации Средства поиска должны провести большую часть своего времени, работая, но неактивный. Ограничьте число ресурсов, которые использует расширение. Самый важный, убедиться избежать пропускать любые ресурсы. В течение долгого времени даже маленькая струйка может превратиться в серьезную проблему.
Система может также запустить дополнительные копии Вашего расширения каждый раз, когда Открытое или Сохраняет диалоговое окно, выведен на экран. Это означает, что у пользователя могут быть многократные копии Вашего дополнительного выполнения сразу, и некоторые могут быть очень недолговечными. Если расширение фокусируется на обработке значков, контекстных меню и кнопок на панели инструментов, Поэтому обычно лучше. Место в отдельной службе (Агент Элемента или Запуска Входа в систему) любой код, выполняющий синхронизацию, обновляет состояние или связывается с источниками удаленных данных. Этот подход гарантирует, что существует только одна служба синхронизации, работающая за один раз.
Для получения дополнительной информации о связи с элементом входа в систему или launchd агентом, посмотрите Используя Objective C NSXPCConnection API в Руководстве по программированию Демонов и Служб.