FileManager не может найти аудиофайл - PullRequest
0 голосов
/ 19 мая 2018

Helloo!Моя конечная цель - создать UITableViewController с записями, сделанными в приложении, используя FileManager, чтобы пройти по каталогу /Documents/ и перечислить все найденные там записи.

Запись и воспроизведение работают нормальнос одной записью, со следующей настройкой:

// In VC#1

 func setupRecorder(){
    let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch {
        print("Audio Setup Error: \(error)")
    }
    do {
        try audioSession.setActive(true)
    } catch {
        print("Audio Setup Error: \(error)")
    }

    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

    audioFileName = "test.caf"
    audioFileUrl = documentsDirectory.appendingPathComponent(audioFileName)

    print("\n\nrecording url :\(audioFileUrl.absoluteString)\n\n")

    let recordSettings = [
        AVFormatIDKey: Int(kAudioFormatAppleLossless),
        AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
        AVEncoderBitRateKey : 320000,
        AVNumberOfChannelsKey: 2,
        AVSampleRateKey : 44100.0
        ] as [String : Any]

    do {
        audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: recordSettings)
    } catch let error as NSError{
        print("Audio Setup Error: \(error)")
        audioRecorder = nil
    }
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
}

...



 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == GraphViewController.getEntrySegue() {
        let navController = segue.destination as! UINavigationController
        let destination = navController.topViewController as! GraphViewController
        destination.audioFileName = audioFileName
        destination.audioFileUrl = audioFileUrl
    }

// In VC#2
func setupAudioPlayer() {
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    } catch {
        print(error)
    }
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print(error)
    }
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: audioFileUrl)
    } catch {
        print("Audio Player Setup Error: \(error)")
    }
    audioPlayer.prepareToPlay()
}

Работает все отлично и денди;он воспроизводит записанный аудиофайл без каких-либо проблем.Однако, когда я пытаюсь найти файл через FileManager, FileManager не может его найти.Ниже перечислены мои попытки найти этот файл.

        print("\(FileManager.default.fileExists(atPath: audioFileUrl.absoluteString))") // -> False

        print("\(FileManager.default.contents(atPath: audioFileUrl.absoluteString))") // -> nil

Очевидно, я что-то упускаю ... особенно если учесть, что AVAudioPlayer успешно читает аудиофайл с точно таким же URL-адресом.Путь печатается как:

file:///var/mobile/Containers/Data/Application/1DA6BD0F-5A23-4228-92A9-A083E55ACE21/Documents/test.caf

Есть идеи?101

Огромное спасибо!

РЕДАКТИРОВАТЬ: Перед сохранением URL-адреса в качестве свойства я делал следующее, пересчитывая documentDirectory в VC # 2, однако также не былуспешно:

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = try? FileManager.default.contentsOfDirectory(atPath: documentsDirectory.absoluteString)

1 Ответ

0 голосов
/ 19 мая 2018

Невозможно сохранить URL-адрес изолированного файла или строку пути для последующего использования, поскольку песочница может перемещаться.Вам нужно сделать то, что вы делали раньше, успешно: рассчитать URL-адрес каталога документов, а затем изучить его.Вы должны полностью работать с URL-адресами и никогда не звонить absoluteString;это совершенно неправильный вызов, и он вас здесь подводит.

В этом примере я проверяю каталог документов на наличие любых файлов:

let documentsDirectory = 
    FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let results = 
    try? FileManager.default.contentsOfDirectory(at: documentsDirectory, 
                                                 includingPropertiesForKeys: nil)
...