首页 > 解决方案 > AVAudioRecorder finishedRecording 崩溃

问题描述

我在用于录音的实时应用程序中随机崩溃。由于崩溃日志没有提供任何有用的信息,我无法找出崩溃的原因。

如何修复此崩溃?或者我该如何调试问题?我无法在开发模式下重现它。任何帮助/指针将不胜感激。

以下是 crashlytics 日志

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x000000000000001c

Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x18fb5bd10 objc_opt_respondsToSelector + 20
1  AVFAudio                       0x19cafcb54 -[AVAudioRecorder finishedRecording] + 48
2  Foundation                     0x190207f78 __NSThreadPerformPerform + 184
3  CoreFoundation                 0x18fd9bc18 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
4  CoreFoundation                 0x18fd9bb70 __CFRunLoopDoSource0 + 80
5  CoreFoundation                 0x18fd9b2f8 __CFRunLoopDoSources0 + 184
6  CoreFoundation                 0x18fd96328 __CFRunLoopRun + 788
7  CoreFoundation                 0x18fd95ce8 CFRunLoopRunSpecific + 424
8  GraphicsServices               0x199ee038c GSEventRunModal + 160
9  UIKitCore                      0x193ec4444 UIApplicationMain + 1932
10 myapp                          0x10409e4b0 main + 21 (ProfileViewController.swift:21)
11 libdyld.dylib                  0x18fc1d8f0 start + 4

相关代码片段:

class AudioRecorderViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {
    
    @IBOutlet weak var recordButton: UIButton!
    @IBOutlet weak var playButton: UIButton!
    
    var recorder: AVAudioRecorder!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        do {
            try recordingSession.setCategory(AVAudioSession.Category.playAndRecord, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try recordingSession.setActive(true)
            recordingSession.requestRecordPermission() { [unowned self] allowed in
                DispatchQueue.main.async {
                    if allowed {
                        
                    } else {
                        self.recordButton.isEnabled = false
                        self.playButton.isEnabled = false
                    }
                }
            }
        }
        catch let error as NSError {
            NSLog("Error: \(error)")
        }
        
        NotificationCenter.default.addObserver(self, selector: #selector(self.stopRecording(sender:)), name: UIApplication.didEnterBackgroundNotification, object: nil)
    }
    
    override func viewDidLoad() {
        
        try! recorder = AVAudioRecorder(url: outputURL! as URL, settings: settings)
        recorder.delegate = self
        recorder.prepareToRecord()
        
        recordingSession = AVAudioSession.sharedInstance()
    }

    func toggleRecord() {
        print("toggleRecord()")
        timeTimer?.invalidate()
        
        if recorder.isRecording {
            print("Stopping...")
            recorder.stop()
        } else {
            print("Starting...")
            milliseconds = 0
            timeLabel.text = "00:00"
            timeTimer = Timer.scheduledTimer(timeInterval: 0.0167, target: self, selector: #selector(self.updateTimeLabel(timer:)), userInfo: nil, repeats: true)
            recorder.deleteRecording()
            recorder.isMeteringEnabled = true
            recorder.record()
        }
        
        updateControls()
    }
    
    @objc func stopRecording(sender: AnyObject) {
        if recorder.isRecording {
            toggleRecord(sender: sender)
        }
    }

}

标签: iosswiftavaudiorecorder

解决方案


您正在未经 viewDidLoad 中的任何许可准备记录


推荐阅读