Search code examples
objective-cxcodemacosnstasknsworkspace

Run .saver file from objective c Xcode


I want to upload a screen saver to the app store, after contacting them I was told to encapsulate the .saver inside the .app

I want to build a simple .app that launches the .saver which is in its bundle. However I failing to do so :(

I tried several solutions with NSTask and NSWorkspace but none works :(

Here are some attempts

    if(![[NSWorkspace sharedWorkspace] launchApplication:@"/Users/romanl/Desktop/XsaverApp/XsaverApp/SCTEST.saver/Contents/MacOS/SCTEST"])
    NSLog(@"Path Finder failed to launch");



    NSTask * task = [[NSTask alloc] init];
   [task setLaunchPath:@"/Users/romanl/Desktop/XsaverApp/XsaverApp/SCTEST.saver/Contents/MacOS/SCTEST"];
   [task launch];//Outputs : "Couldn't posix_spawn: error 8"

What is the approach to launch it ?


Solution

  • Well I solved it now... If someone will be interested in future I posting the answer here

        [self.window close];
        NSTask * installTask = [[NSTask alloc]init];
        NSBundle * bundle = [NSBundle mainBundle];
    
        NSString * saverPath = [bundle pathForResource:@"CatsScreenSaver" ofType:@"saver"];
    
        NSMutableString * launchString = [[NSMutableString alloc]initWithString:@"open "];
        [launchString appendString:saverPath];
    
        [installTask setLaunchPath:@"/bin/bash"];
    
        NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     launchString,
                     nil];
        [installTask setArguments: args];
        [installTask launch ];
    
        [installTask waitUntilExit];
        [NSApp terminate:self];
    

    The tricky part is here

            NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     launchString,
                     nil];
            [installTask setArguments: args];
    

    Should put those arguments in NSTask in order to let it run Pathes from the user space.