在后台模式下使用应用程序接收通知

13
我有一个应用程序,它将跟踪用户在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,则观察者将不会调用该方法。

非常感谢,

Abras

3个回答

6
iOS应用在不处于前台时会被挂起。但有三个例外情况,可以让应用在后台执行代码:
a) 播放音频。这意味着应用本身实际上正在生成音频。我的理解是,MPMediaPlayerController iPodMusicPlayer对象仅控制外部iPod进程的播放,而不是从应用本身播放音频。也许,如果您调用applicationMusicPlayer并在应用程序的Info.plist中设置适当的后台标志,则可能会成功。这似乎是让应用程序正常工作的最合法方式,但您将无法从iPod应用程序控制iPod播放,只能从您的应用程序和系统音频控件控制。
b) 让您的应用程序监视位置。如果应用程序使用GPS,则可以在后台继续执行。缺点是GPS会消耗电池电量,并且用户可能会感到不安,因为您要求他们的位置信息。
c) 请求UIApplication额外的时间。如果使用UIApplication的beginBackgroundTask方法,则应用程序将在后台继续运行有限的时间。如果您的用户每十分钟左右就要进入应用程序一次,那么这也可能有效。
希望这可以帮助您。

1
是的,我知道只有这三个选项。但我想也许有一种方法可以在系统中注册通知,然后您的应用程序会正常进入后台模式。如果用户执行某些触发通知的操作,则通知中心会唤醒您的应用程序,以便它可以响应通知。响应后,它将像往常一样返回后台模式。 - Abras
@Abras:你找到怎么做了吗?我有一个音频应用程序。当它在后台运行时,我希望它能接收到通知(其他音频应用程序启动时)。我该怎么办? - Namratha
@Abras 你最终解决了这个问题吗? - Wyetro

0
如我在这里解释的iOS receive Media Player Notifications when app is in background,似乎没有办法从iPodMusicPlayer获取通知。
关于Omar Raul Qazi的回答:
a)我尝试过,但没有成功。当按下主页按钮时,音乐会继续播放。我认为这个后台标志只适用于普通的AudioSessions,而不适用于MPMusicPlayer...
b)我不确定这是否有效,而且我认为在寻求批准时,苹果公司可能不会喜欢它。
c)您只能在后台运行同步任务。您不能在那里等待通知。我错了吗?

0
iOS中的多任务处理目前非常受限。你可以使用beginBackgroundTaskWithExpirationHandler:方法(UIApplication对象的方法)启动一个后台任务,但它只能在暂停之前完成一个有限长度的任务。所有后台任务在完成工作之前都可能过期(并被终止)。你可以通过检查应用程序对象的backgroundTimeRemaining属性来查看应用程序还可以运行多久。

是的,但那不是我想要的。我希望每次用户触发通知时都能调用我的应用程序。 - Abras
没错,我是说在我所知道的范围内是没有办法实现的。 - MHC
是的,谢谢你的建议。我想我的选择将是实现自己的iPod并将其构建到我的应用程序中。它可能不太用户友好,但至少我可以实现我想要的功能。 - Abras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接