Подтвердить что ты не робот

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

У меня есть приложение, которое будет отслеживать все, что пользователь делает в приложении 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, наблюдатель не вызовет этот метод.

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

Абрас

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Об Омаре Рауле Кази:

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

b) Я не уверен, что это сработает, и я не думаю, что Apple захочет это, когда ища одобрения.

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