Предоставление услуги
Предоставление услуги состоит из следующих шагов:
Решение, что сделает служба
Реализация метода службы
Регистрация поставщика услуг
Распространение службы путем добавления его к файлу списка свойств приложения
Установка службы
Выбор службы
В целях этой главы предположите, что Вы решили работать над программой, чтобы считать новости USENET и иметь объект с методом, чтобы зашифровать и дешифровать статьи, такие как та в Перечислении 1. Новостные статьи, содержащие наступательный материал, часто шифруются с этим алгоритмом, названным ROT13, в котором буквы смещаются на полпути через алфавит. Так как эта функция обычно полезна как простая схема шифрования, она может быть экспортирована в другие приложения.
Текстовый метод шифрования перечисления 1
- (NSString *)rotateLettersInString:(NSString *)aString { |
NSString *newString; |
unsigned length; |
unichar *buf; |
unsigned i; |
length = [aString length]; |
buf = malloc( (length + 1) * sizeof(unichar) ); |
[aString getCharacters:buf]; |
buf[length] = (unichar)0; // not really needed.... |
for (i = 0; i < length; i++) { |
if (buf[i] >= (unichar)'a' && buf[i] <= (unichar) 'z') { |
buf[i] += 13; |
if (buf[i] > 'z') buf[i] -= 26; |
} else if (buf[i] >= (unichar)'A' && buf[i] <= (unichar) 'Z') { |
buf[i] += 13; |
if (buf[i] > 'Z') buf[i] -= 26; |
} |
} |
newString = [NSString stringWithCharacters:buf length:length]; |
free(buf); |
return newString; |
} |
Реализация метода службы
Для предложения средства шифрования как сервис запишите метод, такой как тот в Перечислении 2.
- (void)simpleEncrypt:(NSPasteboard *)pboard |
userData:(NSString *)userData error:(NSString **)error { |
// Test for strings on the pasteboard. |
NSArray *classes = [NSArray arrayWithObject:[NSString class]]; |
NSDictionary *options = [NSDictionary dictionary]; |
if (![pboard canReadObjectForClasses:classes options:options]) { |
*error = NSLocalizedString(@"Error: couldn't encrypt text.", |
@"pboard couldn't give string."); |
return; |
} |
// Get and encrypt the string. |
NSString *pboardString = [pboard stringForType:NSPasteboardTypeString]; |
NSString *newString = [self rotateLettersInString:pboardString]; |
if (!newString) { |
*error = NSLocalizedString(@"Error: couldn't encrypt text.", |
@"self couldn't rotate letters."); |
return; |
} |
// Write the encrypted string onto the pasteboard. |
[pboard clearContents]; |
[pboard writeObjects:[NSArray arrayWithObject:newString]]; |
} |
Метод, предоставляющий услугу, имеет форму messageName:userData:error:
и принимает значения, показанные в Перечислении 2. Сам метод берет данные от области монтажа по мере необходимости, воздействует на него и записывает любые результаты обратно к области монтажа. В случае ошибки метод просто устанавливает подсказку, данную ошибочным параметром ненолю NSString
и возвраты. Сообщение об ошибке регистрируется к консоли. userData параметр не используется здесь.
Теперь у Вас есть объект с методами, позволяющими ему выполнять службу для другого приложения. Затем, необходимо зарегистрировать объект во время выполнения, таким образом, средство служб знает, какой объект иметь выполняют службу.
Регистрация поставщика услуг
Вы создаете и регистрируете свой объект в applicationDidFinishLaunching:
метод делегата приложения (или эквивалентный) с setServicesProvider:
метод NSApplication
класс. Если вызывают Ваш объект encryptor
, Вы создаете и регистрируете его в этом фрагменте кода:
EncryptoClass *encryptor; |
encryptor = [[EncryptoClass alloc] init]; |
[NSApp setServicesProvider:encryptor]; |
Если Вы пишете инструмент Foundation, которому недостает NSApplication
объект, зарегистрируйте объект службы в NSRegisterServicesProvider
функция. Его объявление является следующим:
void NSRegisterServicesProvider(id provider, NSString *portName) |
где провайдер является объектом, предоставляющим услуги, и portName является тем же значением, которое Вы указываете для NSPortName
запись в NSServices
свойство информационного списка свойств приложения (Info.plist
) файл. После создания этого вызова функции необходимо ввести цикл выполнения для ответа на запросы на обслуживание.
Можно зарегистрировать только одного поставщика услуг на приложение. Если у Вас есть больше чем одна служба для обеспечения, отдельный объект должен обеспечить интерфейс для всех служб.
Запросы на обслуживание могут сразу поступить после регистрации объекта при некоторых обстоятельствах даже перед выходом applicationDidFinishLaunching:
. Поэтому зарегистрируйте своего поставщика услуг только, когда Вы будете абсолютно готовы обработать запросы.
Распространение службы
Для системы, чтобы знать, что Ваше приложение предоставляет услугу, необходимо распространить тот факт. Вы делаете это путем добавления записи в проект приложения Info.plist
файл, как описано в Свойствах Служб. Запись, которую Вы добавляете, вызывают спецификацией службы. В нашем примере, NSServices
свойство похоже на это:
<key>NSServices</key> |
<array> |
<dict> |
<key>NSKeyEquivalent</key> |
<dict> |
<key>default</key> |
<string>E</string> |
</dict> |
<key>NSMenuItem</key> |
<dict> |
<key>default</key> |
<string>Encrypt Text</string> |
</dict> |
<key>NSMessage</key> |
<string>simpleEncrypt</string> |
<key>NSPortName</key> |
<string>NewsReader</string> |
<key>NSSendTypes</key> |
<array> |
<string>NSStringPboardType</string> |
</array> |
<key>NSReturnTypes</key> |
<array> |
<string>NSStringPboardType</string> |
</array> |
</dict> |
</array> |
Установка службы
Услуга может быть предложена как часть приложения, такого как Почта, или как автономная служба — один без пользовательского интерфейса, предназначающегося для использования только в меню Services.
Для создавания приложения, предлагающего услугу используйте расширение
.app
и установите его вApplications
папка (или подпапка).Для создания автономной службы используйте расширение
.service
и сохраните его вLibrary/Services
.
В любом случае необходимо установить его в одном из четырех доменов файловой системы — Система, Сеть, Локальная, и Пользователь. (См. Домены Файловой системы в Обзоре Файловой системы для подробных данных.)
Список доступных служб на компьютер создается каждый раз, когда пользователь входит в систему. Если Ваша служба установлена в Applications
каталог, необходимо выйти из системы, и журнал въезжают задним ходом, прежде чем служба становится доступной. Если это установлено в a Library/Services
каталог, это не необходимо. Можно вызвать обновление списка служб, не выходя из системы путем вызывания следующей функции:
void NSUpdateDynamicServices(void) |
Тестирование
При тестировании программы может быть полезно инициировать непосредственное пересканирование Служб, как будто NSUpdateDynamicServices
был вызван. Можно сделать это из командной строки с помощью pbs
инструмент:
/System/Library/CoreServices/pbs |
Может также быть полезно быть уверенным, что система распознала Службу. Можно также использовать pbs
инструмент для перечисления зарегистрированных Служб путем указания dump_pboard
опция:
/System/Library/CoreServices/pbs -dump_pboard |
Если Ваша Служба распознана pbs
, но не появляется в меню Services, можно использовать NSDebugServices
пользовательское значение по умолчанию, чтобы помочь определить, почему. Например, для определения, почему Службы Почты появляются или не появляются в TextEdit можно запустить TextEdit с NSDebugServices
опция и передача это идентификатор пакета Почты:
/Applications/TextEdit.app/Contents/MacOS/TextEdit -NSDebugServices com.apple.mail |
Когда меню Services будет открыто, оно зарегистрирует информацию к консоли о том, почему служба делает или не появляется.