【问题标题】:Swift: add forward/backward 15 seconds buttons on lock screenSwift:在锁定屏幕上添加前进/后退 15 秒按钮
【发布时间】:2021-05-21 13:14:00
【问题描述】:

我有AVAudioPlayer。我想在锁定屏幕上添加 15 秒快退按钮,如下图所示:

但我在这张图片上有这样的结果:

我的代码:

var audioPlayer: AVAudioPlayer!

override func viewDidLoad() {
    super.viewDidLoad()

    try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try? AVAudioSession.sharedInstance().setActive(true)
    UIApplication.shared.beginReceivingRemoteControlEvents()

    ...

    audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    play(sender:AnyObject.self as AnyObject)
    restorePlayerCurrentTime()
}

override func remoteControlReceived(with event: UIEvent?) {
        guard let event = event else {
            print("no event\n")
            return
        }
        guard event.type == UIEventType.remoteControl else {
            print("received other event type\n")
            return
        }
        
        switch event.subtype {
        
        case UIEventSubtype.remoteControlBeginSeekingBackward:
            audioPlayer.play()
        
        case UIEventSubtype.remoteControlBeginSeekingForward:
            audioPlayer.pause()
        
        case UIEventSubtype.remoteControlPlay:
            print("received remote play\n")
            audioPlayer.play()
        case UIEventSubtype.remoteControlPause:
            print("received remote pause\n")
            audioPlayer.pause()
        
        /*case UIEventSubtype.remoteControlTogglePlayPause:
            print("received toggle\n")*/
            
        default:
            print("received \(event.subtype) which we did not process\n")
        }
    }

如何解决?

播放和停止按钮可以正常工作,但倒带不起作用。

【问题讨论】:

    标签: ios swift avaudioplayer


    【解决方案1】:

    我是这样做的

    import MediaPlayer
    
    func setupMediaPlayerNotificationView()  {
       
        let commandCenter = MPRemoteCommandCenter.shared()
        
    commandCenter.skipForwardCommand.addTarget { [weak self] event in
        print("You Pressed skipForward")
        return .success
    }
    
    commandCenter.skipBackwardCommand.addTarget { [weak self] event in
        print("You Pressed skipBackward")
        return .success
    }
    
    }
    

    这将为您提供跳过按钮。

    调用它

        override func viewDidLoad() {
            super.viewDidLoad()
            self.setupMediaPlayerNotificationView()
    }
    

    【讨论】:

    • 我将它添加到我的代码中并在此函数中添加断点。但是这个函数没有被调用。为什么?
    • 导入MediaPlayer并从viewDidLoad调用函数
    • 工作正常。但我有一些问题。 1. 在锁定屏幕上,我看到按钮图标后退到 +10 或 -10。怎么改成15? 2.我还添加了changePlaybackPositionCommand,但是当我点击按钮倒带时,曲目倒带很好。但滑块不会改变位置
    • 我解决了第一个问题。但没有解决 2.
    【解决方案2】:

    回答你的问题2;

    您需要更新 MPNowPlayingInfoPropertyElapsedPlaybackTime 以匹配 CMTimeGetSeconds(player.currentTime() ),更新此值的最佳位置是添加观察者 forKeyPath: "timeControlStatus" 并更新 .waitingToPlaySpecifieldRate / .paused 和 .playing

    创建一个名为 nowPlayingInfo 的全局字典 https://developer.apple.com/documentation/mediaplayer/mpnowplayinginfocenter/1615903-nowplayinginfo

    例子:

        nowPlayingInfo = nil
        
        nowPlayingInfo = [String: Any]()
        
        self.nowPlayingInfo?[MPMediaItemPropertyTitle] = data[0].currentTrackTitle
        self.nowPlayingInfo?[MPMediaItemPropertyArtist] = data[0].currentArtist
        self.nowPlayingInfo?[MPMediaItemPropertyAlbumTitle] = data[0].currentAlbumName
        self.nowPlayingInfo?[MPNowPlayingInfoPropertyDefaultPlaybackRate] =  NSNumber(value: 1)
        self.nowPlayingInfo?[MPMediaItemPropertyPlaybackDuration] =  CMTimeGetSeconds((player!.currentItem?.asset.duration)!)
        self.nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime() )
        let image = data[0].currentArtwork
        self.nowPlayingInfo?[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { (size) -> UIImage in
            return image
        })
      
        
        MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
    

    在 timeControlStatus oberver 中更新 nowPlayingInfo 全局字典的 `self.nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime() )

    您还需要在搜索(15 秒)之前将 MPNowPlayingInfoPropertyDefaultPlaybackRate 更新为 0,然后在搜索完成后将此值设置回 1。

    例子;

    override func observeValue(forKeyPath keyPath: String?,
                                   of object: Any?,
                                   change: [NSKeyValueChangeKey : Any]?,
                                   context: UnsafeMutableRawPointer?) {
            
            guard context == &playerItemContext else {
                super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
                return
            }
            
            if keyPath == "timeControlStatus" {
    
                let statusNumber = change?[.newKey] as? NSNumber
                    // Switch over status value
                    switch statusNumber {
                    case 0:
                            //print("paused")
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyDefaultPlaybackRate] =  NSNumber(value: 0)
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime() )
                            MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
                    case 1:
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyDefaultPlaybackRate] =  NSNumber(value: 0)
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime() )
                            MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
                    case 2:
                            //print("playing")
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyDefaultPlaybackRate] =  NSNumber(value: 1)
                            self.nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime() )
                            MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
        
                            }
                    default:
                            fatalError() //this is never called in this scenario
                    }
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多