ios - 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)
}
}
}
解决方案
您正在未经 viewDidLoad 中的任何许可准备记录
推荐阅读
- python - 如何让python识别比例尺并设置图像的尺寸
- r - ifelse 在值之前和之后
- android - 使用 firebase 未显示回收站视图 - kotlin
- php - 从一个多维数组中取值并根据第一个键的匹配值将其放入另一个多维数组
- python - RASA 软件包安装不完整,出现以下问题:FileNotFoundError: [Errno 2] No such file or directory: 'HISTORY.rst'
- sql - 合并使用 nvl() 将数据库中的现有值替换为 null
- javascript - 如何在 NodeJs 中使用 PDFlib 获取表单域的坐标/位置
- python - 将 CDF 存储在单个数据框单元格或多列中
- python - 为什么这个 List Comprehension 不会产生与这个 for/in 循环相同的结果?
- python-3.x - Airflow2 使用 AWS RDS Postgres 作为元存储错误