8

音楽プレーヤーを含むアプリを作成しています。しばらく取り組んでいませんでしたが、最後に取り組んだときはうまくいきましたnowPlayingInfo 。今、Swift 3 に更新すると、進行状況バーを除いてすべてが機能します。

ここで、競合状態とそれが何かによってオーバーライドされていることについて話している同様の質問をいくつか見ましたが、何が原因かわかりません。私はAVQueuePlayerそれが役立つ場合を使用しています。

スキップと前のボタンは機能し、アルバム アート、タイトル、アーティストは完全に更新されますが、経過時間は更新されません。デバッグすると、MPNowPlayingInfoPropertyElapsedPlaybackTimefromMPNowPlayingInfoCenter.default().nowPlayingInfoには正しい数値が表示されますが、コントロール センターの実際の画面には表示されません。通常、進行状況は 0:01 でスタックし、動かないだけです。ただし、アプリでスライダーを使用してシークし、コントロール センターに戻ると、シークした時間が表示されますが、そのままです。

これが私のsetNowPlayingコードです:

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
}

以前はメソッドに渡された変数に設定MPNowPlayingInfoPropertyElapsedPlaybackTimeしていましたtimePlayedが、機能していなかったので、player.currentTime()他の質問で推奨されているように試してみましたが、とにかく使用していたものよりもおそらく優れた尺度です。

これが役立つ場合のシークのコードは次のとおりです。

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

何らかの理由で、コントロール センターの情報を更新する唯一のものです。

4

2 に答える 2