我有一个应用程序,可以跟踪用户在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添加另一种对象,观察者将不会调用该方法。
非常感谢,
阿巴拉
答案 0 :(得分:6)
iOS应用程序在不在前台时会被暂停。此规则有三个例外。如果您的应用程序是
,您可以在后台执行代码a)播放音频。这意味着应用程序本身实际上正在生成音频。我的理解是MPMediaPlayerController iPodMusicPlayer对象只控制外部iPod进程的播放,而不是从应用程序本身播放音频。如果你调用applicationMusicPlayer而不是iPodMusicPlayer并在应用程序Info.plist中设置适当的后台标志,也许你可以取得一些成功。这似乎是让您的应用程序正常工作的最合法方式,但您无法通过iPod应用程序控制iPod播放,只能控制应用程序和系统音频控件。
b)让您的应用监控位置。如果应用程序正在使用GPS,它可以继续在后台执行。这方面的缺点是GPS将耗尽电池,用户可能会被要求他们的位置。
c)请求UIApplication额外的时间。如果您使用UIApplication的beginBackgroundTask方法,您的应用程序将在后台继续运行有限的时间。如果您的用户每十分钟左右进入您的应用程序一次,这也可以。
希望有所帮助。
答案 1 :(得分:0)
iOS中的多任务处理目前非常有限。您可以使用beginBackgroundTaskWithExpirationHandler:
方法(UIApplication对象)启动后台任务,但它可以在暂停之前完成一个有限长度的任务。所有后台任务可能在完成其工作之前到期(并终止)。您可以通过检查应用程序对象的backgroundTimeRemaining
属性来检查应用程序运行的时间。
答案 2 :(得分:0)
正如我在此处iOS receive Media Player Notifications when app is in background所解释的那样,似乎无法从iPodMusicPlayer获取通知。
关于Omar Raul Qazi回答:
a)我试过,但没有成功。按下主页按钮时音乐不断下降。我认为这个背景标志仅适用于普通的AudioSessions而不适用于MPMusicPlayer ......
b)我不确定这会起作用,我认为Apple在寻找批准时不会喜欢它
c)您可以在后台仅运行同步任务。你不能在那里等待通知。我错了吗?