Я проверил сообщение о переполнении стека и понял, как добавить звуки. Дело в том, что когда я пытаюсь его выполнить, не выдается никаких ошибок, но звук не воспроизводится. Я создал функцию, которая принимает имя звукового файла и формат. Возможно, я делаю что-то не так.
Вариант использования: у меня есть переменная, которая отслеживает состояние представления. Если состояние 1,2 или 3, просмотрите изменения - тактильный двигатель запущен, и звук активирован соответственно. Но звуковая часть просто не работает.
ПРИМЕЧАНИЕ. Не работает в беззвучном режиме
import UIKit
import AVFoundation
class HomeController: UIViewController {
//MARK: INITIALIZE VIEWS
#code where views are initialised
var stateTrack: Int! {
didSet{
updateStates()
}
}
var player: AVAudioPlayer?
//MARK: MAIN: VIEW DID LOAD
override func viewDidLoad() {
super.viewDidLoad()
configureViews()
}
//MARK: FUNCTIONS: HANDLERS
@objc func handleProfileView(){
print("Profile button pressed")
stateTrack = 1
}
@objc func handleConnect(){
print("Connect button pressed")
stateTrack = 2
}
@objc func handleHow(){
print("How button pressed")
stateTrack = 3
}
//MARK: FUNCTIONS: CORE UI
fileprivate func configureViews() {
#view configuration occurs here
}
fileprivate func updateStates() {
if self.stateTrack == 0 {
#do something with the view
} else if self.stateTrack == 1 {
#do something with the view
generateHaptics(stateValue: 1)
playSound(resourceName: "fail", format: "mp3")
} else if self.stateTrack == 2 {
#do something with the view
generateHaptics(stateValue: 2)
playSound(resourceName: "search", format: "wav")
} else if self.stateTrack == 3 {
#do something with the view
generateHaptics(stateValue: 3)
playSound(resourceName: "success", format: "wav")
}
}
fileprivate func generateHaptics(stateValue: Int){
let generator = UINotificationFeedbackGenerator()
if stateValue == 1{
generator.notificationOccurred(.error)
}
else if stateValue == 2{
generator.notificationOccurred(.warning)
}
else{
generator.notificationOccurred(.success)
}
}
fileprivate func playSound(resourceName: String, format: String) {
guard let url = Bundle.main.url(forResource: resourceName, withExtension: format) else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
guard let player = player else { return }
player.play()
} catch let error {
print(error.localizedDescription)
}
}
}