11313


以下のような画面構成で音楽プレイヤーを作成しています。  
[アルバム一覧画面] → [選択されたアルバムの曲一覧画面] → [再生画面]  
画面の遷移はナビゲーションコントローラを用いています。

そこで以下の手順で操作を行うと、`MPMusicPlaybackState`が正しい状態を取得しなくなります。  
1. 起動するとアルバム一覧画面が表示されるので、任意のアルバムを選択する。  
2. 曲一覧画面に移動するので、曲を選択する。  
3. 再生画面に移動し音楽が再生される。  
ここでは問題なく`MPMusicPlaybackState`の取得、制御ができます。  
4. ナビゲーションでアルバム一覧ページまで戻り、別のアルバムを選択し再生する。  
5. すると音楽が再生されているにも関わらず`MPMusicPlaybackState`が常に`Paused`となり、  
制御できなくなってしまいます。  
6. 再度曲一覧まで戻り、別の曲を選択すると`MPMusicPlaybackState`  
が取得できるようになります。

これは画面の移動時に何か処理が足りないのでしょうか？

色々調べたところ、以下のページで過去に似たような質問をされている方がいました。  
<https://stackoverflow.com/questions/10118726/getting-wrong-playback-state-in-
mp-music-player-controller-in-ios-5>  
かなり古い質問ですが、昔はバグとして存在していたのでしょうか？  
iOS8で修正されたとコメントしている方もいますが・・・

以下は再生・停止ボタンのコードです。

[code]

    //再生・停止ボタンアクション
    @IBAction func playPauseB(sender: UIButton) {
        var playerStatus = player.playbackState
        if playerStatus == MPMusicPlaybackState.Playing{
            player.pause()
            playPauseBOutlet.setImage(playB, forState: UIControlState.Normal)
        } else if playerStatus == MPMusicPlaybackState.Paused {
            player.play()
            playPauseBOutlet.setImage(PauseB, forState: UIControlState.Normal)
        }
    }
    
[/code]

ご指摘やアドバイスお願いいたします。


CC BY-SA 3.0
2015-06-13T02:00:37.120
11304
2015-06-13T10:23:55.810
2017-05-23T12:38:55.250
-1
9857
question
swift
MPMusicPlaybackStateが正しい状態を取得しない。


質問の内容だけでは処理が足りないかどうかは判断できないですが、MPMusicPlayerControllerのplaybackStateがおかしくなる現象は存在します。自分はiOS7とiOS8で確認しました。

自分が確認した時の手順については、以下のページにまとめてあります。少し古いものですが。

MPMusicPlayerController::playbackStateがおかしくなる問題 - 開発メモ  
<http://seeku.hateblo.jp/entry/2014/07/07/164821>

この現象への対策ですが、一番手っ取り早いのはplaybackStateを使わないことだと思われます。  
（質問に書かれてるstackoverflow.comの回答と、本質的には同じことです）

[code]

    import AVFoundation
    
    /// 再生中か？
    func isMusicPlayerPlaying() -> Bool {
    
        // player.playbackStateは信頼出来ないので、
        // AVAudioSessionで再生状況を調べる
        let av = AVAudioSession.sharedInstance()
        return av.otherAudioPlaying
    }
    
[/code]

こんな感じで、AVAudioSessionのレベルで音声が再生されているかどうかをチェックすることが可能です。

ただし、AVAudioSessionのレベルで音声の再生状況を取得するようにした場合、
**MPMusicPlayerControllerPlaybackStateDidChangeNotificationが送られてきても、その時点では、AVAudioSessionの再生状況に反映されてない**
という問題が発生するため、MPMusicPlayerControllerからの通知を使ってる場合は、その部分で何らかの処理が必要になります。


CC BY-SA 3.0
2015-06-13T10:23:55.810
11313
2015-06-13T10:23:55.810
7459
11304
answer