2015-08-30 3 views
2

У меня есть приложение, которое позволяет вам искать название песни в музыкальной библиотеке и воспроизводить ее. Я воспроизвести выбранную песню, используя этот код:MPMusicPlayerController.play() не работает после убийства музыкального приложения iOS

func playSongByPersistentID(id: Int) { //id is the persistent id of chosen song 
    let predicate = MPMediaPropertyPredicate(value: id, forProperty: MPMediaItemPropertyPersistentID) 
    let songQuery = MPMediaQuery() 
    songQuery.addFilterPredicate(predicate) 

    if songQuery.items?.count < 1 { 
     print("Could Not find song") // make alert for this 
     return 
    } else { 
     print("gonna play \(songQuery.items?[0].title)") 
    } 

    musicPlayer.prepareToPlay() 
    musicPlayer.setQueueWithItemCollection(songQuery.collections![0]) 
    musicPlayer.play() 
} 

выше функция вызывается в tableView(:didSelectRowAtIndexPath). Я подтвердил, что правильный текст и название песни извлекаются при выборе песни.

Вот моя проблема. Если я зайду в свое приложение и выберу песню, чтобы сыграть после убийства музыкального приложения iOS, песня не воспроизводится. Если я тогда выберу другую песню, эта игра не играет никакой проблемы. Если я выберу ту же песню снова и снова, она никогда не играет.

musicPlayer - systemMusicPlayer, заявленный в моем классе.

Является ли это ошибкой iOS? Я понятия не имею, что происходит.

+0

Я думаю, что это ошибка. Я борюсь с чем-то подобным в своем приложении - я дам вам знать, если я столкнулся с обходными решениями. –

+0

Спасибо. Это было очень неприятно. – MortalMan

ответ

1

Вот обходной путь, который я нашел.

Что он делает, это установить таймер, как только я попытаюсь начать воспроизведение музыки. Этот таймер вызывает функцию, которая проверяет, играет ли музыка. Если музыка воспроизводится, таймер становится недействительным. Если нет, он переупорядочивает элемент, который я хочу воспроизвести (коллекция элементов в этом примере), и пытается снова воспроизвести.

Я вытащил этот код из своего приложения и абстрагировал его, поэтому он не может компилироваться, как есть, но, надеюсь, он получает точку. Я собираюсь записать эту ошибку с помощью Apple (после создания небольшого образца проекта) и рекомендую вам сделать то же самое.

func playMusic() 
{  
    musicPlayer = MPMusicPlayerController.applicationMusicPlayer() 

    musicPlayer.setQueueWithItemCollection(MPMediaItemCollection(items: songsForPlayingWithMusicPlayer)) 

    musicPlayer.play() 

    testForMusicPlayingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(1), target: self, selector: "testForMusicPlaying", userInfo: nil, repeats: false) 
} 

func testForMusicPlaying() 
{ 
    if musicPlayer.playbackState != .Playing 
    { 
     testForMusicPlayingTimer.invalidate() 

     musicPlayer = MPMusicPlayerController.applicationMusicPlayer() 

     musicPlayer.setQueueWithItemCollection(MPMediaItemCollection(items: songsForPlayingWithMusicPlayer)) 

     musicPlayer.play() 

     testForMusicPlayingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(1), target: self, selector: "testForMusicPlaying", userInfo: nil, repeats: false) 
    } 
    else 
    { 
     testForMusicPlayingTimer.invalidate()  
    } 
} 
+1

Когда вы отправляете свой радар, вы можете добавить его в openradar, и я обману его. – MortalMan

+0

Я подал радар: https://openradar.appspot.com/radar?id=4996591224094720 –

 Смежные вопросы

  • Нет связанных вопросов^_^