ios - 在 iOS 锁定屏幕上使用播放器控件进行远程控制应用程序

标签 ios swift avplayer avaudiosession mpremotecommandcenter

我正在尝试在 iOS 锁定屏幕上为控制 PC 上音乐播放器的远程控制应用程序实现播放器控件。 所以基本上我需要控制 iOS 设备之外的播放。 我已在功能(音频)中启用后台模式并尝试设置 MPRemoteCommandCenter 锁定屏幕控件,但未显示它们。这是代码:

class RemoteCommandHandler: NSObject {
    static let shared = RemoteCommandHandler()

    private let player = AVPlayer()
    private let audioSession = AVAudioSession.sharedInstance()
    private let commandCenter = MPRemoteCommandCenter.shared()

    func initRemote() {
        //UIApplication.shared.beginReceivingRemoteControlEvents()

        do {
            if #available(iOS 10.0, *) {
                try audioSession.setCategory(.playback, mode: .default, options: [])
            } else {
                // Fallback on earlier versions
                try audioSession.setCategory(.playback)
            }
        } catch {
            NSLog("\(error)")
        }

        do {
            try audioSession.setActive(true)
            NSLog("AVSession is active")
        } catch {
            NSLog("\(error)")
        }

        setupRemoteTransportControls()
        setupNowPlaying()
    }

    func setupRemoteTransportControls() {
        commandCenter.togglePlayPauseCommand.isEnabled = true
        commandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(controlPlayPause))
    }

    func setupNowPlaying() {
        var nowPlayingInfo = [String : Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = NowPlayingInfo.getValue(.Title)

        if let image = UIImage(named: "DemoArtwork") {
            nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: image)
        }
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = TimeInterval(exactly: 10)
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = NowPlayingInfo.getDurationMs() / 1000
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
}

是否有可能做我想做的事?我做错了什么?

最佳答案

看起来在锁定屏幕上进行控件的唯一可能方法是从您的应用程序启动真实音频文件的播放。 我在应用程序启动时做了一个非常短的静默文件播放的解决方法,现在我可以访问这些控件。

请记住,应启用背景模式(音频),以便在您的应用不在屏幕上时查看控件。

另一个限制是音量控制硬连线到设备音量,因此您无法单独更改应用音量。

以下是启用控件的最少代码:

import MediaPlayer
import AVFoundation

class RemoteCommandHandler: NSObject {
    static let shared = RemoteCommandHandler()

    private var player: AVPlayer!
    private var playerItem: AVPlayerItem!
    private let audioSession = AVAudioSession.sharedInstance()
    private let commandCenter = MPRemoteCommandCenter.shared()

    func initRemote() {
        let sound = Bundle.main.path(forResource: "SilenceAAC", ofType: "m4a")
        playerItem = AVPlayerItem(url: URL(fileURLWithPath: sound!))
        player = AVPlayer(playerItem: playerItem)

        do {
            if #available(iOS 10.0, *) {
                try audioSession.setCategory(.playback, mode: .default, options: [])
            } else {
                // Fallback on earlier versions
                try audioSession.setCategory(.playback)
            }

            try audioSession.setActive(true)
            NSLog("AVSession is active - \(audioSession)")
        } catch {
            NSLog("\(error)")
        }

        setupNowPlaying()
        setupRemoteTransportControls()

        player.play()
    }

    func setupRemoteTransportControls() {
        commandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(controlPlayPause))
    }

    func setupNowPlaying() {
        var nowPlayingInfo = [String : Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = NowPlayingInfo.getValue(.Title)

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
}

关于ios - 在 iOS 锁定屏幕上使用播放器控件进行远程控制应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60568375/

相关文章:

objective-c - ';' 语句说明符中应为 'for' (iOS)

ios - 如何从 child 类调用this.props?

swift - 使用 Pod 解析崩溃报告导入时无法在 Swift 上运行

ios - 如何使用项目值获取单元格索引路径?

ios - 通知控制中心同时播放多个音频

ios - 我的项目突然不允许我将任何 IBOutlets 连接到任何 ViewController

ios - 在 Urban Airship 门户上更改 bundle ID

Swift indexOf,==运算符覆盖未被调用

ios - 表格 View 单元格中的播放按钮显示错误的视频,因为它没有获得正确的单元格

ios - 如何使用 UISlider 更改视频的 CIFilter 值?