How to create a simple service in Leopard?

  • Hello,

    I'm having some problems writing and then installing my own service
    and would be grateful if anyone could help. I've followed the OS X
    documentation but still can't seem to get my custom "hello world"
    service to work.

    I'm creating a new project in Xcode using the Foundation Tool as I
    don't need an interface. My main.m looks like this:

    #import <Foundation/Foundation.h>
    #import "MyService.h"

    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        MyService * myService = [[MyService alloc] init];
        NSRegisterServicesProvider(myService, @"MyService");
        [[NSRunLoop currentRunLoop] run];
        [myService release];

        [pool drain];
        return 0;
    }

    Then I create the MyService class and just add the method given in the
    OS X documentation almost verbatim (http://developer.apple.com/documentation/Cocoa/Conceptual/SysServices/Tasks
    /providing.html#/

    /apple_ref/doc/uid/20000853). I don't need to return anything back so
    I just take a string from the pasteboard. All I'm doing here is
    printing the pasteboard string to the console using this method
    signature:

    - (void)doMyService:(NSPasteboard *)pboard userData:(NSString
    *)userData error:(NSString **)error;

    Now, when I advertise the service, I need to add the NSServices entry
    (as given in the link above) to the Info.plist file. However, there
    isn't one for a plain foundation tool template -- nor is there a
    package wrapper. So, I just add another target (loadable bundle) and
    add all the target information to the loadable bundle, and enter the
    NSServices entry into the auto-generated ...-Info.plist file. I make
    this bundle the active target, change the wrapper to a .service
    extension in the configuration options, and build it successfully.
    Then I place this service bundle into ~/Library/Services, log out, and
    log back in. And voila, my menu item doesn't even appear in the
    Services menu.

    Any ideas how to get such a simple non-gui service to work?

    BTW, I tried to two examples in /Developer/Examples/Appit/
    SimpleService & SimpleImageFilter, and I can't get these to work either.

    I'm running Leopard 10.5.6 on Intel.

    Best,
    Dalmazio
  • Hello,

    Whoops, actually SimpleService does work... my mistake. I'll have a
    closer look at this example.

    Best,
    Dalmazio

    On 4-Jan-09, at 2:41 AM, Dalmazio Brisinda wrote:

    > Hello,
    >
    > I'm having some problems writing and then installing my own service
    > and would be grateful if anyone could help. I've followed the OS X
    > documentation but still can't seem to get my custom "hello world"
    > service to work.
    >
    > I'm creating a new project in Xcode using the Foundation Tool as I
    > don't need an interface. My main.m looks like this:
    >
    > #import <Foundation/Foundation.h>
    > #import "MyService.h"
    >
    > int main (int argc, const char * argv[]) {
    > NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    >
    > MyService * myService = [[MyService alloc] init];
    > NSRegisterServicesProvider(myService, @"MyService");
    > [[NSRunLoop currentRunLoop] run];
    > [myService release];
    >
    > [pool drain];
    > return 0;
    > }
    >
    > Then I create the MyService class and just add the method given in
    > the OS X documentation almost verbatim (http://developer.apple.com/documentation/Cocoa/Conceptual/SysServices/Tasks
    /providing.html#/

    > /apple_ref/doc/uid/20000853). I don't need to return anything back
    > so I just take a string from the pasteboard. All I'm doing here is
    > printing the pasteboard string to the console using this method
    > signature:
    >
    > - (void)doMyService:(NSPasteboard *)pboard userData:(NSString
    > *)userData error:(NSString **)error;
    >
    > Now, when I advertise the service, I need to add the NSServices
    > entry (as given in the link above) to the Info.plist file. However,
    > there isn't one for a plain foundation tool template -- nor is there
    > a package wrapper. So, I just add another target (loadable bundle)
    > and add all the target information to the loadable bundle, and enter
    > the NSServices entry into the auto-generated ...-Info.plist file. I
    > make this bundle the active target, change the wrapper to a .service
    > extension in the configuration options, and build it successfully.
    > Then I place this service bundle into ~/Library/Services, log out,
    > and log back in. And voila, my menu item doesn't even appear in the
    > Services menu.
    >
    > Any ideas how to get such a simple non-gui service to work?
    >
    > BTW, I tried to two examples in /Developer/Examples/Appit/
    > SimpleService & SimpleImageFilter, and I can't get these to work
    > either.
    >
    > I'm running Leopard 10.5.6 on Intel.
    >
    > Best,
    > Dalmazio
    >
  • Hello,

    Okay, a bit of weirdness is going on.

    For the Info.plist file, It seems that Xcode generates the key for the
    menu item as "Menu item title" instead of "default" after a build --
    even when it appears as "default" in Xcode. If I manually edit the
    Info.plist file and make it "default" everything works fine.

    Looks like an Xcode bug to me.

    Best,
    Dalmazio

    On 4-Jan-09, at 2:50 AM, Dalmazio Brisinda wrote:

    > Hello,
    >
    > Whoops, actually SimpleService does work... my mistake. I'll have a
    > closer look at this example.
    >
    > Best,
    > Dalmazio
    >
    >
    >
    > On 4-Jan-09, at 2:41 AM, Dalmazio Brisinda wrote:
    >
    >> Hello,
    >>
    >> I'm having some problems writing and then installing my own service
    >> and would be grateful if anyone could help. I've followed the OS X
    >> documentation but still can't seem to get my custom "hello world"
    >> service to work.
    >>
    >> I'm creating a new project in Xcode using the Foundation Tool as I
    >> don't need an interface. My main.m looks like this:
    >>
    >> #import <Foundation/Foundation.h>
    >> #import "MyService.h"
    >>
    >> int main (int argc, const char * argv[]) {
    >> NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    >>
    >> MyService * myService = [[MyService alloc] init];
    >> NSRegisterServicesProvider(myService, @"MyService");
    >> [[NSRunLoop currentRunLoop] run];
    >> [myService release];
    >>
    >> [pool drain];
    >> return 0;
    >> }
    >>
    >> Then I create the MyService class and just add the method given in
    >> the OS X documentation almost verbatim (http://developer.apple.com/documentation/Cocoa/Conceptual/SysServices/Tasks
    /providing.html#/

    >> /apple_ref/doc/uid/20000853). I don't need to return anything back
    >> so I just take a string from the pasteboard. All I'm doing here is
    >> printing the pasteboard string to the console using this method
    >> signature:
    >>
    >> - (void)doMyService:(NSPasteboard *)pboard userData:(NSString
    >> *)userData error:(NSString **)error;
    >>
    >> Now, when I advertise the service, I need to add the NSServices
    >> entry (as given in the link above) to the Info.plist file. However,
    >> there isn't one for a plain foundation tool template -- nor is
    >> there a package wrapper. So, I just add another target (loadable
    >> bundle) and add all the target information to the loadable bundle,
    >> and enter the NSServices entry into the auto-generated ...-
    >> Info.plist file. I make this bundle the active target, change the
    >> wrapper to a .service extension in the configuration options, and
    >> build it successfully. Then I place this service bundle into ~/
    >> Library/Services, log out, and log back in. And voila, my menu item
    >> doesn't even appear in the Services menu.
    >>
    >> Any ideas how to get such a simple non-gui service to work?
    >>
    >> BTW, I tried to two examples in /Developer/Examples/Appit/
    >> SimpleService & SimpleImageFilter, and I can't get these to work
    >> either.
    >>
    >> I'm running Leopard 10.5.6 on Intel.
    >>
    >> Best,
    >> Dalmazio
    >>
    >