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

时间:2015-07-24 04:43:37

标签: ios audio

我有一个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创建自定义视图以容纳视频迷你播放器。以下是我创建它的方式。 CustomWindowUIWindow的自定义类,我在其中添加了一个迷你播放器到视图层次结构的顶部。在此代码中,我是否在创建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()
}

3 个答案:

答案 0 :(得分: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实例之前调用上面的代码。
  3. 来源:12

答案 1 :(得分: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)")
}

之后你需要在功能中添加背景模式像这样。并且不要在模拟器上测试它在模拟器上不起作用。希望它有助于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
        }

答案 2 :(得分:-1)

常见的"技巧"是播放白色声音,让您的应用程序运行。 但它会显示一个红色的粗体状态栏