在 Swift 4.0 和 Xcode 9.0 中获取用户桌面路径

Get user desktop path in Swift 4.0 and Xcode 9.0

我试图获取当前用户桌面的路径,但我得到了库中另一个位置的路径(参见代码)。

Playgrounds 中的相同代码给出了正确答案。 我在早期创建的 Xcode 项目版本中使用了相同的代码,结果也很好。

测试是在 MacOS High Sierra、Xcode 版本 9.0 (9A235) 和 Swift 4.0 下完成的。

这里是使用的代码:

public func userDesktop() -> String {
  let paths = NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true)
  let userDesktopDirectory = paths[0]
  return userDesktopDirectory
}

let myPath:String = userDesktop() + "/"
print(myPath)

let userDesktopDirectory:String = NSHomeDirectory() + "/" + "Desktop/"
print(userDesktopDirectory)

/* results in Playground */
/Users/kader/Desktop/
/Users/kader/Desktop/

/* Results from a project in Xcode 9.0 */
/Users/kader/Library/Containers/com.kader.testuserpath/Data/Desktop/
/Users/kader/Library/Containers/com.kader.testuserpath/Data/Desktop/

这段代码有什么问题或者是错误?

我很好奇是否有更多人遇到同样的问题。

我注意到 Xcode 9 中的 Cocoa 应用程序模板默认打开 App Sandbox。启用此模式后,应用程序只能访问自己容器内的文件,就像 iOS 个应用程序一样。您可以在项目设置的“功能”选项卡中将其关闭。来自 Apple's documentation 的屏幕截图:

What your app can do inside a sandbox。如果您这样做是为了好玩,不想通过 Mac App Store 分发它,或者想要一个传统意义上的 "computer application",请完全关闭 sanboxing。这一直是 Mac App Store 的痛点,也是许多开发者离开应用商店的原因。

试试这个 Swift 4.0

var desktopPath = (NSSearchPathForDirectoriesInDomains(.desktopDirectory, .userDomainMask, true) as [String]).first