我正在尝试使用NSTask启动另一个应用程序
NSArray* argArray = [NSArray arrayWithObjects:fileName, nil];
NSTask* task = [NSTask launchedTaskWithLaunchPath:appName arguments:argArray];
虽然这有效,但主要的gui窗口并没有出现在前面。
当使用不同的fileName重复调用时,即使只有一个应用程序实例正在运行,新文件也会在应用程序中加载
任何poiners?我确实试过了SetFrontProcess
但是在引入延迟
我确实研究过NSRunningApplication,但它似乎不适用于10.5,而我需要10.5和10.6的解决方案
答案 0 :(得分:3)
请勿使用NSTask
启动应用程序。使用NSWorkspace,它有多种方法(例如-launchApplication:
)来启动和激活应用程序。
答案 1 :(得分:1)
我从MDFoundationAdditions
和MDAppKitAdditions
类别中抓取了这些内容。
此解决方案适用于Mac OS X 10.4.x及更高版本(在引入LSOpenApplication()时):
MDAppKitAdditions.h:
#import <Cocoa/Cocoa.h>
#import "MDFoundationAdditions.h"
@interface NSWorkspace (MDAdditions)
- (BOOL)launchApplicationAtPath:(NSString *)path
arguments:(NSArray *)argv
error:(NSError **)error;
@end
MDAppKitAdditions.m:
#import "MDAppKitAdditions.h"
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
#include <ApplicationServices/ApplicationServices.h>
#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
#include <CoreServices/CoreServices.h>
#endif
@implementation NSWorkspace (MDAdditions)
- (BOOL)launchApplicationAtPath:(NSString *)path arguments:(NSArray *)argv
error:(NSError **)error {
BOOL success = YES;
if (error) *error = nil;
if (path) {
FSRef itemRef;
if ([path getFSRef:&itemRef error:error]) {
LSApplicationParameters appParameters =
{0, kLSLaunchDefaults, &itemRef, NULL, NULL,
(argv ? (CFArrayRef)argv : NULL), NULL };
OSStatus status = noErr;
status = LSOpenApplication(&appParameters, NULL);
if (status != noErr) {
success = NO;
NSLog(@"[%@ %@] LSOpenApplication() returned %hi for %@",
NSStringFromClass([self class]),
NSStringFromSelector(_cmd), status, path);
if (error) *error =
[NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
}
}
}
return success;
}
@end
MDFoundationAdditions.h:
#import <Foundation/Foundation.h>
#import <CoreServices/CoreServices.h>
@interface NSString (MDAdditions)
- (BOOL)getFSRef:(FSRef *)anFSRef error:(NSError **)anError;
@end
MDFoundationAdditions.h:
#import "MDFoundationAdditions.h"
#import <sys/syslimits.h>
@implementation NSString (MDAdditions)
- (BOOL)getFSRef:(FSRef *)anFSRef error:(NSError **)anError {
if (anError) *anError = nil;
OSStatus status = noErr;
status = FSPathMakeRef((const UInt8 *)[self UTF8String], anFSRef, NULL);
if (status != noErr) {
if (anError)
*anError = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
}
return (status == noErr);
}
@end
答案 2 :(得分:0)
如果要启动的任务是正确的应用程序,则可以使用NSWorkspace的
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName
andDeactivate:(BOOL)flag
答案 3 :(得分:0)
要扩展indragie的答案,如果你想要一个带有文件参数的新实例,请执行类似(未经测试)的操作:
NSDictionary *config = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObject:filePath], NSWorkspaceLaunchConfigurationArguments,
nil];
NSError *error = nil;
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:yourAppURL options:NSWorkspaceLaunchNewInstance | NSWorkspaceLaunchDefault configuration:config error:&error]
在10.5上,您可以尝试(未测试):
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
[[NSWorkspace sharedWorkspace] openURLs:[NSArray arrayWithObject:fileURL] withAppBundleIdentifier:@"com.foo.someapp" options:NSWorkspaceLaunchNewInstance | NSWorkspaceLaunchDefault additionalEventParamDescriptor:nil launchIdentifiers:nil];