Swift 打开另一个Mac应用程序

Swift 打开另一个Mac应用程序,swift,xcode,macos,swift3,external,Swift,Xcode,Macos,Swift3,External,在我的应用程序中,我想打开另一个安装在用户Mac上的应用程序(如iPhoto)。我不确定我应该在文档中查找什么。这叫什么?我该怎么做? 谢谢有不同的方法可以做到这一点。最有效的方法是使用fWork和execve-请参见manvWork和manexecve 效率较低但更灵活的是使用系统库调用。它实际上是运行一个类似于shell的bash,然后将您提供的字符串传递给bash。因此,您可以设置管道、重定向等 或者你可以向Finder发送一个Apple事件:“告诉Finder打开iPhoto” 在前两种

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

有不同的方法可以做到这一点。最有效的方法是使用fWork和execve-请参见
manvWork
manexecve

效率较低但更灵活的是使用
系统
库调用。它实际上是运行一个类似于shell的bash,然后将您提供的字符串传递给bash。因此,您可以设置管道、重定向等

或者你可以向Finder发送一个Apple事件:“告诉Finder打开iPhoto”

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

在终端的命令行中尝试上述操作:

$ /Applications/iPhoto.app/Contents/MacOS/iPhoto

您将看到iPhoto应用程序的发布。

您可以使用Swift/Cocoa编写的NSWorkspace类


让task=NSTask.launchedTaskWithLaunchPath(,参数:)
可能会执行您想要的操作

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()
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)
我支持vookimedlo的回答-不幸的是,我还不能评论(愚蠢的声誉限制),所以我将此作为额外的答案发布

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

当您尝试将助手(“启动器”)添加为登录项时,您会特别感兴趣。请参阅以下内容并记住我的评论:

(Tibor Bödecs的伟大文章)


顺便说一句,至于vookimedlo的代码:根据我的经验,您不需要使用
[path]
指定
OpenContext.arguments
,只需传递一个默认的
NSWorkspace.OpenContext()

谢谢托马斯!例如,如果您想启动Unity的唯一实例,可以使用:let=Process.launchdProcess(launchPath:“/Applications/Unity/Unity.app/Contents/MacOS/Unity”,参数:[“-na”]),这样可以节省我数小时的故障排除时间。非常感谢你!