在后台模式下接收App的通知

我有一个应用程序,可以跟踪用户在iPod应用程序中执行的所有操作。 为此,我添加了一些观察员到NSNotificationCenter,像MPMusicPlayerControllerNowPlayingItemDidChangeNotification。 但是我的问题是,当我的应用程序处于前台时,我只会收到这些通知,如果它在后台,系统会将通知添加到队列中,然后下次我的应用程序变为活动状态时,会将其传递给我。 我对这个队列没有兴趣,因为我想接收实时通知。

即使我的应用程序处于暂停状态,有没有办法让我收到这些通知? 每次我得到这个NowPlayingItemDidChange通知时,我只想运行3行代码。

这里是我添加观察者的地方。

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; [notificationCenter addObserver: self selector: @selector(handle_NowPlayingItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:iPodMediaPlayer]; [iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

此外,如果我添加另一种对象而不是iPodMediaPlayer的观察者,观察者将不会调用该方法。

非常感谢,

阿巴拉

iOS应用程序不在前台时被暂停。 这个规则有三个例外。 如果您的应用程序是您可以在后台执行代码

a)播放audio。 这意味着应用程序本身实际上是生成audio。 我的理解是,MPMediaPlayerController iPodMusicPlayer对象只控制外部iPod进程的播放,而不是从应用程序本身播放audio。 如果您调用applicationMusicPlayer而不是iPodMusicPlayer,并在应用程序Info.plist中设置适当的背景标志,也许可以取得一些成功。 这似乎是让您的应用程序正常工作的最合法的方式,但是您将无法通过iPod应用程序控制iPod播放,只能控制应用程序和系统audio控件。

b)让你的应用程序来监视位置。 如果应用程序正在使用GPS,它可以继续在后台执行。 而GPS的function就是消耗电量,而用户可能会不知所措地要求他们的位置。

c)询问UIA申请额外的时间。 如果您使用UIApplication的beginBackgroundTask方法,则您的应用程序将在后台继续运行有限的时间。 如果您的用户每隔十分钟左右进入您的应用程序,那么这也可以起作用。

希望有所帮助。

iOS中的多任务处理目前非常有限。 您可以使用(UIApplication对象的) beginBackgroundTaskWithExpirationHandler:方法启动后台任务,但是它的目的是在暂停之前完成有限长度的任务。 所有后台任务可能会在作业结束之前过期(并终止)。 您可以通过检查应用程序对象的backgroundTimeRemaining属性来检查应用程序能够运行多久。

正如我在这里解释的, 当应用程序在后台时 , iOS会收到媒体播放器通知 ,似乎没有办法从iPodMusicPlayer获取通知。

关于奥马尔·劳尔·卡齐回答:

a)我尝试过,但没有成功。 按Home键时音乐不断下降。 我认为这个背景标志只适用于普通的AudioSessions而不适用于MPMusicPlayer …

b)我不确定这是否有效,我不认为苹果在寻求批准时会喜欢它

c)你只能在后台运行同步任务。 你不能在那里等待通知。 我错了吗?