通过使用“Security-Scoped Bookmarks”来授权访问用户主目录。代码示例如下:
// 1. 请求授权
let openPanel = NSOpenPanel()
openPanel.canChooseDirectories = true
openPanel.canCreateDirectories = false
openPanel.canChooseFiles = false
openPanel.allowsMultipleSelection = false
openPanel.directoryURL = URL(fileURLWithPath: NSHomeDirectory())
openPanel.begin { (result) -> Void in
if result.rawValue == NSFileHandlingPanelOKButton {
guard let url = openPanel.url else { return }
do {
let bookmarkData = try url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil, relativeTo: nil)
UserDefaults.standard.set(bookmarkData, forKey: "BookmarkData")
UserDefaults.standard.synchronize()
// 2. 利用授权访问
if let bookmarkData = UserDefaults.standard.object(forKey: "BookmarkData") as? Data {
var isStale = false
let url = try URL(resolvingBookmarkData: bookmarkData, options: .withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale)
if isStale {
print("Bookmark is stale")
}
let keys = Set([.nameKey, .isDirectoryKey])
let fileList = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: Array(keys), options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
print(fileList)
}
} catch {
print("Bookmark not created!")
}
}
}
这段代码允许用户选择主文件夹,并创建一个开发者权限的 bookmarkData,用于后续的读写操作。在以后的会话中,我们可以使用 bookmarkData 来维持对主文件夹的持续访问权限。