Search code examples
objective-ccocoalaunching-application

Launching an Mac App with Objective-C/Cocoa


When launching Path Finder app with command line, I use open -a Path Finder.app /Users/. Based on this idea, I use the following code to launch Path Finder.

Can I have launch app without using open command line?

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/open"];

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-a", @"Path Finder.app", @"/Users/", nil];
[task setArguments: arguments];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

Solution

  • if(![[NSWorkspace sharedWorkspace] launchApplication:@"Path Finder"])
        NSLog(@"Path Finder failed to launch");
    

    With Parameters:

    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
    NSURL *url = [NSURL fileURLWithPath:[workspace fullPathForApplication:@"Path Finder"]];
    //Handle url==nil
    NSError *error = nil;
    NSArray *arguments = [NSArray arrayWithObjects:@"Argument1", @"Argument2", nil];
    [workspace launchApplicationAtURL:url options:0 configuration:[NSDictionary dictionaryWithObject:arguments forKey:NSWorkspaceLaunchConfigurationArguments] error:&error];
    //Handle error
    

    You could also use NSTask to pass arguments:

    NSTask *task = [[NSTask alloc] init];
    NSBundle *bundle = [NSBundle bundleWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:@"Path Finder"]]];
    [task setLaunchPath:[bundle executablePath]];
    NSArray *arguments = [NSArray arrayWithObjects:@"Argument1", @"Argument2", nil];
    [task setArguments:arguments];
    [task launch];