【问题标题】:How to continue audio playback in background mode如何在后台模式下继续播放音频
【发布时间】:2015-10-14 15:25:52
【问题描述】:

我有一个 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()
}

【问题讨论】:

  • 你找到答案了吗?我有这个确切的问题。
  • 没有,还没找到

标签: ios audio


【解决方案1】:

您可以在锁屏中播放音乐

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

在它之后,您需要在这样的功能中添加背景模式。并且不要在模拟器上测试它在模拟器上不起作用。希望对你有帮助

这就是您可以处理上一个、下一个、暂停和播放的方式:-

- (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 调用它?
  • togglePlayPause 是你的播放方法和暂停方法。我已经更新了我的 swift 答案。
  • 如果您需要更多帮助,请告诉我。
  • 如果它解决了您的问题,请接受此答案。谢谢快乐编码。
  • 这并没有达到我想要的效果。媒体应在进入后台模式后自动播放。只有当我从控制中心向上滑动并自己切换播放暂停时才会调用它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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 实例之前调用上述代码。

    来源:12

    【讨论】:

    • 我将该代码块添加到applicationDidFinishLaunchingWithOptions 的顶部,但没有运气。虽然我并不完全相信我在创建 UIWebView 之前会调用它。你能看看我更新的代码吗?
    • @dperk 你在为你的 UIWebView 对象使用故事板吗?
    • 不,我是以编程方式设置的
    • @dperk 你能放两个断点吗:一个在didFinishLoadingWithLaunching 方法中,另一个在你设置UIWebView 对象的方法中。并查看哪个断点首先触发。
    • let myWind=didFinishLaunchingWithOptions 之前被调用
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2015-03-10
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多