2017-02-21 63 views
1

我一直在玩弄NSWorkspace。以编程方式启动应用程序

  • [NSWorkspace sharedWorkspace] launchApplication:@ “照片”]的作品

  • [NSWorkspace sharedWorkspace] launchApplication:@ “联系人”]不工作

  • [NSWorkspace sharedWorkspace] launchApplication:@“/ Applications/Contacts.app”]作品

(Mac OS S ierra)

所以,我想知道是否有任何安全的方法来找到“真正的”应用程序路径。也许联系人应用程序在系统的不同本地化中有不同的名称?为什么只是“照片”工作正常?

我会想象应该有一种方法,从苹果公司记录的应用程序标识符获取应用程序路径,但我什么也没找到。

回答

3

请记住launchApplication:如果成功或不成功,将返回BOOL

要真正确定您正在启动的应用程序,您还可以尝试通过NSWorkspace的URLForApplicationWithBundleIdentifier: API查找它,您可以在其中插入Contact的应用程序ID com.apple.AddressBook

有了结果,您可以通过调用该应用程序的明确定位:

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

+0

谢谢。这看起来像我在找什么。但是,你如何确定捆绑标识符 - 甚至可以确保它在时间上保持不变。我在APple的文档中找不到列表(尽管您可以在Internet上找到列表)。 –

+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]; 
相关问题