Swift - AVAudioPlayer, звук не воспроизводится правильно

Так какUILocalNotification не отображается, когда приложение находится в активном состоянии, я пытаюсь настроитьUIAlertController и играет немного звука, когда он появляется.

У меня нет проблем, вAppDelegate, чтобы обработать уведомление / создать предупреждение. Моя проблема касается звука. На самом деле, это не играет правильно.

Вот что у меня так далеко:

//...
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    // Notifications permissions
    let types: UIUserNotificationType = UIUserNotificationType.Sound | UIUserNotificationType.Alert
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)
    application.registerUserNotificationSettings(settings)

    return true
}

func application(application: UIApplication!, didReceiveLocalNotification notification: UILocalNotification!) {
    let state : UIApplicationState = application.applicationState
    var audioPlayer = AVAudioPlayer()

    if (state == UIApplicationState.Active) {
        // Create sound

        var error:NSError?
        var audioPlayer = AVAudioPlayer()

        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)

        let soundURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "wav")!)

        audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: &error)

        if (error != nil) {
            println("There was an error: \(error)")
        } else {
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        }

        // Create alert
        let alertController = UIAlertController(title: "Alert title", message: "Alert message.", preferredStyle: .Alert)

        let noAction = UIAlertAction(title: "No", style: .Cancel) { (action) in
            // ...
        }
        let yesAction = UIAlertAction(title: "Yes", style: .Default) { (action) in
            // ...
        }

        alertController.addAction(noAction)
        alertController.addAction(yesAction)

        self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

    }

}

При этом, когда игрок проходит эту линию:audioPlayer.play() Это только играть менее чем за секунду. Как если бы он был внезапно освобожден, может быть (?).

Я попробовал две вещи ниже:

Переключение обратноAVAudioPlayer статус неактивен:AVAudioSession.sharedInstance().setActive(false, error: nil) непосредственно перед созданием оповещения (или только после его показа). Если я это сделаю, звук воспроизводится правильно. Но этот метод является синхронной (блокирующей) операцией, поэтому он задерживает другое (предупреждение показывается после звука). Видимо, не очень хорошее решение.Переместить свойство audioPlayer (var audioPlayer = AVAudioPlayer()) до уровня класса, прямо под окном (var window: UIWindow?). Если я это сделаю, звук воспроизводится правильно, и предупреждение также отображается правильно.

Я не понимаю, почему это так работает. Я что-то пропустил? Это правильный способ решить мою проблему?

Заранее спасибо всем, кто мог бы помочь мне понять / исправить это.

Ответы на вопрос(1)

Ваш ответ на вопрос