Получение уведомлений с помощью приложения в фоновом режиме

У меня есть приложение, которое будет отслеживать все, что пользователь делает в приложении iPod. Для этого я добавил несколько наблюдателей в NSNotificationCenter, например, MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Но моя проблема в том, что я получаю эти уведомления только тогда, когда мое приложение находится на переднем плане, если оно находится в фоновом режиме, система добавляет уведомление в очередь, а затем, когда мое приложение становится активным, оно доставляет его мне. Меня не интересует эта очередь, так как я хочу получать уведомления в режиме реального времени.

Могу ли я получить эти уведомления, даже если мое приложение находится в приостановленном состоянии? Я хочу запускать только 3 строки кода каждый раз, когда я получаю уведомления NowPlayingItemDidChange, например.

Здесь я добавляю наблюдателя.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer];



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

     [notificationCenter addObserver: self selector: @selector(handle_NowPlayingItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification

                                    object:iPodMediaPlayer];


 [iPodMediaPlayer beginGeneratingPlaybackNotifications];

Кроме того, если я добавлю объект наблюдателя другого типа вместо iPodMediaPlayer, наблюдатель не будет вызывать метод.

Большое спасибо,

Abras

3 ответа

Приложения iOS приостановлены, когда они не на переднем плане. Есть три исключения из этого правила. Вы можете выполнить код в фоновом режиме, если ваше приложение

а) Воспроизведение аудио. Это означает, что само приложение фактически генерирует аудио. Насколько я понимаю, объект MPMediaPlayerController iPodMusicPlayer управляет только воспроизведением внешнего процесса iPod, а не воспроизведением звука из самого приложения. Возможно, вы могли бы добиться успеха, если бы вы вызвали applicationMusicPlayer вместо iPodMusicPlayer и установили соответствующие фоновые флаги в вашем Info.plist приложений. Это кажется наиболее законным способом заставить ваше приложение работать, но вы не сможете управлять воспроизведением iPod из приложения iPod, только ваше приложение и управление звуком системы.

б) Получите ваше приложение для мониторинга местоположения. Если приложение использует GPS, оно может продолжать выполняться в фоновом режиме. Недостатком этого является то, что GPS разряжает батарею, и пользователи могут быть напуганы тем, что вы запрашиваете их местоположение.

c) Попросите UIApplication за дополнительное время. Если вы используете метод beginBackgroundTask в UIApplication, ваше приложение будет работать в течение определенного времени в фоновом режиме. Если ваши пользователи будут заходить в ваше приложение каждые десять минут или около того, это также может сработать.

Надеюсь, это поможет.

Как я объяснил здесь, iOS получает уведомления Media Player, когда приложение находится в фоновом режиме, кажется, что нет способа получать уведомления от iPodMusicPlayer.

Про Омара Рауля Кази ответ:

а) Я пытался, и у меня не было успеха. Музыка продолжала снижаться при нажатии кнопки домой. Я думаю, что этот фоновый флаг работает только для обычных AudioSessions, а не для MPMusicPlayer...

б) я не уверен, что это сработает, и я не думаю, что Apple понравится, когда ищет одобрения

в) Вы можете запускать в фоновом режиме только синхронные задачи. Вы не можете ждать там уведомления. Я ошибся?

Многозадачность в iOS в настоящее время очень ограничена. Вы можете запустить фоновое задание, используя beginBackgroundTaskWithExpirationHandler: метод (объекта UIApplication), но он предназначен для завершения задачи конечной длины перед приостановкой. Все фоновые задачи могут истечь (и быть прекращены), прежде чем он завершит свою работу. Вы можете проверить, как долго ваше приложение может работать, проверив backgroundTimeRemaining свойство объекта приложения.

Другие вопросы по тегам