如何在Swift中从字符串路径访问安全作用域资源



我目前正在使用flutter将有效文件路径的String传递给Swift,以便访问安全范围的资源(这部分可能不相关(

所以我有一个函数,它接受String,如下所示:

public func requestAccessToFile(filePath: String) -> Bool {
let fileUrl = URL(fileURLWithPath: filePath)
return fileUrl.startAccessingSecurityScopedResource()
}

我知道startAccessingSecurityScopedResource并不总是返回true,但在这种情况下,它应该返回,因为如果我试图在没有返回true的情况下访问文件,我会得到权限错误。

更多的上下文:如果我从文件选择器中获得URL后立即尝试调用startAccessingSecurityScopedResource,它确实成功了,但如果我用函数调用它,它就会失败(请注意,该函数是用String调用的,并且我正在传递一个没有file://协议的路径。例如"/private/var/mobile/Library/MobileDocuments.com/apple~CloudDocs/Documents/afile.pdf;

所以我的猜测是,文件选择器创建的URL在某种程度上与我使用字符串路径创建的URL不同。但不确定。

感谢您提前提供的帮助。

UIDocumentPickerViewController提供了一个安全范围的URL来访问资源,并且不可能通过字符串路径进行访问:

如果您需要安全范围的URL的路径作为字符串值(由路径方法提供(,例如提供给需要字符串值的API,请根据需要从URL获取路径。但是,请注意,从安全范围的URL获得的基于字符串的路径没有安全范围,您不能使用该字符串来获得对安全范围的资源的访问权限。https://developer.apple.com/documentation/foundation/nsurl

如果你需要在代码中保存或共享安全资源的位置,你应该使用书签:

// Get bookmark data from the provided URL
let bookmarkData = try? pickedURL.bookmarkData()
if let data = bookmarkData {
// Save data
...
}
...
// Access to an external document by the bookmark data
if let data = bookmarkData {
var stale = false
if let url = try? URL(resolvingBookmarkData: data, bookmarkDataIsStale: &stale),
stale == false,
url.startAccessingSecurityScopedResource()
{
var error: NSError?
NSFileCoordinator().coordinate(readingItemAt: url, error: &error) { readURL in
if let data = try? Data(contentsOf: readURL) {
...
}
}

url.stopAccessingSecurityScopedResource()
}
}