在后台模式下使用 App 接收通知
Posted
技术标签:
【中文标题】在后台模式下使用 App 接收通知【英文标题】:Receiving Notifications with App in background mode 【发布时间】:2011-02-08 00:08:14 【问题描述】:我有一个应用程序,它将跟踪用户在 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,则观察者不会调用该方法。
非常感谢,
阿布拉斯
【问题讨论】:
【参考方案1】:ios 应用程序在它们不在前台时会被挂起。这条规则有三个例外。如果您的应用程序是,您可以让代码在后台执行
a) 播放音频。这意味着应用程序本身实际上正在生成音频。我的理解是 MPMediaPlayerController iPodMusicPlayer 对象只控制外部 iPod 进程的播放,而不是从应用程序本身播放音频。如果您调用 applicationMusicPlayer 而不是 iPodMusicPlayer 并在应用程序 Info.plist 中设置适当的背景标志,也许您会取得一些成功。这似乎是让您的应用程序正常工作的最合法方式,但您无法从 iPod 应用程序控制 iPod 播放,只能控制您的应用程序和系统音频控件。
b) 让您的应用监控位置。如果应用程序正在使用 GPS,它可以继续在后台执行。这样做的缺点是 GPS 会耗尽电池电量,用户可能会因为您正在请求他们的位置而感到害怕。
c) 向 UIApplication 请求额外的时间。如果您使用 UIApplication 的 beginBackgroundTask 方法,您的应用程序将继续在后台运行一段有限的时间。如果您的用户打算每十分钟左右进入您的应用程序一次,这也可以工作。
希望对您有所帮助。
【讨论】:
是的,我知道只有这三个选项。但我想也许有一种方法可以在系统中注册通知,然后您的应用程序将正常进入后台模式。如果用户做了一些触发通知的事情,那么通知中心会唤醒你的应用程序,以便它可以响应通知。响应后,它会正常返回后台模式。 @Abras:你知道怎么做吗?我有一个音频应用程序。我希望它在后台接收通知(当其他音频应用程序出现时)。我该怎么做? @Abras 你有没有想过这个问题?【参考方案2】:iOS 中的多任务处理目前是非常受限的。您可以使用(UIApplication 对象的)beginBackgroundTaskWithExpirationHandler:
方法启动后台任务,但它旨在在暂停之前完成有限长度的任务。所有后台任务都可能在完成其工作之前到期(并终止)。您可以通过检查应用程序对象的backgroundTimeRemaining
属性来检查您的应用程序可以运行多长时间。
【讨论】:
是的,但这不是我想要的。我希望每次用户触发通知时都调用我的应用程序。 没错。我是说没有办法做到这一点,嗯,据我所知。 是的,谢谢你的建议。我认为我的选择是实现我自己的 iPod 并将其构建到我的应用程序中。它不会对用户友好,但至少我可以实现我想要的。【参考方案3】:正如我在这里iOS receive Media Player Notifications when app is in background 解释的那样,似乎无法从 iPodMusicPlayer 获取通知。
关于奥马尔·劳尔·卡齐的回答:
a) 我试过了,但没有成功。按下主页按钮时音乐一直在下降。我认为这个背景标志只适用于普通的 AudioSessions 而不是 MPMusicPlayer...
b) 我不确定这是否可行,我认为 Apple 在寻求批准时不会喜欢它
c) 您只能在后台运行同步任务。你不能在那里等待通知。我错了吗?
【讨论】:
以上是关于在后台模式下使用 App 接收通知的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios Objective c 中检查推送通知是不是在后台模式下接收?