2017-08-08 39 views
5

İçinde müzik çaları olan bir uygulama yapıyorum. Üzerinde uzun zamandır çalışmamıştım ama en son çalıştığım zaman nowPlayingInfo çalışıyordu. Şimdi, Swift 3'e güncellediğimde, her şey ilerleme çubuğu dışında çalışır.MPNowPlayingInfoCenter ilerleme çubuğunu güncelleştirmeyi durdurdu

Burada, ırk koşulları hakkında konuşulan ve bir şey tarafından geçersiz kılınan ancak neyin neden olduğunu anlayamadığım birkaç benzer soru gördüm. Bu yardımcı olursa AVQueuePlayer kullanıyorum.

Atla ve önceki düğmeler çalışır, albüm resmi, başlığı ve sanatçı mükemmel şekilde güncellenir ancak geçen süre güncellenmez. Hata ayıkladığımda, MPNowPlayingInfoCenter.default().nowPlayingInfo numaralı MPNowPlayingInfoPropertyElapsedPlaybackTime doğru sayıları gösteriyor, ancak denetim merkezindeki gerçek ekran değil. Genellikle, ilerleme 0:01'de kalkar ve sadece hareket etmez. Ancak, uygulamamdaki kaydırıcıyı kullanmayı ve kontrol merkezine geri dönmeyi seçersem, aradığım süreyi gösterir, ancak bu süre boyunca kalır. Diğer sorular ve tarafından tavsiye edildiği

func setNowPlaying(_ dura: Float, timePlayed: Float) { 
    let s = songs[playbackInstance.currentSongIndex] 
    let albumArt = MPMediaItemArtwork.init(boundsSize: CGSize(width: 480, height: 360), requestHandler: { (size) -> UIImage in 
     return self.songImageView.image ?? #imageLiteral(resourceName: "WhiteMusic") 
    }) 
    let songInfo: [String: Any]? = [ 
     MPMediaItemPropertyTitle: s.name, 
     MPMediaItemPropertyArtist: s.artist, 
     MPMediaItemPropertyArtwork: albumArt, 
     MPMediaItemPropertyPlaybackDuration: dura, 
     MPNowPlayingInfoPropertyElapsedPlaybackTime: CMTimeGetSeconds(player.currentTime()) 
    ] 

    MPNowPlayingInfoCenter.default().nowPlayingInfo = songInfo 
} 

ben yönteme geçirilir timePlayed değişkene MPNowPlayingInfoPropertyElapsedPlaybackTime ayarlamak için kullanılan, ancak çalışma değildi çünkü ben player.currentTime() çalıştı: Burada

benim setNowPlaying kodudur Muhtemelen zaten kullandığımdan daha iyi bir ölçüdür.

@IBAction func sliderChanged(_ sender: UISlider) { 
    if timer.isValid { 
     currentTimeLabel.text = secondsToText(sender.value) 
     player.seek(to: CMTimeMakeWithSeconds(Float64(sender.value), player.currentItem!.currentTime().timescale)) 
    } 
} 

kontrol merkezi bilgi güncelleyecektir tek şey Nedense: Burada

yardımcı olur durumda arayan kodudur.

+1

Hangi ileti dizisi setNowPlaying() çağrılıyor? Ana iş parçacığında mı yoksa ikincil mi? –

+0

@CharlesSrstka ana konu – lagoon

cevap

0

Bu benim için çalıştı, belki size yardımcı olacaktır.

  func setNowPlaying(_ dura: Float, timePlayed: Float) { 
      let s = songs[playbackInstance.currentSongIndex] 
      let albumArt = MPMediaItemArtwork.init(boundsSize: CGSize(width: 480, height: 360), requestHandler: { (size) -> UIImage in 
       return self.songImageView.image ?? #imageLiteral(resourceName: "WhiteMusic") 
      }) 

      MPNowPlayingInfoCenter.default().nowPlayingInfo = [ 
       MPMediaItemPropertyTitle: s.name, 
       MPMediaItemPropertyArtist: s.artist, 
       MPMediaItemPropertyArtwork: albumArt as Any, 
       MPMediaItemPropertyPlaybackDuration: dura, 
       MPNowPlayingInfoPropertyElapsedPlaybackTime : player.currentTime() 
      ] 
      UIApplication.shared.beginReceivingRemoteControlEvents() 
      becomeFirstResponder() 

     } 


     @IBAction func sliderAction(_ sender: Any) { 
       if player != nil { 
        Thread.cancelPreviousPerformRequests(withTarget: self) 
        self.perform(#selector(playAtSelectedTime) , with: nil, afterDelay: 0.2) 
       } 
      } 

     @objc func playAtSelectedTime(){ 
       let selectedTime = Double(progressSlider.value) 
       player.currentTime = selectedTime 
       convertTimingToTextLabel(selectedTime, label: self.runningLabel) 
       convertTimingToTextLabel(Double(player.duration-player.currentTime), label: self.durationLabel) 
       durationLabel.text = " -"+durationLabel.text! 
       updateSlider() 
      } 


     func updateSlider(){ 
       if timer != nil{ 
        timer.invalidate() 
       } 

       timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(playingSong) , userInfo: nil, repeats: true) 
      } 


     @objc func playingSong(){ 
       progressSlider.minimumValue = 0 
       progressSlider.maximumValue = Float(player.duration) 
       progressSlider.value = Float(player.currentTime) 

       convertTimingToTextLabel(Double(player.currentTime), label: self.runningLabel) 
       convertTimingToTextLabel(Double(player.duration-player.currentTime), label: self.durationLabel) 
       durationLabel.text = durationLabel.text! 
      } 



      func convertTimingToTextLabel(_ time: Double, label: UILabel) { 
        let minute = Int(time/60) 
        let seconds = Int(time - Double(minute * 60)) 
        setTimingSongForLabel(minute, seconds: seconds, label: label) 
       } 

      func setTimingSongForLabel(_ minute: Int, seconds: Int, label: UILabel) { 
        let mStr = minute > 9 ? "\(minute)":"0\(minute)" 
        let sStr = seconds > 9 ? "\(seconds)":"0\(seconds)" 
        label.text = "\(mStr):\(sStr)" 
       } 
+0

Herhangi bir sorunuz varsa veya hala çalışmıyorsa, lütfen size yardımcı olabilmeniz için player'ınızın tam kodunu gönderin. – cwilliamsz

İlgili konular