2010-08-21 80 views
10

我正在爲iPod播放器控制器使用音樂播放器屬性。MPMusicPlayerController:當iPod App在後臺終止時,iPod停止發送通知

// .h 
@property (nonatomic, retain) MPMusicPlayerController *ipodPlayer; 

// .m 
ipodPlayer = [MPMusicPlayerController iPodMusicPlayer]; 

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

[notificationCenter addObserver:self selector:@selector(changedPlaybackState:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:ipodPlayer]; 
[notificationCenter addObserver:self selector:@selector(changedNowPlayingItem:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:ipodPlayer]; 

[ipodPlayer beginGeneratingPlaybackNotifications]; 

在後臺處理,如果iPod播放器的應用程序被終止,控制檯打印出:

MediaPlayer: Message playbackState timed out. 

如果它不會崩潰(或結冰,會降低性能),通知不被髮送到我的觀察方法了。我仍然可以發送郵件一樣:

[ipodPlayer pause]; 
[ipodPlayer play]; 
[ipodPlayer skipToNextItem]; 
[ipodPlayer skipToPreviousItem]; 

但不能收到任何通知

我的問題是:

  1. 的是,有辦法重新分配,在運行時加載的指針?我怎樣才能恢復財產爲,就像它首次推出時一樣?
  2. 我該如何抓住這個問題:「MediaPlayer:Message playbackState超時。」在控制檯輸出?這不像使用NSLog。

謝謝你幫助我。

更新: 好像使用assignweak爲ipodPlayer財產的解決方案。此外,訪問它是假設該物業可能不在那裏。經過多次試用和一年的實際使用後,我認爲這是正確的解決方案。

+0

您使用的是iOS 5嗎?如果沒有,那麼你應該這樣做: self.ipodPlayer = [MPMusicPlayerController ...] 否則在理論上,由iPodMusicPlayer創建的實例將被收集,並且您還沒有加入ref計數,因此您將得到一個空指針在某一點。除非您在每次與音樂播放器進行互動之前調用此方法,這可能是您遇到問題的另一個原因。一個實例被收集,你不會將自己附加到新的實例? – hktegner 2011-12-12 08:54:47

+0

感謝您評論這篇舊文章。我改變了我的訪問這個ipodPlayer屬性的流程,因爲它可能不存在。所以,我讓屬性使用'assign'或'weak',並用'[MPMusicPlayerController iPodMusicPlayer];'將其初始化;'只要它不存在 – petershine 2011-12-13 01:49:58

回答

1

我在iOS 5中遇到了與我的MpMoviePlayerController類似的問題。我找到了解決方法。它也可以在這裏工作。

地址:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

viewDidLoad

更多我的其他post

+0

謝謝你回答這個舊帖子。由於我沒有使用'AVAudioPlayer',我不知道這是否適合我。相反,我確定使用弱分配對於iPodPlayer屬性,並且自從像這樣使用它之後,崩潰的發生幾乎不會發生。猜猜它與引用一個不屬於我的對象有關。不管怎麼說,還是要謝謝你 – petershine 2011-11-21 01:18:22