通过NSTask重新启动应用程序忽略LSMinimumSystemVersionByArchitecture

时间:2010-02-03 05:44:38

标签: objective-c cocoa nstask

我遇到了在10.5上重新启动我的应用程序的问题。在我的Info.plist中,我设置了LSMinimumSystemVersionByArchitecture,以便应用程序将在64位上运行x86_64,在i386,ppc和ppc64上运行32位。

我在应用中有一个首选项,允许用户在Dock图标和NSStatusItem,它会提示用户在使用以下代码更改设置后重新启动应用程序:

id fullPath = [[NSBundle mainBundle] executablePath];
NSArray *arg = [NSArray arrayWithObjects:nil];    
[NSTask launchedTaskWithLaunchPath:fullPath arguments:arg];
[NSApp terminate:self];

当它在10.5上执行时,它会以64位重新启动应用程序,这对我来说不是一个理想的结果。从我收集的文档读取它因为当通过命令行启动应用程序时不读取LS *键。

有解决方法吗?我尝试做类似下面的事情,它在10.6上运行,但是在10.5上,我发誓“发射路径无法访问”。 ([NSApp isOnSnowLeopardOrBetter]是一个检查AppKit版本号的类别。)

id path = [[NSBundle mainBundle] executablePath];    
NSString *fullPath = nil;
if (![NSApp isOnSnowLeopardOrBetter])      
  fullPath = [NSString stringWithFormat:@"/usr/bin/arch -i386 -ppc %@", path];
else    
  fullPath = path;

NSArray *arg = [NSArray arrayWithObjects:nil];    
[NSTask launchedTaskWithLaunchPath:fullPath arguments:arg];
[NSApp terminate:self]; 

3 个答案:

答案 0 :(得分:2)

您应该使用NSWorkspace的方法,它会考虑Info.plist个密钥。例如,使用-(BOOL)launchApplication:(NSString*)

答案 1 :(得分:0)

这是因为你在fullpath中使用了空格,在数组[NSArray arrayWithObjects:@"/usr/bin/arch",@"-i386",@"-ppc",path,nil]中使用了参数。

答案 2 :(得分:0)

尝试使用此代码重新启动您的应用:

//terminate your app in some of your method:
[[NSApplication sharedApplication]terminate:nil];

- (void)applicationWillTerminate:(NSNotification *)notification {

    if (i need to restart my app) {

       NSTask *task = [NSTask new];
       [task setLaunchPath:@"/usr/bin/open"];
       [task setArguments:[NSArray arrayWithObjects:@"/Applications/MyApp.app", nil]];
       [task launch];
   }
}