iPhone не воспроизводит звук, но симулятор может воспроизводить звук - PullRequest
0 голосов
/ 05 сентября 2018

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

import UIKit
import AVFoundation
import os.log

class ViewController: UIViewController {

    @IBOutlet weak var switchButton: UIButton!
    @IBOutlet weak var flashImageView: UIImageView!

    var isOn = false
    var soundPlayer: AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        prepareSound()

    }

    func prepareSound() {
        let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
        let url = URL(fileURLWithPath: path)

        do {
            soundPlayer = try AVAudioPlayer(contentsOf: url)
            soundPlayer?.prepareToPlay()
        } catch {
            // couldn't load file :(
        }
    }

    func toggleTorch(on: Bool) {
        guard let device = AVCaptureDevice.default(for: .video) else { return }

        if device.hasTorch {
            do {
                try device.lockForConfiguration()

                if on == true {
                    device.torchMode = .on
                } else {
                    device.torchMode = .off
                }

                device.unlockForConfiguration()
            } catch {
                print("Torch could not be used")
            }
        } else {
            print("Torch is not available")
        }
    }

    @IBAction func switchTapped(_ sender: Any) {
        isOn = !isOn
        soundPlayer?.play()
        os_log("sound played")
        toggleTorch(on: isOn)

        flashImageView.image = isOn ? #imageLiteral(resourceName: "onBG") : #imageLiteral(resourceName: "offBG")
        switchButton.setImage( isOn ? #imageLiteral(resourceName: "onSwitch") : #imageLiteral(resourceName: "offSwitch"), for: .normal)

    }

}

1 Ответ

0 голосов
/ 05 сентября 2018

Добавьте две строки кода в метод prepareSound. Это будет работать.

func prepareSound() {
    let session = AVAudioSession.sharedInstance()
    try? session.setCategory(AVAudioSessionCategoryPlayback)

    let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
    let url = URL(fileURLWithPath: path)

    do {
        soundPlayer = try AVAudioPlayer(contentsOf: url)
        soundPlayer?.prepareToPlay()
    } catch {
        // couldn't load file :(
    }
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...