Swift 在模拟器上录制和播放音频,而不是在真正的iPhone设备上

Swift 在模拟器上录制和播放音频,而不是在真正的iPhone设备上,swift,iphone,xcode,Swift,Iphone,Xcode,在下面的“soundPlayer.play()”行中,我得到一个错误: 致命错误:隐式展开可选值时意外发现nil 但是,只有在实际设备上按下播放按钮时才会发生这种情况 也请忽略我将我的按钮命名为“plat”按钮而不是play按钮,哈 class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVAudioRecorderDelegate, AVA

在下面的“soundPlayer.play()”行中,我得到一个错误:

致命错误:隐式展开可选值时意外发现nil

但是,只有在实际设备上按下播放按钮时才会发生这种情况

也请忽略我将我的按钮命名为“plat”按钮而不是play按钮,哈

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVAudioRecorderDelegate, AVAudioPlayerDelegate {


    @IBOutlet weak var recordBTN: UIButton!
    @IBOutlet weak var platBTN: UIButton!

        var soundRecorder : AVAudioRecorder!
        var soundPlayer : AVAudioPlayer!

        var fileName: String = "audioFile.m4a"



    var player: AVAudioPlayer!
    var bannerView: GADBannerView!




    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        bannerView = GADBannerView(adSize: kGADAdSizeBanner)

        addBannerViewToView(bannerView)

        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        //ca-app-pub-9351248624194777/2551009478 real
        bannerView.rootViewController = self
        bannerView.load(GADRequest())

        setupRecorder()
        platBTN.isEnabled = false
    }

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

        func setupRecorder() {
            let audioFilename = getDocumentsDirectory().appendingPathComponent(fileName)
            let recordSetting = [ AVFormatIDKey : kAudioFormatAppleLossless,
                                  AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
                                  AVEncoderBitRateKey : 320000,
                                  AVNumberOfChannelsKey : 2,
                                  AVSampleRateKey : 44100.2] as [String : Any]

            do {
                soundRecorder = try AVAudioRecorder(url: audioFilename, settings: recordSetting )
                soundRecorder.delegate = self
                soundRecorder.prepareToRecord()
            } catch {
                print(error)
            }
        }

        func setupPlayer() {
            let audioFilename = getDocumentsDirectory().appendingPathComponent(fileName)
            do {
                soundPlayer = try AVAudioPlayer(contentsOf: audioFilename)
                soundPlayer.delegate = self
                soundPlayer.prepareToPlay()
                soundPlayer.volume = 1.0
            } catch {
                print(error)
            }
        }

        func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
            platBTN.isEnabled = true
        }

        func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
            recordBTN.isEnabled = true
            platBTN.setTitle("Play", for: .normal)
        }


    @IBAction func recordAct(_ sender: UIButton) {
            if recordBTN.titleLabel?.text == "Record" {
                soundRecorder.record()
                recordBTN.setTitle("Stop", for: .normal)
                platBTN.isEnabled = false
            } else {
                soundRecorder.stop()
                recordBTN.setTitle("Record", for: .normal)
                platBTN.isEnabled = false
            }
    }


    @IBAction func playAct(_ sender: UIButton) {
            if platBTN.titleLabel?.text == "Play" {
                platBTN.setTitle("Stop", for: .normal)
                recordBTN.isEnabled = false
                setupPlayer()
                soundPlayer.play() //Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
            } else {
                soundPlayer.stop()
                platBTN.setTitle("Play", for: .normal)
                recordBTN.isEnabled = false
            }
    }
    @IBAction func playBtnPressed(_ sender: UIButton) {
                    playSound(soundName: "4chordsong3") //
    }



    @IBAction func pausePressed(_ sender: UIButton) {

        if player?.play() != nil{
            player.pause()
        }

    }

当我按下“播放”按钮时,程序立即崩溃,我得到上面显示的错误。有什么办法可以解决这个问题吗?

我找到了解决办法。我只是将此添加到setupRecorder方法中:

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSession.Category.playAndRecord)//