2017-02-21 4 views
1

Я играл с NSWorkspace.Запуск приложений программно

  • [[NSWorkspace sharedWorkspace] LaunchApplication: @ "Фотографии"] работает

  • [[NSWorkspace sharedWorkspace] LaunchApplication: @ "Контакты"] делает не работы

  • [[NSWorkspace sharedWorkspace] launchApplication: @ "/ Applications/Contacts.app"] работает

(Mac OS S ierra)

Итак, мне было интересно, есть ли безопасный способ найти «настоящий» путь к приложению. Может быть, приложение «Контакты» имеет разные имена при различной локализации системы? Почему просто «Фотографии» работают нормально?

Я бы предположил, что из идентификационного идентификатора приложения Apple должен быть путь, чтобы получить путь к приложению, но я ничего не нашел.

ответ

3

Помните, что launchApplication: возвращает BOOL, если это удалось или нет.

Чтобы быть уверенным в том, что приложение запускается, вы также можете попробовать найти его через API-интерфейс NSISpace URLForApplicationWithBundleIdentifier:, в который вы можете подключить идентификатор приложения Contact com.apple.AddressBook.

С результатом, вы можете вызвать явное расположение приложения с помощью:

- (NSRunningApplication *)launchApplicationAtURL:(NSURL *)url options:(NSWorkspaceLaunchOptions)options configuration:(NSDictionary<NSString *,id> *)configuration error:(NSError * _Nullable *)error;

+0

Спасибо. Это похоже на то, что я искал. Но как вы можете быть уверены в идентификаторе пакета - или даже быть уверенным, что он будет оставаться постоянным во времени. Я не нашел список в документе APple (хотя вы можете найти списки в Интернете). –

+0

Идентификаторы приложений обычно не изменяются, если нет резких изменений (например, iPhoto был заменен на Photos.app) –

+0

Да, это то, что я имел в виду. В этом случае код с использованием идентификатора пучка будет нарушен. Другим решением может быть использование openURL: [NSURL URLWithString: @ "photos: //"]. Не уверен, что это более стабильно во времени, но я бы сказал, что оба iPhoto и Photos будут поддерживать эту схему URL ... Я приму ваш ответ, если на следующий день ничего лучше не появится. –

0

Лучшего способа, чтобы открыть приложение от пути файла URL. Я сделал то же самое для моего приложения, как показано ниже:

NSString *appPathIs = Url.path; 

Я принимаю Путь URL в одну строку, а затем открыть его, как вы указали

[[NSWorkspace sharedWorkspace] launchApplication:appPathIs]; 

Я старался всячески добиваться того же но когда-то они работают, а когда-то нет. Если вы хотите попробовать другой, пожалуйста, подумайте об этом:

NSString *appPathIs = [[NSWorkspace sharedWorkspace] fullPathForApplication:appName]; 
NSString *identifier = [[NSBundle bundleWithPath:appPathIs] bundleIdentifier]; 
NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:identifier]; 

[[NSWorkspace sharedWorkspace] launchApplication:appPathIs]; 
Смежные вопросы