简体   繁体   中英

How to continue audio playback in background mode

I have a UIWebView that plays video clips in my view controller. When I exit the app, the audio will stop playing, although I can press play in the control center to continue it again. To do that I'm using the following code in my AppDelegate.swift.

When the app enters the background, I'd like the audio to start playing automatically. How can I enable the MPMusicPlayerController/AVAudioPlayer (I'm really not sure which it is) to continue playing so the user doesn't have to manually press play?

I also have "Audio and Airplay" checked under Background Modes in my target settings, and Required Background Modes set to "App plays audio or streams audio/video using AirPlay".

var error: NSError?
var success = AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: &error)
if !success {
     NSLog("Failed to set audio session category.  Error: \(error)")
}

UPDATE: I'm creating a custom view in my appDel to accommodate a video mini player. Here's how I'm creating it. CustomWindow is a custom class of UIWindow where I'm adding a mini player to the top of the view hierarchy. In this code, am I calling that method before creating the UIWebView ?

class AppDelegate: UIResponder, UIApplicationDelegate {

    let myWind = CustomWindow(frame:UIScreen.mainScreen().bounds)
    var window: UIWindow? {
        set {

        }
        get {
            return myWind
        }
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        var error: NSError?
        var success = AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: &error)
        if success {
            AVAudioSession.sharedInstance().setActive(true, error: nil)
            UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
        } else {
            NSLog("Failed to set audio session category.  Error: \(error)")
        }

        myWind.showOrHidePopupWindow()
}

Try to update you code with this:

var error: NSError?
var success = AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: &error)
if success {
    AVAudioSession.sharedInstance().setActive(true, error: nil)
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
} else {
    NSLog("Failed to set audio session category.  Error: \(error)")
}

Important:

  1. Don't use simulator for tests. Background playback doesn't work in the Simulator;
  2. Call above code before creating UIWebView instance.

Sources: 1 , 2 .

You can play music in lockscreen with

var error: NSError?
var success = AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: &error)
if success {
    AVAudioSession.sharedInstance().setActive(true, error: nil)
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
} else {
    NSLog("Failed to set audio session category.  Error: \(error)")
}

After it You Need to add Background Modes in the capabilities Like this. And don't test this on simulator It does not work on simulator. Hope it helps 在此输入图像描述

and this is how you can handal previous,next,pause and play :-

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent

 {

    if (receivedEvent.type == UIEventTypeRemoteControl) 
{
        switch (receivedEvent.subtype)
 {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                [self togglePlayPause];
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
                [self playPrevTrack];
                break;
            case UIEventSubtypeRemoteControlNextTrack:
                [self playNextTrack];
                break;
            default:
                break;
        }
    }
}

In swift you can use it Like that

override func remoteControlReceivedWithEvent(event: UIEvent) {
        let rc = event.subtype

        println("received remote control \(rc.rawValue)") // 101 = pause, 100 = play
        switch rc {
        case .RemoteControlTogglePlayPause:

            self.togglePlayPause()
        break;
        case .RemoteControlPreviousTrack:
            self.playPrevTrack()
         break;
        case .RemoteControlNextTrack:
            self.playNextTrack()
        break;
        default:break
        }

A common "trick" is to play a white sound that keeps your app running. But it will display a red bold status bar

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM