Как сохранить работоспособность приложения для iPhone в фоновом режиме - PullRequest
32 голосов
/ 21 сентября 2010

Прежде всего, я знаю, что есть поддержка только для приложений voip, аудио и определения местоположения, которые могут работать в фоновом режиме, и что они будут работать только во время воспроизведения звука или при использовании служб определения местоположения и т. Д.

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

Таким образом, пользователь моего приложения может выбрать из настроек, чтобы сохранитьживой приложение, когда он хочет и только на количество времени, которое он желает.например, если он ожидает чего-то, что требует запуска приложения, после получения сообщений он может отключить функцию поддержки активности.

Я не знаю, возможно ли это, но я прочитал какой-то пост, которыйскажем так, но, к сожалению, они не сказали, как = (

ОБНОВЛЕНИЕ: В этом руководстве я обнаружил, что у Acrobits есть два приложения в Apple Store, которые "могут заставить приложение оставатьсяжив и бодрствует на заднем плане ". Так есть ли способ сделать это?

Ответы [ 6 ]

31 голосов
/ 23 сентября 2013

Начиная с ioS 7, есть новые способы запуска приложений в фоновом режиме. Apple теперь признает, что приложения должны постоянно загружать и обрабатывать данные.

Вот новый список всех приложений, которые могут работать в фоновом режиме.

  1. Приложения, которые воспроизводят звуковой контент для пользователя в фоновом режиме, например приложение музыкального проигрывателя
  2. Приложения, которые записывают аудиоконтент в фоновом режиме.
  3. Приложения, которые постоянно информируют пользователей об их местонахождении, например приложение для навигации
  4. Приложения, поддерживающие передачу голоса по Интернет-протоколу (VoIP)
  5. Приложения, которым необходимо регулярно загружать и обрабатывать новый контент
  6. Приложения, которые регулярно получают обновления от внешних аксессуаров

Вы можете объявить поддерживаемые фоновые задачи приложения в Info.plist, используя X Code 5+. Например, добавление ключа UIBackgroundModes в файл Info.plist вашего приложения и добавление значения «fetch» ​​в массив позволяет вашему приложению регулярно загружать и обрабатывать небольшие объемы контента из сети. Вы можете сделать то же самое на вкладке «Возможности» свойств приложения в XCode 5 (прикрепление снимка)

Capabilities tab in XCode 5 Вы можете найти об этом в документации Apple

19 голосов
/ 21 сентября 2010

Вы можете выполнять задачи в течение ограниченного времени после того, как ваше приложение направлено в фоновый режим, но только в течение предоставленной продолжительности.Запуск дольше, чем это приведет к тому, что ваше приложение будет прекращено.Чтобы узнать, как это сделать, см. Раздел « Завершение длительной задачи в фоновом режиме » Руководства по программированию приложений для iOS.

Другие пользователи воспользовались воспроизведением звука в фоновом режиме какозначает остаться в живых как фоновый процесс, но Apple примет такое приложение, только если воспроизведение звука является законной функцией.В п. 2.16 опубликованных руководящих принципов Apple по рассмотрению говорится:

Многозадачные приложения могут использовать фоновые сервисы только по назначению: VoIP, воспроизведение аудио, местоположение, выполнение задач, локальные уведомления и т. Д.

7 голосов
/ 09 июля 2013

Если какая-либо фоновая задача выполняется более 10 минут, тогда задача будет приостановлена, и для очистки задачи вызывается блок кода, указанный в beginBackgroundTaskWithExpirationHandler. оставшееся время фона можно проверить с помощью [[UIApplication sharedApplication] backgroundTimeRemaining]. Изначально, когда приложение находится на переднем плане, backgroundTimeRemaining имеет большее значение. Когда приложение переходит в фоновый режим, вы можете видеть, что значение backgroundTimeRemaining уменьшается с 599.XXX (10 минут). как только backgroundTimeRemaining станет нулевым, фоновая задача будет приостановлена.

        //1)Creating iOS Background Task
        __block UIBackgroundTaskIdentifier background_task;
        background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

               //This code block is execute when the application’s 
               //remaining background time reaches ZERO.
          }];


        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //### background task starts

            //#### background task ends
        });

        //2)Making background task Asynchronous
        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
        {
            NSLog(@"Multitasking Supported");

            __block UIBackgroundTaskIdentifier background_task;
            background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

                //Clean up code. Tell the system that we are done.
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid;
            }];


        **//Putting All together**
            //To make the code block asynchronous
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                //### background task starts
                NSLog(@"Running in the background\n");
                while(TRUE)
                {
                    NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
                    [NSThread sleepForTimeInterval:1]; //wait for 1 sec
                }
                //#### background task ends

                //Clean up code. Tell the system that we are done.
                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid; 
            });
        }
        else
        {
            NSLog(@"Multitasking Not Supported");
        }
3 голосов
/ 21 сентября 2010

Для работы на стандартных устройствах iOS, сделайте ваше приложение аудиоплеером / рекордером или приложением VOIP, законным для отправки в магазин приложений или поддельным, если только для вашего собственного использования.

Даже это не сделает приложение «полностью работоспособным», как бы то ни было, но ограничит API-интерфейсами.

2 голосов
/ 21 сентября 2010

Зависит от того, что он делает. Если ваше приложение занимает слишком много памяти или выполняет вызовы функций / классов, этого не должно быть, SpringBoard может прекратить его. Тем не менее, Apple, скорее всего, отклонит его, так как он не соответствует их использованию в фоновом режиме.

1 голос
/ 21 июля 2011

Может быть, эта ссылка поможет bcz. Возможно, вам придется реализовать код в Appdelegate в приложении, запущенном в фоновом режиме. Также обратитесь к сайту developer.apple.com для класса приложения Здесь - ссылка для запуска приложения в фоновом режиме

...