Swift 打开另一个Mac应用程序
在我的应用程序中,我想打开另一个安装在用户Mac上的应用程序(如iPhoto)。我不确定我应该在文档中查找什么。这叫什么?我该怎么做?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” 在前两种
谢谢有不同的方法可以做到这一点。最有效的方法是使用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”]),这样可以节省我数小时的故障排除时间。非常感谢你!