Swift 4 macOS App - 如何找到重要的用户目录?
Posted
技术标签:
【中文标题】Swift 4 macOS App - 如何找到重要的用户目录?【英文标题】:Swift 4 macOS App - How to find the important users directories? 【发布时间】:2018-04-10 09:41:30 【问题描述】:使用 Swift 4 让 macOS 应用程序找到重要的用户目录(例如:桌面、文档、下载等)最简单的方法是什么?
【问题讨论】:
【参考方案1】:TLDR:
let desktopDir = try? FileManager.default.url(for: .desktopDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let documentDir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let downloadsDir = try? FileManager.default.url(for: .downloadsDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
有两种方法可以获取此信息,均来自FileManager
类:
这个:
func urls(for directory: FileManager.SearchPathDirectory,
in domainMask: FileManager.SearchPathDomainMask) -> [URL]
返回请求域中指定公共目录的 URL 数组。 […] 目录按照域掩码常量的顺序排列,用户域中的项目在前,系统域中的项目在后。
文档:https://developer.apple.com/documentation/foundation/filemanager/1407726-urls
(已经在@leo-dabus 的回答中提到)
还有这个:
(我更喜欢它,因为它更通用并返回单个 URL)
func url(for directory: FileManager.SearchPathDirectory,
in domain: FileManager.SearchPathDomainMask,
appropriateFor url: URL?,
create shouldCreate: Bool) throws -> URL
在域中查找并选择性地创建指定的公共目录。
文档:https://developer.apple.com/documentation/foundation/filemanager/1407693-url
对于任何一个:
https://developer.apple.com/documentation/foundation/filemanager.searchpathdomainmask 中定义的有效域是:
.userDomainMask
:用户的主目录——安装用户个人物品的地方(~)。
.localDomainMask
: 本地 当前机器——安装每个人都可以使用的项目的地方 这台机器。
.networkDomainMask
:在 局域网——安装网络上可用项目的地方 (/网络)。
.systemDomainMask
:Apple 提供——无法修改(/System)。
.allDomainsMask
:所有域。
directory
参数有很多可能性,在https://developer.apple.com/documentation/foundation/filemanager.searchpathdirectory 中定义:
.applicationDirectory
:支持的应用程序(/Applications)。
.demoApplicationDirectory
: 不支持的应用程序和演示 版本。
.developerApplicationDirectory
: 开发者应用 (/开发人员/应用程序)。
.adminApplicationDirectory
系统和 网络管理应用程序。
.libraryDirectory
: 各种 用户可见的文档、支持和配置文件 (/图书馆)。
.developerDirectory
:开发者资源(/Developer)。
.userDirectory
:用户主目录 (/Users)。
.documentationDirectory
:文档。
.documentDirectory
:文档目录。
.coreServiceDirectory
: 核心服务位置 (系统/库/核心服务)。
.autosavedInformationDirectory
: 用户自动保存文档的位置(库/自动保存信息)。
.desktopDirectory
: 用户桌面目录的位置。
.cachesDirectory
:可丢弃缓存文件的位置(库/缓存)。
.applicationSupportDirectory
: 应用程序支持文件的位置 (库/应用程序支持)。
.downloadsDirectory
: 位置 用户的下载目录。
.inputMethodsDirectory
: 位置 输入法(库/输入法)。
.moviesDirectory
: 位置 用户的电影目录 (~/Movies)。
.musicDirectory
: 位置 用户的音乐目录 (~/Music)。
.picturesDirectory
: 位置 用户的图片目录 (~/Pictures)。
.printerDescriptionDirectory
: 系统 PPDs 目录的位置 (库/打印机/PPD)。
.sharedPublicDirectory
: 用户的位置 公共共享目录 (~/Public)。
.preferencePanesDirectory
: 用于 System 的 PreferencePanes 目录的位置 首选项(库/PreferencePanes)。
.applicationScriptsDirectory
: 调用应用程序的用户脚本文件夹的位置 (~/Library/Application Scripts/),
.itemReplacementDirectory
: 传递给 FileManager 方法url(for:in:appropriateFor:create:)
为了创建一个临时 目录。
.allApplicationsDirectory
: 所有目录 可能会出现应用程序。
.allLibrariesDirectory
: 所有目录 哪里有资源。
.trashDirectory
: 垃圾箱的位置 目录。
【讨论】:
非常感谢!【参考方案2】:你可以使用 FileManager urls 方法
func urls(for directory: FileManager.SearchPathDirectory, in domainMask: FileManager.SearchPathDomainMask) -> [URL]
并传递FileManager.SearchPathDirectory
.desktopDirectory
、.documentDirectory
或.downloadsDirectory
作为用户域掩码并获取返回的第一个url:
let desktopDirectory = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let downloadsDirectory = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first!
【讨论】:
为什么这会返回 .documentDirectory 路径 file:///Users/username/Library/Containers/... 而不是路径 file:///Users/username/Documents/ ? Dawy,我也有这个。您很可能需要授予您的应用访问下载、电影等的权限。那里有Capabilities
选项卡和File Access
区域。查看那里的选项。
我现在正在努力解决这个问题 - 这是一个新问题,我之前已经在 Catalina 上成功构建过。目前,我的 Capabilities“文件访问”部分没有提到任何关于 Documents 的内容,并且我无法获取用户的主目录 Documents。非常令人沮丧。
啊哈!知道了。我不小心在我的应用程序的权利中打开了沙盒。
默认情况下,MacOS 应用程序是沙盒化的,这意味着除非用户明确访问,否则无法直接访问 Documents 文件夹。因此,如果您收到这种可爱类型的文档 URL:file:///Users/bioche/Library/Containers/com.bioche.UIApp/Data/Documents/pointFree/report.txt
,请检查权利文件中的 App Sandbox
属性是否设置为 NO以上是关于Swift 4 macOS App - 如何找到重要的用户目录?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode Swift MacOS App,将文件拖放到 NSTextField
iPad 上的 Swift Playgrounds,NSLog 在 macOS 上的“Console.app”上不显示任何消息