Ios 如何从Swift中的字符串路径访问安全范围的资源?

Ios 如何从Swift中的字符串路径访问安全范围的资源?,ios,swift,iphone,flutter,Ios,Swift,Iphone,Flutter,我目前正在使用flatter将有效文件路径的字符串传递给Swift,以便访问安全范围的资源(此部分可能不相关) 所以我有一个函数,它接受一个字符串,如下所示: public func requestAccessToFile(filePath: String) -> Bool { let fileUrl = URL(fileURLWithPath: filePath) return fileUrl.startAccessingSecurityScopedResource() } 我

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

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

public func requestAccessToFile(filePath: String) -> Bool {
  let fileUrl = URL(fileURLWithPath: filePath)
  return fileUrl.startAccessingSecurityScopedResource()
}
我知道
startAccessingSecurityScopedResource
并不总是返回
true
,但在这种情况下,它应该会返回,因为如果我尝试在不返回
true
的情况下访问文件,我会得到权限错误

更详细一点的上下文:如果我尝试在从文件选择器获得URL后立即调用
startAccessingSecurityScopedResource
,它会成功,但是如果我使用函数调用它,它会失败(请注意,函数是用
字符串调用的,我传递的路径没有
文件://
协议。例如。“/private/var/mobile/Library/mobile Documents/com~apple~CloudDocs/Documents/afile.pdf”

所以我猜,文件选择器创建的URL与我用字符串路径创建的URL有些不同,但不确定


提前感谢您的帮助。

UIDocumentPickServiceWController
提供了一个安全范围的URL来访问资源,无法从字符串路径进行访问:

如果需要安全范围的URL路径作为字符串值(由path方法提供),例如,要提供给需要字符串值的API,请根据需要从URL获取路径。但是,请注意,从安全作用域URL获取的基于字符串的路径没有安全作用域,您不能使用该字符串获取对安全作用域资源的访问

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

//从提供的URL获取书签数据
让bookmarkData=try?pickedURL.bookmarkData()
如果let data=bookmarkData{
//保存数据
...
}
...
//通过书签数据访问外部文档
如果let data=bookmarkData{
var stale=false
如果让url=try?url(resolvingBookmarkData:data,bookmarkDataIsStale:&stale),
陈旧==错误,
url.startAccessingSecurityScopedResource()
{
var错误:N错误?
NSFileCoordinator().coordinate(readingItemAt:url,error:&error){readURL in
如果let data=try?data(contentsOf:readURL){
...
}
}
url.stopAccessingSecurityScopedResource()的
}
}

Ahh,一个额外的注释,它在emulator上工作,只在物理设备上失败。谢谢!今天将检查书签部分。