Как загрузить файлы AVAudioRecorder в хранилище Firebase с помощью Swift 5 / SwiftUI?

Привет, я знаю, что об этом спрашивали несколько раз, но мне нужна помощь с загрузкой голосовых записей пользователей в Firebase. Когда пользователь записывает свой звук в приложении и нажимает кнопку остановки, я хочу, чтобы запись была загружена и сохранена в Firebase, а не на телефоне пользователя.

Вот функция для записи

func startRecording() {
    
    let recordingSession = AVAudioSession.sharedInstance()
    
    do {
        try recordingSession.setCategory(.playAndRecord, mode: .default)
        try recordingSession.setActive(true)
    } catch {
        print("Failed to set up recording session")
    }
    let documentPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let audioFilename = documentPath.appendingPathComponent("\(Date().toString(dateFormat: "dd-MM-YY_'at'_HH:mm:ss")).m4a")
    let settings = [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 12000,
        AVNumberOfChannelsKey: 1,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ]
    
    do {
        audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
        audioRecorder.record()
        
        recording = true
    } catch {
        print("Could not start recording")
    }
}

Вот функция, когда пользователь прекращает запись

func saveRecording() {
    
    let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
       let directoryContents = try! FileManager.default.contentsOfDirectory(at: path, includingPropertiesForKeys: nil)

       for i in directoryContents {
        user.answersSent.append(CardModel(fullname: question.fullname, username: question.username, imageURL: question.imageURL, question: question.question, fileURL: i, createdAt: getCreationDate(for: i), colorChoice: question.colorChoice))
       }
   
      
            
            user.answersSent.sort(by: { $0.createdAt?.compare($1.createdAt!) == .orderedDescending})
           
            
        
        }
    }
    

Большое спасибо за то, что уделили время чтению. Я потратил почти два дня, пытаясь понять это.


person Jac Mulder    schedule 18.04.2021    source источник
comment
Вы спрашиваете, как загрузить файл в хранилище Firebase, но не включаете код Firebase. В целом картина такова, что во время записи «файл» либо записывается в память, либо на диск. Когда пользователь нажимает кнопку «Остановить», вы хотите загрузить этот файл из памяти или с диска в хранилище. Это довольно хорошо описано в Загрузка файлов Руководства по началу работы с Firebase. Так в чем же вопрос? У вас есть проблемы с кодом Firebase?   -  person Jay    schedule 19.04.2021


Ответы (1)


  1. Вместо того, чтобы позволить вашему URL немедленно выйти за пределы области видимости, сохраните его в свойстве любого класса, в котором выполняются эти функции (если вы делаете это в View, переместите всю логику записи в ObservableObject).

  2. В конце записи, теперь, когда у вас есть URL-адрес, вам не нужно будет выполнять createdAt сортировку, которую, как я предполагаю, вы делаете, чтобы получить самый последний файл (на данный момент мне это немного непонятно) .

  3. Загрузите локальный файл, используя метод, описанный в документации Firebase (https://firebase.google.com/docs/storage/ios/upload-files#upload_from_a_local_file):

// File located on disk
// Create a reference to the file you want to upload
let audioFileRef = storageRef.child("audioFiles/audioFile.m4a") //adjust this to have a unique name

let uploadTask = audioFileRef.putFile(from: localAudioURL, metadata: nil) { metadata, error in
  guard let metadata = metadata else {
    // Uh-oh, an error occurred!
    return
  }
  //optionally, delete original local file here
}
  1. При желании удалите локальный файл после завершения загрузки. Кроме того, вы можете использовать временный каталог, а не каталог документов, для хранения исходной записи в первую очередь.
person jnpdx    schedule 19.04.2021