2017-02-21 16 views
1

私はNSWorkspaceで遊んでいます。プログラムでプログラムを起動する

  • [[NSWorkspace sharedWorkspace]にLaunchApplication: "写真" @]が[[NSWorkspace ない仕事

  • を行い

  • [ "連絡先" @ [NSWorkspace sharedWorkspace]にLaunchApplication]が動作します共有アプリケーション] launchApplication:@ "/ Applications/Contacts.app"]は動作します

ierra)

「本当の」アプリケーションのパスを見つけるための任意の安全な方法があるのであれば、私は思っていました。連絡先アプリは、システムの異なるローカリゼーションで異なる名前を持っている可能性がありますか? 「写真」だけがうまく機能するのはなぜですか?

私はAppleがアプリケーションのパスを取得するためにアプリケーション識別子を文書化から、方法がなければならないことを想像するだろうが、私は何も見つかりませんでした。それが成功したかどう

答えて

3

launchApplication:BOOLを返すことに注意してください。

あなたが起動しているアプリの本当に一定であるために、あなたも、あなたがcom.apple.AddressBookの連絡先のアプリケーションIDをプラグインすることができたにNSWorkspaceのURLForApplicationWithBundleIdentifier: APIを介してそれを見て試すことができます。アプリを開くための最善の方法は、ファイルのURLパスからである

- (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

結果を使用すると、経由でアプリの明示的な場所を呼び出すことができます。私は以下のように自分のアプリケーションのために同じことをやっています

NSString *appPathIs = Url.path; 

私は同じことを達成するためのあらゆる方法を試してみましたが、1つの文字列に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]; 
関連する問題