MPMusicPlayerController:当iPod App在后台终止时,iPod停止发送通知

问题描述:

我正在为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

我在iOS 5中遇到了与我的MpMoviePlayerController类似的问题。我找到了解决方法。它也可以在这里工作。

地址:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

viewDidLoad

更多我的其他post

+0

谢谢你回答这个旧帖子。由于我没有使用'AVAudioPlayer',我不知道这是否适合我。相反,我确定使用弱分配对于iPodPlayer属性,并且自从像这样使用它之后,崩溃的发生几乎不会发生。猜猜它与引用一个不属于我的对象有关。不管怎么说,还是要谢谢你 – petershine 2011-11-21 01:18:22