在我的应用中,我想打开另一个安装在用户Mac上的应用(例如iPhoto)。我不确定在文档中我应该寻找什么。这叫什么,我应该怎么做? 谢谢
答案 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)
您可以使用Swift / Cocoa编写的NSWorkspace类。
答案 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 vfork
和man 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}} ...