swift 如何为多个/多个文件/目录打开单个“获取信息窗口”?

wlzqhblo  于 2023-05-16  发布在  Swift
关注(0)|答案(2)|浏览(110)

我有一个代码:

func openGetInfoWnd(for urls: [URL]) {
    let pBoard = NSPasteboard(name: NSPasteboard.Name(rawValue: "pasteBoard_\(UUID().uuidString )") )
    
    pBoard.writeObjects(urls as [NSPasteboardWriting])
    
    NSPerformService("Finder/Show Info", pBoard)
}

此代码打开Finder的“获取信息”的多个窗口
就像它显示在Cmd + I热键
我如何打开一个窗口(“显示检查器”/“获取信息”/“多个项目信息”)多个本地网址?
喜欢它显示在Cmd + Option +我按Finder

PS:代码:NSPerformService("Finder/Show Inspector", pBoard) ofc不工作:)

neekobn8

neekobn81#

尝试了很多方法,你是对的,NSPerformService是非常有限的,不能实现它。我也试了Apple Script's approach

tell application "Finder" to open information window of file aFile

但这只适用于单个文件,在Finder中没有打开“多信息窗口”的东西。
幸运的是,您的键盘快捷键提醒我,我可以模拟文件选择和键盘按键事件
所以我相信下面的苹果脚本可以帮助你:

set fileList to {POSIX file "/Users/0x67/Downloads/new.html", POSIX file "/Users/0x67/Pictures/tt/00003-771884301.png"}

tell application "Finder"
    activate
    set selection to fileList
    tell application "System Events"
        keystroke "i" using {command down, option down}
    end tell
end tell

我认为你可以在Swift中调用这个创建这个苹果脚本并调用它。
以下是call it in swift的有用链接:

uxh89sit

uxh89sit2#

NSAppleScriptErrorNumber: -600是一个沙盒问题,修复它(在Xcode 14.3中测试):
1.进入**[您的项目] > [您的目标] >签署和功能**。
1.删除应用沙盒
1.在Hardened Runtime下(如果需要,请先单击+ Capability添加功能),勾选“Apple Events”。
1.将NSAppleEventsUsageDescription添加到您的Info.plist
用@kakaiikaka的回答

func openGetInfoWnd(for urls: [URL]) {
    let fileList = urls.map { "POSIX file \"\($0.absoluteString)\"" }
    let source = """
set fileList to {\(fileList.joined(separator: ", "))}
tell application "Finder"
    activate
    set selection to fileList
    tell application "System Events"
        keystroke "i" using {command down, option down}
    end tell
end tell
"""
    let appleScript = NSAppleScript(source: source)!
    var error: NSDictionary?
    appleScript.executeAndReturnError(&error)
    
    // ...
}

重新构建您的应用程序(干净的构建+运行),它现在应该要求权限发送击键到Finder。您可能会看到这些弹出窗口:

  • 请求访问目录的权限(调用函数的url)。
  • 请求控制“Finder”和“System Events”的权限(单独的弹出窗口,带有您为键NSAppleEventsUsageDescription指定的消息)。
  • 请求访问辅助功能(您必须进入系统设置>隐私和安全>辅助功能才能授予访问权限)。

现在一切都应该工作!:)
P.S.如果你收到一条消息说 “这个方法不应该在主线程上调用,因为它可能会导致UI无响应。",只要这样做:

DispatchQueue(label: "AppleScript").async {
    // execute the applescript here instead...
}

(you如果需要,也可以设置qos = .background,但两种方式都应该有效)

相关问题