是否可以在没有手动交互的情况下在本机应用程序中启动远程文件

问题描述

我们可以通过SMB协议访问远程文件

Finder 菜单 > 前往 > 连接到服务器。

例如:smb:///cifsshare/master.tif"

但是当我们推送命令时,我们最终只会打开封闭目录,而不是打开 tif 文件。现在,如果我需要打开 master.tif 文件,我需要双击并打开它。但是对于连接,我输入了文件的地址。

我正在尝试使用 safari 扩展程序来实现相同的功能

NSWorkspace。

if let url = URL(string: path) {
    if NSWorkspace.shared.open(url) {
       print("Url is opened")
    }
}

结果:相同:(

尝试使用 Process() 时

//1
let toolPath = "/usr/bin/open"
let arguments = [pathUrl.absoluteString]
     
//2
let task = Process()
task.launchPath = toolPath
task.arguments = arguments
     
task.launch()
task.waitUntilExit()

结果:不工作:(

在 macos 中甚至有可能吗? 任何如何实现这一目标的线索,都非常感谢。

解决方法

您可以分两步执行此操作:

  1. 将 SMB 共享挂载到本地挂载点
  2. 打开该挂载中的文件。
  3. 完成后卸载 SMB 共享。

我找不到以可预测的方式执行 #1 的方法。即,如果某些东西已经安装在 /Volumes/cifsshare,那么打开 smb:///cifsshare 会自动将它安装到一个新文件夹(/Volumes/cifsshare (1),如果我没记错的话),而不会给你反馈确切位置结束了。

乍一看,Finder 用于挂载 SMB 的 API 似乎位于 private frameworks 中,因此没有像 SMB.mount(smbURL,to: mountPoint) 这样的简单易用的 API。

您可以尝试使用 Process API 来调用 mount_smbfs(它只是 mount -t smbfs 的包装器)。您可以使用它来将您的 SMB 共享挂载到您自己选择的挂载点,例如 /Volumes/MyAppSMBShare 或其他。

从那里,您可以正常打开文件:

NSWorkspace.shared.open(URL(fileURLFromPath: "/Volumes/MyAppSMBShare/master.tif))