设备锁定/屏幕关闭时无法访问文档子文件夹中的某些文件
Some files in Documents subfolders cannot be access while device is locked / screen is off
设备锁定时无法访问文档子文件夹中的部分文件。
AVAudioFile(forReading: currentPlaylistURLs[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)}
有人遇到过吗?
您需要将文件的文件保护密钥权限设置为 .none
及其父文件夹:
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) }
}
let fileURL = URL.init(...)
if let parentDirectory = fileURL.parentDirectory {
do {
try parentDirectory.disableFileProtection()
try fileURL.disableFileProtection()
}
catch { print(error) }
}
设备锁定时无法访问文档子文件夹中的部分文件。
AVAudioFile(forReading: currentPlaylistURLs[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)}
有人遇到过吗?
您需要将文件的文件保护密钥权限设置为 .none
及其父文件夹:
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) }
}
let fileURL = URL.init(...)
if let parentDirectory = fileURL.parentDirectory {
do {
try parentDirectory.disableFileProtection()
try fileURL.disableFileProtection()
}
catch { print(error) }
}