Как автоматически активировать пункт в меню служб OS X - PullRequest
3 голосов
/ 05 октября 2010

Мне нужно, чтобы служба, которую я создал, была включена по умолчанию в меню служб.

Я создал службу для своего приложения OS X (работающего на Snow Leopard).Я настроил Info.plist следующим образом:

<key>NSServices</key>
<array>
    <dict>
        <key>NSSendTypes</key>
        <array>
            <string>NSStringPboardType</string>
        </array>
        <key>NSMessage</key>
        <string>dropService</string>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Drop Service</string>
        </dict>
        <key>NSPortName</key>
        <string>MyApp</string>
    </dict>
</array>

Пока все хорошо, я следую другим шагам, описанным в: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/SysServices/introduction.html, и все, кажется, работает правильно.

Я выполнил команду:

/System/Library/CoreServices/pbs

И теперь моя служба отображается в разделе «Системные настройки -> Клавиатура -> Сочетания клавиш -> Службы».Так что система знает об этом.Но он не будет отображаться в меню служб, если я не активирую его вручную.

Когда я пытаюсь отладить службу, я получаю следующее сообщение:

/Applications/TextEdit.app/Contents/MacOS/TextEdit -NSDebugServices com.myapp.MyApp
Drop Service (com.myapp.MyApp) is disabled in the services menu and disabled in the context menu, by the standard Services policy.

Понятия не имею«стандартная политика служб» такова, и я не могу найти ссылку на эту ошибку на сайте разработчика Apple.

Я бы подумал, что автоматическое включение элементов обслуживания невозможно, но я подтвердил, что некоторые приложения делают это(например, «Вещи из культурного кода»), поэтому я знаю, что это можно сделать.

Есть идеи?

Ответы [ 3 ]

12 голосов
/ 05 октября 2010

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

Что касается значения, которое вы должны указать для этого ключа, документация заполнит вас .

11 голосов
/ 16 декабря 2010

Просто добавьте ключ NSRequiredContext с пустым словарем в качестве объекта в ваш Info.plist.Вот как это должно выглядеть:

<key>NSRequiredContext</key>
<dict>
</dict>
2 голосов
/ 05 октября 2010

Я не знаю ни одного публичного API для этого, но я нашел способ обойти это. Список всех активированных сервисов хранится в

~/Library/Preferences/pbs.plist

Вам просто нужно добавить запись и сбросить pbs. Я использую следующий фрагмент кода:

NSString*pbsPlistPath=[@"~/Library/Preferences/pbs.plist" stringByExpandingTildeInPath];
NSMutableDictionary*dict=[NSPropertyListSerialization 
                                  propertyListFromData:[NSData dataWithContentsOfFile:pbsPlistPath]
                                    mutabilityOption:NSPropertyListMutableContainers
                                                format:NULL
                                      errorDescription:NULL];
NSMutableDictionary*status=[dict objectForKey:@"NSServicesStatus"];
if(!status){
    status=[NSMutableDictionary dictionary];
    [dict setObject:status forKey:@"NSServicesStatus"];
}
if(status){
    NSMutableDictionary*m=[NSMutableDictionary dictionary];
    [m setObject:[NSNumber numberWithBool:YES] forKey:@"enabled_context_menu"];
    [m setObject:[NSNumber numberWithBool:YES] forKey:@"enabled_services_menu"];
    [status setObject:m
               forKey:@"com.my.app - Drop Service - dropService"];
}
NSData* data=[NSPropertyListSerialization dataWithPropertyList:dict
                                                        format:NSPropertyListBinaryFormat_v1_0
                                                       options:0
                                                         error:NULL];
[data writeToFile:pbsPlistPath atomically:YES];
system("/System/Library/CoreServices/pbs -flush");
system("/System/Library/CoreServices/pbs -flush_userdefs");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...