title: How to resume audio after interruption in Swift?
body: <p>I am following instructions <a href="https://stackoverflow.com/a/30280699/1827488">here</a>, I've put together this test project to handle interruptions to audio play. Specifically, I'm using the alarm from the default iphone clock app as interruption. It appears that the interruption handler is getting called but is not getting past the <code>let = interruptionType</code> line as "<strong>wrong type</strong>" showed up twice.</p>
  
  <pre><code>import UIKit
  import AVFoundation
  
  class ViewController: UIViewController {
  
      var player = AVAudioPlayer()
  
      let audioPath = NSBundle.mainBundle().pathForResource("rachmaninov-romance-sixhands-alianello", ofType: "mp3")!
  
      func handleInterruption(notification: NSNotification) {
  
          guard let interruptionType = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? AVAudioSessionInterruptionType else { print("wrong type"); return }
  
          switch interruptionType {
  
          case .Began:
              print("began")
              // player is paused and session is inactive. need to update UI)
              player.pause()
              print("audio paused")
  
          default:
              print("ended")
              /**/
              if let option = notification.userInfo?[AVAudioSessionInterruptionOptionKey] as? AVAudioSessionInterruptionOptions where option == .ShouldResume {
                  // ok to resume playing, re activate session and resume playing
                  // need to update UI
                  player.play()
                  print("audio resumed")
              }
              /**/
          }
      }
  
      override func viewDidLoad() {
          super.viewDidLoad()
          // Do any additional setup after loading the view, typically from a nib.
  
          do {
              try player = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath))
              player.numberOfLoops = -1 // play indefinitely
              player.prepareToPlay()
              //player.delegate = player
  
          } catch {
              // process error here
          }
  
          // enable play in background https://stackoverflow.com/a/30280699/1827488 but this audio still gets interrupted by alerts
          do {
              try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
              print("AVAudioSession Category Playback OK")
              do {
                  try AVAudioSession.sharedInstance().setActive(true)
                  print("AVAudioSession is Active")
              } catch let error as NSError {
                  print(error.localizedDescription)
              }
          } catch let error as NSError {
              print(error.localizedDescription)
          }
  
          // add observer to handle audio interruptions
          // using 'object: nil' does not have a noticeable effect
          let theSession = AVAudioSession.sharedInstance()
          NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.handleInterruption(_:)), name: AVAudioSessionInterruptionNotification, object: theSession)
  
          // start playing audio
          player.play()
      }
  
      override func didReceiveMemoryWarning() {
          super.didReceiveMemoryWarning()
          // Dispose of any resources that can be recreated.
      }
  }
  </code></pre>
  
  <p>Furthermore, following an idea <a href="https://gist.github.com/jchernan/de6c30b40fb69d03fb63" rel="noreferrer">here</a>, I have modified the handler to</p>
  
  <pre><code>func handleInterruption(notification: NSNotification) {
  
          //guard let interruptionType = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? AVAudioSessionInterruptionType else { print("wrong type"); return }
  
          if notification.name != AVAudioSessionInterruptionNotification
              || notification.userInfo == nil{
              return
          }
  
          var info = notification.userInfo!
          var intValue: UInt = 0
          (info[AVAudioSessionInterruptionTypeKey] as! NSValue).getValue(&amp;intValue)
          if let interruptionType = AVAudioSessionInterruptionType(rawValue: intValue) {
  
              switch interruptionType {
  
              case .Began:
                  print("began")
                  // player is paused and session is inactive. need to update UI)
                  player.pause()
                  print("audio paused")
  
              default:
                  print("ended")
                  /** /
                  if let option = notification.userInfo?[AVAudioSessionInterruptionOptionKey] as? AVAudioSessionInterruptionOptions where option == .ShouldResume {
                      // ok to resume playing, re activate session and resume playing
                      // need to update UI
                      player.play()
                      print("audio resumed")
                  }
                  / **/
                  player.play()
                  print("audio resumed")
              }
          }
      }
  </code></pre>
  
  <p>Results are that all of "began", "audio paused", "ended" and "audio resumed" show up in console but audio play is not actually resumed.</p>
  
  <p>Note: I moved the <code>player.play()</code> outside of the commented out <code>where option == .ShouldResume</code> if statement because that <code>if</code> condition is not true when the <code>.Ended</code> interruption occurs.</p>