如何在后台模式下继续音频播放。

11

我有一个UIWebView在我的视图控制器中播放视频剪辑。当我退出应用程序时,音频将停止播放,虽然我可以在控制中心按播放按钮来继续播放。为此,我在AppDelegate.swift中使用以下代码:

当应用程序进入后台时,我希望音频能自动开始播放。如何启用MPMusicPlayerController/AVAudioPlayer(我真的不确定是哪个)以便继续播放,这样用户就不必手动按播放按钮了?

我还在我的目标设置中勾选了“音频和Airplay”,并将“所需后台模式”设置为“应用程序使用AirPlay播放音频或流媒体音频/视频”。

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

更新:我在我的appDel中创建了一个自定义视图,以容纳视频迷你播放器。以下是我如何创建它的方法。 CustomWindow是一个继承自UIWindow的自定义类,在这个类中,我将迷你播放器添加到视图层次结构的顶部。在这段代码中,我是在创建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()
}

你找到答案了吗?我也遇到了完全相同的问题。 - lagoon
还没有找到。 - slider
3个回答

5
尝试使用以下代码更新您的代码:

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)")
}

重要提示:

  1. 不要使用模拟器进行测试。后台播放在模拟器中无法工作;
  2. 在创建UIWebView实例之前调用上述代码。

来源: 1, 2.


我将那一段代码添加到了 applicationDidFinishLaunchingWithOptions 的开头,但是没有任何运行的效果。尽管我并不完全相信在创建 UIWebView 之前调用它。你能否帮忙看一下我的更新过的代码? - slider
@dperk 你在使用Storyboard来创建UIWebView对象吗? - Vlad Papko
“let myWind =” 在 “didFinishLaunchingWithOptions” 之前被调用。 - slider
@dperk 试试将myWind对象的初始化放在applicationDidFinishLaunchingWithOptions方法里面,放在与AVAudioSession相关的代码之后。 - Vlad Papko
我只需要视频在进入后台状态时要么不暂停,要么恢复播放。 - slider
显示剩余5条评论

4

您可以在锁屏界面播放音乐,方法如下:

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)")
}

接下来您需要在能力(capabilities)中添加背景模式(background modes),就像这样。请勿在模拟器上测试,模拟器无法正常工作。希望对您有所帮助。 enter image description here

以下是如何处理“上一个”、“下一个”、“暂停”和“播放”的方法:

- (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;
        }
    }
}

在Swift中,你可以像这样使用它。
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
        }

在Swift中,没有self.togglePlayPause等内容。我该如何从appDelegate.Swift中调用它? - slider
togglePlayPause是播放和暂停的方法。我已经更新了Swift答案。 - chakshu
如果您需要更多帮助,请告诉我。 - chakshu
请接受这个答案,如果它解决了你的问题。谢谢,愉快编程。 - chakshu
这并没有完成我想要的。媒体应在进入后台模式时自动播放。只有当我从控制中心向上滑动并自己切换播放暂停时,才会调用此方法。 - slider

-1
一个常见的“技巧”是播放一种白噪音来保持你的应用程序运行。 但它会显示一个红色粗体状态栏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接