Pertama-tama, kesalahan ini hanya terjadi pada rilis 12.4 terbaru di iOS. Masalah TIDAK terjadi di simulator dan harus dijalankan di perangkat. Masalahnya adalah panggilan untuk merekam pada AVAudioRecorder kembali salah setelah aplikasi masuk ke latar belakang. Di semua versi iOS sebelumnya, ini tidak akan terjadi. Info.plist diperbarui dengan tag NSMicrophoneUsageDescription, dan kemampuan untuk aplikasi menyertakan mode latar belakang Audio.

Saya telah menulis ViewController kecil yang menunjukkan masalah tersebut. Langkah-langkah untuk membuat ulang:

1) Update the info.plist file with the NSMicrophoneUsageDescription tag so that the app gets permission to use the microphone 2) Update the app capabilities to set Audio background mode 3) Run the application 4) Send the application to the background 5) The current recording will finish, but the call to start a new recording will fail.


class ViewController: UIViewController, AVAudioRecorderDelegate {
   var recordLabel: UILabel!
   var recordingSession: AVAudioSession!
   var audioRecorder: AVAudioRecorder!
   var count: Int = 0

   override func viewDidLoad() {
       super.viewDidLoad()

       recordingSession = AVAudioSession.sharedInstance()

       do {
           try recordingSession.setCategory(.playAndRecord, mode: .default)
           try recordingSession.setActive(true)
           recordingSession.requestRecordPermission() { [unowned self] allowed in
               DispatchQueue.main.async {
                   if allowed {
                       self.loadRecordingUI()
                   } else {
                       print("No permissions!!!")
                   }
               }
           }
       } catch {
           print("Exception in viewDidLoad!!!")
       }
   }

   func loadRecordingUI() {
       super.viewDidLoad()

       recordLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 21))
       recordLabel.center = CGPoint(x: 160, y: 285)
       recordLabel.textAlignment = .center
       recordLabel.text = "Waiting...."
       self.view.addSubview(recordLabel)

       setupRecorder()
       startRecording();
   }

   func setupRecorder() {
       let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")

       let settings = [
           AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
           AVSampleRateKey: 12000,
           AVNumberOfChannelsKey: 1,
           AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
       ]

       do {
           audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
           audioRecorder.delegate = self
       } catch {
           print("Exception thrown in setupRecorder")
       }
   }

   func startRecording() {
       count += 1

       let ret = audioRecorder.record(forDuration: 10)  //record for 10 seonds

       let txt = "Record returned " + ret.description + " for #\(count)"
       recordLabel.text = txt
       print(txt)
   }

   func getDocumentsDirectory() -> URL {
       let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
       return paths[0]
   }

   func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
       startRecording()  //immediately start recording again
   }
}

Karena kemampuan aplikasi untuk merekam di latar belakang telah disetel, saya berharap panggilan untuk merekam pada AVAudioRecorder mengembalikan true

10
JeffP 5 Agustus 2019, 19:47

1 menjawab

Jawaban Terbaik

Saya mengajukan umpan balik ke Apple tentang ini (audioRecorder.record() mengembalikan false saat di latar belakang) dan mendapat jawaban bahwa itu adalah pembatasan perlindungan privasi baru, yaitu mereka tidak akan memperbaikinya.

"Perilaku yang disebutkan adalah perubahan tetapi merupakan perilaku yang benar ke depan, mencoba memulai perekaman audio di latar belakang yang belum pernah direkam sebelumnya (dan kemudian terganggu oleh panggilan atau Siri) tidak akan berfungsi (pada dasarnya mencoba memulai perekaman dari latar belakang secara acak tidak akan berfungsi lagi). Ini adalah pembatasan perlindungan privasi baru yang diperkenalkan di 12.4."

0
Elin 26 September 2019, 14:53