Как получить доступ к папке "tools" на рабочем столе через Filemanager в SwiftUI MAC OS для загрузки mp3 файла в audioPlayer?
Если mp3 файл добавить в проект, то все работает. Есть задача получить доступ к определенной папке, где будет порядка 10 mp3 файлов. Функция получает название файла и подгружает его в плеер.
func playSound(soundName: String) {
guard let url = Bundle.main.path(forResource: soundName, ofType: "mp3") else { return }
audioPlayer = try? AVAudioPlayer(contentsOf: URL(fileURLWithPath: url))
audioPlayer.play()
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + 0.5) {
audioPlayer?.play()
}
}
Я пробовал много вариантов, но получить путь к папке на рабочем столе не получается. Все пути при изменении в urls .documentDirectory .musicDirectory .userDirectory и других параметров ведут в проект.
func playSound2(soundName: String) {
let manager = FileManager.default
let urls = manager.urls(for: .documentDirectory, in: .userDomainMask)
if let url = urls.first {
var fileURL = url.appendingPathComponent(soundName)
fileURL = fileURL.appendingPathExtension("mp3")
audioPlayer = try? AVAudioPlayer(contentsOf: fileURL)
audioPlayer.play()
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + 0.5) {
audioPlayer?.play()
}
}
}
Ответы (1 шт):
Попробуйте удалить секцию App Sandbox на вкладке Signing & Capabilities в настройках таргета, по умолчанию приложение имеет доступ только к папкам внутри отдельной песочницы, при первом доступе к рабочему столу (попытке проиграть файл оттуда) у вас будет запрошено разрешение для доступа, вот пример проигрывания файла test.mp3 с рабочего стола
import SwiftUI
import AVFoundation
struct ContentView: View {
@State var audioPlayer: AVAudioPlayer?
var body: some View {
Button("Play") {
playSoundFromDesktop(soundName: "test.mp3")
}
}
func playSoundFromDesktop(soundName: String) {
do {
guard let filePath = NSURL(fileURLWithPath: NSString("~/Desktop/").expandingTildeInPath)
.appendingPathComponent(soundName) else { return }
audioPlayer = try AVAudioPlayer(contentsOf: filePath)
audioPlayer?.prepareToPlay()
audioPlayer?.play()
} catch {
print(error)
}
}
}