Как сохранить работоспособность приложения для iPhone в фоновом режиме
Во-первых, я знаю, что есть только поддержка приложений VoIP, аудио и локации, которые могут работать в фоновом режиме, и они будут работать только во время воспроизведения аудио или при использовании служб определения местоположения и т. д.
Что я хочу знать, так это то, что есть ли способ сохранить работоспособность моего приложения в фоновом режиме, не влияя на срок службы батареи.
Таким образом, пользователь моего приложения может выбрать из настроек, чтобы сохранить приложение в любое время и в течение определенного периода времени. например, если он ожидает чего-то, что требует запуска приложения, после получения сообщений он может отключить функцию поддержки активности.
Я не знаю, возможно ли это, но я читал пост, в котором говорится, но, к сожалению, они не сказали, как это сделать =(
ОБНОВЛЕНИЕ: В этом руководстве я обнаружил, что в Apple Store есть два приложения Acrobits, которые "могут заставить приложение оставаться в живых и бодрствовать в фоновом режиме". Так есть способ сделать это?
6 ответов
Вы можете выполнять задачи в течение ограниченного времени после того, как ваше приложение направлено в фоновый режим, но только в течение предоставленной продолжительности. Запуск дольше, чем это приведет к прекращению работы вашего приложения. См. " Завершение длительной задачи в фоновом режиме" в Руководстве по программированию приложений для iOS, чтобы узнать, как это сделать.
Другие используют проигрывание звука в фоновом режиме как средство поддержания жизнедеятельности в качестве фонового процесса, но Apple примет такое приложение только в том случае, если воспроизведение звука является законной функцией. В пункте 2.16 опубликованных рекомендаций Apple по рассмотрению говорится:
Многозадачные приложения могут использовать фоновые сервисы только по назначению: VoIP, воспроизведение аудио, местоположение, завершение задачи, локальные уведомления и т. Д.
Начиная с ioS 7, есть новые способы запуска приложений в фоновом режиме. Apple теперь признает, что приложения должны постоянно загружать и обрабатывать данные.
Вот новый список всех приложений, которые могут работать в фоновом режиме.
- Приложения, которые воспроизводят звуковой контент для пользователя в фоновом режиме, например приложение музыкального проигрывателя
- Приложения, которые записывают аудио контент в фоновом режиме.
- Приложения, которые постоянно информируют пользователей о своем местонахождении, такие как навигационное приложение
- Приложения, которые поддерживают передачу голоса по Интернет-протоколу (VoIP)
- Приложения, которые должны регулярно загружать и обрабатывать новый контент
- Приложения, которые получают регулярные обновления от внешних аксессуаров
Вы можете объявить поддерживаемые фоновые задачи приложения в Info.plist, используя X Code 5+. Например, добавление ключа UIBackgroundModes в файл Info.plist вашего приложения и добавление значения "fetch" в массив позволяет вашему приложению регулярно загружать и обрабатывать небольшие объемы контента из сети. Вы можете сделать то же самое на вкладке "Возможности" свойств приложения в XCode 5 (прикрепление снимка)
Вы можете найти больше об этом в документации Apple
Если какая-либо фоновая задача выполняется более 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");
}
Для запуска на стандартных устройствах iOS сделайте свое приложение аудиоплеером / рекордером или приложением VOIP, законным для отправки в магазин приложений или поддельным, если только для собственного использования.
Даже это не сделает приложение "полностью работоспособным", как бы то ни было, но ограничит API.
Зависит от того, что он делает. Если ваше приложение занимает слишком много памяти или выполняет вызовы функций / классов, этого не должно быть, SpringBoard может прекратить его. Тем не менее, он, скорее всего, будет отклонен Apple, так как он не соответствует их 7 второстепенным применениям.
Может быть, это поможет справка bcz. Возможно, вам придется реализовать код в Appdelegate в приложении, запущенном в фоновом режиме. Также обратитесь к сайту developer.apple.com для получения информации о классе приложения. Вот ссылка для запуска приложения в фоновом режиме.