打开另一台Mac应用

时间:2014-12-16 12:47:20

标签: swift xcode macos swift3 external

在我的应用中,我想打开另一个安装在用户Mac上的应用(例如iPhoto)。我不确定在文档中我应该寻找什么。这叫什么,我应该怎么做? 谢谢

6 个答案:

答案 0 :(得分:15)

Xcode 8.3.2•Swift 3.1

import Cocoa

func openPhotos() {
    NSWorkspace.shared().open(URL(fileURLWithPath: "/Applications/Photos.app"))
}

openPhotos()

或者在方法中使用带有app name参数的launchApplication:

import Cocoa

func openApp(_ named: String) -> Bool {
    return NSWorkspace.shared().launchApplication(named)
}

// Usage

if openApp("Photos") {
    print(true)
}

// Or

print(openApp("Photos") ? true : false)

Swift 4及更高版本

使用NSWorkspace.shared代替NSWorkspace.shared()

答案 1 :(得分:5)

答案 2 :(得分:3)

let task = NSTask.launchedTaskWithLaunchPath(<#path: String#>, arguments: <#[AnyObject]#>)可能会做你想做的事情

答案 3 :(得分:2)

XCode 11•MacOS Catalina 10.15•Swift 5

NSWorkspace.shared.launchApplication 已过时,从MacOS 10.15开始,应使用新功能 NSWorkspace.shared.openApplication


示例-通过其包ID打开终端应用程序

guard let url = NSWorkspace.shared.urlForApplication(withBundleIdentifier: "com.apple.Terminal") else { return }

let path = "/bin"
let configuration = NSWorkspace.OpenConfiguration()
configuration.arguments = [path]
NSWorkspace.shared.openApplication(at: url,
                                   configuration: configuration,
                                   completionHandler: nil)

示例-通过其路径打开终端应用程序

let url = NSURL(fileURLWithPath: "/System/Applications/Utilities/Terminal.app", isDirectory: true) as URL

let path = "/bin"
let configuration = NSWorkspace.OpenConfiguration()
configuration.arguments = [path]
NSWorkspace.shared.openApplication(at: url,
                                   configuration: configuration,
                                   completionHandler: nil)

答案 4 :(得分:0)

有不同的方法可以做到这一点。效率最高的是使用fvork和execve - 请参阅man vforkman execve

效率较低但更灵活的是使用system库调用。实际上做的是运行shell - 就像bash - 然后将你提供的字符串传递给bash。所以你可以设置管道,重定向等。

或者您可以向Finder发送Apple事件:&#34;告诉Finder打开iPhoto&#34;。

在前两种情况下,您希望在包中启动可执行文件,即/Applications/iPhoto.app/Contents/MacOS/iPhoto

在终端:

中从命令行尝试以上操作
$ /Applications/iPhoto.app/Contents/MacOS/iPhoto

您将看到iPhoto App的发布。

答案 5 :(得分:0)

我以 vookimedlo 位列第二-不幸的是,我还不能发表评论(声望限制),所以我将其发布为额外答案。

这只是一个警告,可能不会影响太多:launchApplication()接受可执行文件的路径(例如“ MyApp.app/Contents/MacOS/MyApp”)时,这将导致错误(缺少特权)与openApplication(::)。您必须改为提供应用程序捆绑包(“ MyApp.app”)的路径。

当您尝试创建一个帮助程序(“启动程序”)以添加为登录项时特别感兴趣。请参阅以下内容,并牢记我的评论:

https://theswiftdev.com/2017/10/27/how-to-launch-a-macos-app-at-login/ (TiborBödecs的出色文章)

顺便说一句,关于 vookimedlo 的代码:根据我的经验,您无需将OpenContext.arguments[path]指定,您只需传递默认的{ {1}} ...