Перезапуск приложения через NSTask игнорирует LSMinimumSystemVersionByArchitecture - PullRequest
0 голосов
/ 03 февраля 2010

У меня проблема с повторным запуском приложения на 10.5. В моем Info.plist у меня есть LSMinimumSystemVersionByArchitecture, так что приложение будет работать в 64-битной для x86_64 и 32-битной на i386, ppc и ppc64.

У меня есть предпочтение в приложении, которое позволяет пользователю переключаться между значком 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 ]

2 голосов
/ 03 февраля 2010

Вместо этого следует использовать методы NSWorkspace, которые учитывают Info.plist ключи. Например, используйте -(BOOL)launchApplication:(NSString*).

0 голосов
/ 07 августа 2012

попробуйте этот код для перезапуска вашего приложения:

//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];
   }
}
0 голосов
/ 10 февраля 2010

Это потому, что вы используете пробелы внутри fullpath, используете аргументы в массиве [NSArray arrayWithObjects:@"/usr/bin/arch",@"-i386",@"-ppc",path,nil].

...