无法在iOS锁定屏幕上显示播放器控件

alt*_*ser 1 audio ios swift

我在锁定屏幕(iOS 11.2)上显示播放器控件时遇到问题。我已经完成的工作如下:

在AppDelegate.swift中,我初始化了AVAudioSession:

import MediaPlayer

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.beginReceivingRemoteControlEvents()
    do {
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
      try AVAudioSession.sharedInstance().setActive(true)
    } catch {
    }
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我的应用程序由一个具有多个视图的TabHostController组成。其中之一是音频选项卡。在那里,我尝试处理远程按钮:

import UIKit
import Foundation
import MediaPlayer

class AudioTabViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()

    let commandCenter = MPRemoteCommandCenter.shared()
    commandCenter.playCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
      self.audioPlayClicked()
      return .success
    }
    commandCenter.pauseCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
      self.audioPauseClicked()
      return .success
    }
    commandCenter.stopCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
      self.audioStopClicked()
      return .success
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,我在Info.plist中添加了背景模式:

<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
</array>
Run Code Online (Sandbox Code Playgroud)

怎么了?我可以毫无问题地构建项目,然后在iPhone 8上运行它。我的音乐可以播放。
但是锁定屏幕上没有音频控件(屏幕为空)。
而且,如果我查看iOS控制中心,则会找到一些音频控件,但是通过单击其中的“播放”按钮,只会播放我以前使用过的Apple音乐应用程序的音轨。
因此,我认为我的应用未在系统范围内“注册”为当前的音频播放器。

Joh*_*ohn 5

我不知道您能解决问题,但也许有人遇到问题,这篇文章可以帮助他们。

我有同样的问题,

我终于找到了问题,

当我设置AVAudioSession时,我正在使用此行-> try

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.duckOthers)
Run Code Online (Sandbox Code Playgroud)

一旦我将该行更改为以下内容,锁定屏幕控件就会显示并正常工作->

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [])
Run Code Online (Sandbox Code Playgroud)

所以我想问题出在传入AVAudioSessionCategoryPlaybackOptions的参数。我尝试传递.duckOthers和.mixWithOthers,在两种情况下,它都导致锁定屏幕控件根本不显示