我正在构建一个iOS应用程序,该应用程序需要偶尔访问设备的“文档和下载”文件夹。为此,我使用“startAccessiningSecurityScopedResource()“方法。我必须在Xcode中启用”应用沙盒“权限才能工作。这样做之后,应用在iOS模拟器中运行完美,但它不能再安装到我的物理测试iPad上。我已经在开发者门户中创建了预配配置文件,但当我尝试将它们添加到设备和模拟器下时,它说无法安装一个或多个配置文件到设备。我可以通过关闭自动管理签名来强制它静止,但它要么告诉我找不到应用程序沙盒和文档读/写的权限(创建配置文件时不会显示这些内容)或者,它让我构建,但随后弹出一个窗口,提示无法安装,在调试中,它说没有找到这个可执行文件的有效配置文件。有人知道发生了什么吗?
我试过从开发者控制台和电脑/ iPad中删除所有预置配置文件,然后重新安装它们。
下面是我的UIDocumentPicker代码:
didPickDocumentsAt urls: [URL])
{
let fileManager = FileManager.default
let songsFolderURL = fileManager.documentDirectory().appendingPathComponent("Songs", isDirectory: true)
// Start accessing secured resources
guard songsFolderURL.startAccessingSecurityScopedResource() else {
print("Song Folder Access Issue")
return}
// If Songs folder doesn't exist in the app's documents, try to create it
if !fileManager.fileExists(atPath: songsFolderURL.path)
{
do
{
try fileManager.createDirectory(at: songsFolderURL, withIntermediateDirectories: true, attributes: nil)
} catch {
print("Error creating song folder: \(error)")
}
}
// Stop accessing secured resources
defer {songsFolderURL.stopAccessingSecurityScopedResource() }
// For each selected song...
for song in urls {
do {
// Access secured resource
guard song.startAccessingSecurityScopedResource() else {
print("Song Access Issue")
return}
// Copy song from source location to app's documents/songs folder
try fileManager.copyItem(at: song, to: songsFolderURL.appendingPathComponent(song.lastPathComponent))
// Create CoreData song object to be saved to core data
let _song = Songs(context: PersistenceController.shared.container.viewContext)
_song.name = song.lastPathComponent
// Stop accessed secured resources
defer {song.stopAccessingSecurityScopedResource() }
// Save song data to coredata
PersistenceController.shared.save()
} catch {
print("Error copying file: \(error)")
}
}
} ````
1条答案
按热度按时间6g8kf2rb1#
在iOS上,您不需要沙盒权限,这仅适用于macOS应用。
您无需将
startAccessingSecurityScopedResource
用于应用自己的documents文件夹-它位于应用的沙盒中。此外,您获取此文件夹URL的方式不适用于iOS。您应该使用类似
您确实需要使用
startAccessingSecurityScopedResource
作为传递给您的delegate方法的url-这些是用户选择的沙箱之外的文件的URL。