Swift 设备锁定/屏幕关闭时,无法访问文档子文件夹中的某些文件

Swift 设备锁定/屏幕关闭时,无法访问文档子文件夹中的某些文件,swift,core-audio,ios13,Swift,Core Audio,Ios13,设备锁定时,无法访问文档子文件夹中的某些文件 AVAudioFile(用于阅读:CurrentPlayURL[index!]) 当设备被锁定或屏幕关闭且URL指向Documents文件夹中某个子文件夹中的某个文件时,上述行将引发错误。并非所有子文件夹都会导致错误(为什么??)。当设备解锁时,没有错误。我在iOS 13.2.3中注意到了这种行为,所以在这个版本之前它运行良好 错误为: [AVAudioFile.mm:134:AVAudioFileImpl: (ExtAudioFileOpenURL

设备锁定时,无法访问文档子文件夹中的某些文件

AVAudioFile(用于阅读:CurrentPlayURL[index!])

当设备被锁定或屏幕关闭且URL指向Documents文件夹中某个子文件夹中的某个文件时,上述行将引发错误。并非所有子文件夹都会导致错误(为什么??)。当设备解锁时,没有错误。我在iOS 13.2.3中注意到了这种行为,所以在这个版本之前它运行良好

错误为:

[AVAudioFile.mm:134:AVAudioFileImpl: (ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)): error -54
Error Domain=com.apple.coreaudio.avfaudio Code=-54 "(null)" UserInfo={failed call=ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)}

有人遇到过这种情况吗?

您需要将文件的文件保护密钥权限设置为
。无
及其父文件夹:

extension URL {
    var parentDirectory: URL? { try? resourceValues(forKeys: [.parentDirectoryURLKey]).parentDirectory }
    var fileProtection: URLFileProtection? { try? resourceValues(forKeys: [.fileProtectionKey]).fileProtection }
    func disableFileProtection() throws { try (self as NSURL).setResourceValue(URLFileProtection.none, forKey: .fileProtectionKey) }
}


尝试在没有保护的情况下写入文件
write(to:fileURL,options:.noProtection)
@LeoDabus应用程序不写入文件。文件通过空投传输,使用文件应用程序打开,然后保存到应用程序的文档子文件夹中。子文件夹是在保存时从文件应用程序创建的。若要更改现有文件的数据保护级别,请使用NSURL的setResourceValue(U2;:forKey:)方法。调用此方法时,将新的数据保护选项分配给fileProtectionKey资源密钥。清单2显示了一个将该键添加到现有文件中的示例。@LeoDabus根据您的建议,我在初始化AVAudioFile之前将其设置为.none,但在同一行上仍然出现相同的错误。@LeoDabus更改文件权限似乎是解决问题的正确方法。奇怪的是,在实例化AVAudioFile之前设置文件权限还不够快。每当列表更新时,循环遍历该列表似乎已修复此错误。当一个新文件添加到列表中时,我还必须为单个文件设置权限。如果你想,你可以添加一个答案,我会标记它。我将尝试设置目录权限,而不是遍历所有文件。谢谢你的帮助!
let fileURL = URL.init(...)
if let parentDirectory = fileURL.parentDirectory {
    do {
        try parentDirectory.disableFileProtection()
        try fileURL.disableFileProtection()
    }
    catch { print(error) }
}