Как на телефоне включить фоновый режим: Как включить фоновый режим обмена данными на смартфоне Android?

Содержание

Как включить фоновый режим обмена данными на телефоне Samsung

Как включить и отключить фоновый режим на Androud

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

Смартфоны марки «Samsung», работают под управлением операционной системы «Android», которая поддерживает установку на телефоне огромного количества разнообразных приложений. Их можно скачать из официального Play Market на вашем устройстве, или других источников.

Для чего нужен обмен данных?

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

Для максимальной удобности, и экономии времени, приложения могут обновляться автоматически. Для этого нужно только указать в настройках приложения опцию «обновления в фоновом режиме».

Иногда, у некоторых пользователей, эта опция не работает, причиной может стать отключенный «фоновый режим обмена данными». Мы расскажем вам как его включить, если он отключен.

Как включить фоновый режим обмена данными на телефоне Samsung

Первым делом, для активации данного режима нужно зайти в меню «настройки». Эту кнопку можно найти на рабочем столе вашего телефона «Samsung», в режиме ожидания, или в списке приложений.

В настройках нужно перейти к пункту «Беспроводные сети», и там перейти в подменю «Передача данных».

Далее нужно в открытом перед вами окне, вверху, справа, с помощью специальной, расположенной там кнопки, открыть контекстное меню (значок — три черточки) и нажать в нем «Разрешить фоновую передачу данных».

Если вы видите там кнопку «Отключить фоновую передачу данных», то ничего делать не нужно — эта опция включена. В таком случае проблема того, что приложения не обновляются автоматически находится в другом. Возможно, вам поможет сервисный центр по обслуживанию смартфонов Samsung.

На устройствах под управлением операционной системы Android, с установленной версией 4.4, или ниже, фоновый режим передачи данных называется «автосинхронизация данных», и в настройках активировать нужно именно его.

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

Источник: https://blackview-experts.ru/

Не помогла статья?

Вы можете задать вопрос мастерам из нашего сервисного центра, позвонив по телефону или написав свой вопрос на форму обратной связи.

+7 (499) 504-32-97

Задать вопрос мастеру

Как включить приложение в фоновом режиме?

Статьи › Ютуб › Видео › Как в Ютубе смотреть видео в фоновом режиме?

*Откройте приложение «Настройки».

  • Нажмите Передача данных Передача мобильных данных.
  • Выберите сеть, для которой вы хотите посмотреть и ограничить трафик.
  • Прокрутите страницу вниз и выберите Google Play Маркет.
  • Нажмите Фоновый режим Неогранич. передача данных.

Разрешите приложению работать в фоновом режиме:

  • Откройте меню «Настройки» > «Приложения».
  • Выберите в списке нужное Вам приложение.
  • Выберите пункт «Батарея».
  • Включите «Разрешение фоновой деятельности».
  1. Как заставить приложение работать в фоновом режиме?
  2. Где в настройках найти фоновый режим?
  3. Как узнать какое приложение работает в фоновом режиме?
  4. Что такое включить фоновый режим?
  5. Как включить работу приложения в фоновом режиме на айфоне?
  6. Как работать в фоновом режиме?
  7. Что делать если не работает фоновый режим?
  8. Что такое фоновое приложение?
  9. Как сделать чтобы приложение работало в фоновом режиме самсунг?
  10. Что такое фоновый режим на айфоне?
  11. Что будет если остановить работу приложения?
  12. Нужно ли закрывать фоновые приложения?
  13. Как сделать так чтобы ютуб работал в фоновом режиме?
  14. Как убрать уведомление приложение работает в фоновом режиме?
  15. Как сделать чтобы приложение работало в фоновом режиме Xiaomi?
  16. Где находится фоновый режим в телефоне Xiaomi?
  17. Как узнать какие приложения запущены?
  18. Где в самсунге автозапуск приложений?
  19. Как заставить приложение работать в фоновом режиме Windows?
  20. Как сделать так чтобы видео с Ютуб работал в фоновом режиме?
  21. Как зафиксировать приложение на андроид?

Как заставить приложение работать в фоновом режиме?

Разрешите приложению работать в фоновом режиме

Откройте меню «Настройки» > «Приложения». Выберите в списке нужное Вам приложение. Выберите пункт «Батарея». Включите «Разрешение фоновой деятельности».

Где в настройках найти фоновый режим?

  • Откройте приложение «Настройки».
  • Нажмите Передача данных Передача мобильных данных.
  • Выберите сеть, для которой вы хотите посмотреть и ограничить трафик.
  • Прокрутите страницу вниз и выберите Google Play Маркет.
  • Нажмите Фоновый режим Неогранич. передача данных.

Как узнать какое приложение работает в фоновом режиме?

Первым делом перейдите в «Настройки», далее «Система», потом «Дополнительно» и «Параметры разработчика». В этом меню надо найти пункт «Работающие службы». Внутри вы увидите, какие приложения потребляют оперативную память и сможете их установить.

Что такое включить фоновый режим?

Фоновый режим — специальный режим работы некоторых программ и приложений, при котором процессы передачи и приема данных из интернета происходят без ведома пользователя.

Как включить работу приложения в фоновом режиме на айфоне?

Зайдите в раздел Основные;:

  • Зайдите в раздел Фоновое обновление приложений;
  • Переведите переключатель напротив пункта Фоновое обновление приложений в положение выключено (он станет неактивным).

Как работать в фоновом режиме?

Нажмите клавишу «Дополнительно» и откройте раздел «Батарея». Шаг 5. Выберите строку «Работа в фоновом режиме» и нажмите на нее, после чего подтвердите действие кнопкой «Ограничить». Для наглядности, на скриншотах выше можно заметить, что некоторые сервисы могут в значительной степени работать именно в фоне.

Что делать если не работает фоновый режим?

Не работает функция фонового воспроизведения:

  • Проверьте, не истек ли срок действия подписки
  • Попробуйте снова войти в нужный аккаунт
  • Проверьте, доступна ли подписка YouTube Premium в вашей стране
  • Проверьте настройки фонового воспроизведения
  • Обновите приложение
  • Проверьте настройки мобильного Интернета

Что такое фоновое приложение?

В Windows приложения могут продолжать выполнять действия, даже если вы не находитесь в активном окне приложения. Обычно такие приложения называют фоновыми. Вы можете решить, какие приложения будут работать в фоновом режиме, а какие нет.

Как сделать чтобы приложение работало в фоновом режиме самсунг?

Как закрепить экран:

  • Перейдите к экрану, который нужно закрепить.
  • Проведите вверх до середины экрана. Если после этого не откроется раздел «Обзор», перейдите к инструкциям для Android 8.1 и более ранних версий.
  • Нажмите на значок приложения вверху изображения.
  • Нажмите «Закрепить».

Что такое фоновый режим на айфоне?

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

Что будет если остановить работу приложения?

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

Нужно ли закрывать фоновые приложения?

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

Как сделать так чтобы ютуб работал в фоновом режиме?

Как включить режим:

  • Перейдите в настройки устройства Приложения и уведомления Дополнительные настройки Специальный доступ Картинка в картинке.
  • Выберите YouTube.
  • Нажмите Разрешить режим «Картинка в картинке».
  • Откройте приложение YouTube и перейдите в раздел «Настройки» Общие.
  • Включите переключатель «Картинка в картинке».

Как убрать уведомление приложение работает в фоновом режиме?

Теперь в приложениях прокрутите вниз и нажмите Android, а затем уведомления приложений. В списке уведомлений приложения прокрутите вниз и нажмите «Приложения» в фоновом режиме. Затем нажмите «Значение» и выберите «Низкий» из параметров.

Как сделать чтобы приложение работало в фоновом режиме Xiaomi?

📌 Как закрепить приложение в оперативной памяти на MIUI 12.5

Теперь для закрепления приложения в оперативной памяти вам понадобится фирменное приложение «Безопасность». Кликаете на шестеренку в правом верхнем углу. Находите пункт ускорение. Нажимаете на строку «Закрепленные приложения».

Где находится фоновый режим в телефоне Xiaomi?

Вы увидите в верхней правой части дисплея три вертикальные точки, на которые следует нажать. Появится всплывающее меню, где будет строка «Фоновые подключения».

Как узнать какие приложения запущены?

Чтобы просмотреть список запущенных приложений, в телефонах с ОС Android 6 или более поздней версией перейдите в меню Параметры разработчика > Запущенные приложения.

Где в самсунге автозапуск приложений?

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

Как заставить приложение работать в фоновом режиме Windows?

Выберите Начните, а затем выберите Параметры > конфиденциальности >фоновых приложений. В разделе Фоновые приложения убедитесь, что параметр Разрешить приложениям работать в фоновом режимевключен.

Как сделать так чтобы видео с Ютуб работал в фоновом режиме?

Как включить режим:

  • Перейдите в настройки устройства Приложения и уведомления Дополнительные настройки Специальный доступ Картинка в картинке.
  • Выберите YouTube.
  • Нажмите Разрешить режим «Картинка в картинке».
  • Откройте приложение YouTube и перейдите в раздел «Настройки» Общие.
  • Включите переключатель «Картинка в картинке».

Как зафиксировать приложение на андроид?

Когда функция «Закрепление приложения» будет включена, выполните следующие действия:

  • Перейдите к экрану, который нужно закрепить.
  • Проведите вверх до середины экрана.
  • Нажмите на значок приложения вверху изображения.
  • Нажмите «Закрепить».
Учебное пособие по фоновым режимам

: Начало работы

Примечание об обновлении : Чак Круцингер обновил это руководство для Swift 5.5, iOS 15 и Xcode 13. Крис Вагнер написал оригинал.

Apple начала разрешать приложениям работать в фоновом режиме в 2010 году с выпуском iOS 4 и с тех пор развивала и улучшала фоновые режимы. iOS ограничивает использование фоновых операций, чтобы улучшить взаимодействие с пользователем и продлить срок службы батареи. Ваше приложение может работать в фоновом режиме для определенных случаев использования, в том числе для воспроизведения звука, обновления местоположения и получения последнего контента с сервера.

Если ваша задача не попадает ни в одну из разрешенных категорий, фоновый режим может вам не подойти. Вы можете столкнуться с одним из тех ужасных отказов в App Store, если попытаетесь обмануть систему фоновыми режимами, которые работают за рамками их целей. Считай себя предупрежденным!

В этом руководстве по фоновым режимам вы узнаете о четырех функциях, которые ваши приложения могут выполнять в фоновом режиме:

  • Воспроизведение звука : Разрешить приложению продолжать воспроизведение звука в фоновом режиме.
  • Получать обновления местоположения : Разрешить приложению получать изменения местоположения в фоновом режиме.
  • Завершение критических задач конечной длины : Разрешить приложению продолжать выполнять критическую задачу после перехода в фоновый режим.
  • Фоновая выборка : выполнение фоновых обновлений по расписанию, определяемому iOS.

Начало работы

Загрузите файлы проекта в верхней или нижней части руководства, щелкнув значок Кнопка «Скачать материалы» . Пользовательский интерфейс и базовая логика уже созданы.

Перед тем, как углубиться, вот краткий обзор основных фоновых режимов, доступных в iOS:

  • Аудио, AirPlay и Картинка в картинке : Воспроизведение аудио и видео, когда приложение находится в фоновом режиме.
  • Обновления местоположения : Продолжайте получать обновления местоположения в фоновом режиме.
  • Передача голоса по IP : Отправка и прием голоса через Интернет.
  • Связь с внешними аксессуарами : Связь через порт Lightning с внешними аксессуарами.
  • Использование аксессуаров Bluetooth LE : Связь с аксессуарами Bluetooth LE в фоновом режиме.
  • Работа в качестве аксессуара Bluetooth LE : Разрешить приложению передавать информацию Bluetooth LE аксессуару.
  • Фоновая выборка : выполнить обновление данных.
  • Удаленные уведомления : Отправка и получение удаленных уведомлений.
  • Фоновая обработка : Выполнять более длительные критические процессы.

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

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

Прежде чем вы сможете запустить проект на физическом устройстве, вы должны настроить команду разработчиков, как показано здесь:

Соберите и запустите пример проекта, чтобы почувствовать Sleepless , приложение, которое никогда не отдыхает, потому что оно делает что-то в фоновом режиме. Есть четыре вкладки — по одной для каждого режима:

Первая возможность, которую вы собираетесь добавить, — это фоновый звук.

Воспроизведение аудио

Создайте и запустите Sleepless на физическом устройстве. Перейдите на вкладку «Аудио», воспроизведите музыку, а затем переведите приложение в фоновый режим, вернувшись на главный экран. Музыка перестанет играть.

Открыть AudioModel. swift .

Приложение использует AVQueuePlayer для постановки песен в очередь и последовательного их воспроизведения. Модель наблюдает за значением currentItem игрока, чтобы предоставлять обновления для представления.

Предоставление кредита там, где это необходимо

Стартовый проект включает аудиофайлы с incompetech.com, популярного бесплатного музыкального веб-сайта. Вы можете использовать музыку бесплатно с указанием авторства. Все три песни написаны Кевином Маклаудом:

  • «Чувствую себя хорошо» Кевин Маклауд (incompetech.com)
    Лицензия Creative Commons: By Attribution 3.0 License
    http://creativecommons.org/licenses/by/3.0/
  • «Железный бекон» Кевина Маклеода (incompetech.com)
    Лицензия Creative Commons: By Attribution 3.0 License
    http://creativecommons.org/licenses/by/3.0/
  • «What You Want» Кевина Маклеода (incompetech.com)
    Лицензия Creative Commons: By Attribution 3. 0 License
    http://creativecommons.org/licenses/by/3.0/

Спасибо за прекрасную музыку, Кевин!

Примечание : ознакомьтесь со состояниями выполнения для приложений в документации Apple UIKit, чтобы узнать больше об активном состоянии и других.

Тестирование звука в фоновом режиме

Почему музыка останавливается, когда приложение переходит в фоновый режим? Что ж, важной части не хватает!

Большинство фоновых режимов не будут работать, если вы не включите определенные возможности, указывающие на то, что приложение хочет запускать код в фоновом режиме. Исключением является завершение критических задач, которое может выполнять любое приложение.

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

Вернитесь в Xcode и выполните следующие действия:

  1. Щелкните проект в навигаторе проектов .
  2. Выберите цель SleeplessApp .
  3. Выберите вкладку Подписание и возможности .
  4. Нажмите на 9Символ 0003 + для добавления возможности.

Затем дважды щелкните Фоновые режимы , чтобы добавить эту возможность. Разверните функцию Background Modes , затем установите флажок Audio, AirPlay и Picture in Picture , чтобы включить фоновый звук.

Создайте и запустите приложение на физическом устройстве. Запустите музыку, как и раньше, затем выйдите из приложения. На этот раз звук продолжится. Это так просто!

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

Получение обновлений местоположения

Сначала создайте и запустите приложение. Выберите вкладку Location и нажмите Start . Пока ничего не происходит, потому что вы пропустили несколько важных шагов. Вы измените это сейчас.

Включение обновлений местоположения

Открыть LocationModel.swift . Это код, который предоставляет данные о местоположении МестоположениеПросмотр . Вы собираетесь внести простое изменение в init() . Замените следующие две строки:

  mgr.requestWhenInUseAuthorization()
  mgr.allowsBackgroundLocationUpdates = false
 

С:

 mgr.requestAlwaysAuthorization()
 mgr.allowsBackgroundLocationUpdates = true
 

Первая строка запрашивает обновления местоположения, даже если приложение не используется. Второй запрашивает обновления даже в фоновом режиме.

Вернитесь к экрану Signing & Capabilities и установите флажок Обновления местоположения , чтобы iOS знала, что ваше приложение хочет получать обновления местоположения в фоновом режиме.

Помимо установки этого флажка, iOS требует, чтобы вы установили ключ в своем Info. plist , объясняющий пользователю, зачем вам нужны фоновые обновления. Если вы не включите это, запросы о местоположении не будут выполняться.

Откройте Info.plist и добавьте ключи на Конфиденциальность — Местоположение Всегда и при использовании Описание использования и Конфиденциальность — Местоположение при использовании Описание использования . Затем введите Приложение покажет ваше местоположение на карте как значение для обоих ключей.

Теперь собирай и запускай! Перейдите на вкладку Location и нажмите Start .

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

Коснитесь Разрешить при использовании приложения и прогуляйтесь снаружи или вокруг своего здания — постарайтесь не слишком отвлекаться на ловлю покемонов.

Должны начать появляться обновления местоположения. Если это не так, снова отправьте приложение в фоновый режим, чтобы вызвать запрос Всегда для отслеживания местоположения. Вы также можете использовать приложение Settings , чтобы включить постоянное отслеживание приложением Sleepless в настройках Privacy ▸ Location Services ▸ Sleepless .

Если вы переведете приложение в фоновый режим, вы все равно будете видеть обновления местоположения в консоли.

Через некоторое время вы должны увидеть что-то вроде этого:

Проверка режима определения местоположения в фоновом режиме

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

Если вы используете симулятор, вы также можете использовать его для имитации движения! Ознакомьтесь с меню Features ▸ Location :

Легко, верно? Переходим к третьей вкладке и третьему фоновому режиму!

Выполнение важных задач после перехода в фоновый режим

Следующий фоновый режим официально называется «Продление времени фонового выполнения вашего приложения». Какой глоток. Завершение задачи немного проще сказать!

Технически это вообще не фоновый режим. Вам не нужно объявлять, что ваше приложение использует его в Capabilities. Это API, который позволяет вам запускать произвольный код в течение ограниченного периода времени, когда ваше приложение находится в фоновом режиме, что дает вам больше времени для выполнения важных задач, таких как сохранение данных.

Когда использовать завершение задачи

Допустимый вариант использования завершения фонового режима — выполнение некоторых важных задач, таких как сохранение ввода пользователя или публикация транзакции. Есть много возможностей.

Поскольку код произвольный, вы можете использовать этот API практически для всего: выполнять длительные вычисления, применять фильтры к изображениям, рендерить сложную трехмерную сетку — что угодно! Ваше воображение — это предел, пока вы помните, что вы получаете только некоторое время , не неограниченное время. Через несколько минут вы настроите длительные вычисления для запуска в фоновом режиме, чтобы увидеть, как работает этот API.

iOS определяет, сколько времени вы получите после того, как ваше приложение перейдет в фоновый режим. Нет никаких гарантий относительно предоставленного вам времени, но вы всегда можете проверить UIApplication.shared.backgroundTimeRemaining . Это скажет вам, сколько времени у вас осталось.

Согласно общему мнению, основанному на наблюдениях, вы получаете около 30 секунд. Опять же, есть не гарантирует , а документация по API даже не дает оценки — так что не надейтесь на это число. Вы можете получить пять минут или пять секунд, поэтому ваше приложение должно быть готово к прерыванию. iOS сообщит вам об обратном вызове, когда ваше время подойдет к концу.

Настройка завершающей задачи

Вот распространенная задача, с которой должен быть знаком каждый студент, изучающий информатику: вычисление чисел в последовательности Фибоначчи. Изюминка здесь в том, что вы будете вычислять эти числа после того, как приложение перейдет на фон !

Откройте CompleteTaskModel.swift и посмотрите, что там уже есть. В нынешнем виде это представление будет последовательно вычислять числа Фибоначчи и отображать результат.

Если бы вы приостановили работу приложения на реальном устройстве прямо сейчас, вычисления остановятся и возобновятся с того места, где они были, как только приложение снова станет активным. Ваша задача — создать фоновую задачу, чтобы вычисления могли продолжаться до тех пор, пока iOS не скажет «Время вышло!»

Сначала вам нужно добавить следующее к CompleteTaskModel :

вар backgroundTask: UIBackgroundTaskIdentifier = .invalid
 

Это свойство определяет запрос задачи для выполнения в фоновом режиме.

Затем добавьте следующий метод в CompleteTaskModel непосредственно перед resetCalcuation() :

func registerBackgroundTask() {
  backgroundTask = UIApplication. shared.beginBackgroundTask { [слабый я] в
    print("iOS сообщила, что время истекло")
    сам?.endBackgroundTaskIfActive()
  }
}
 

registerBackgroundTask() сообщает iOS, что вам нужно больше времени, чтобы завершить то, что вы делаете, когда приложение переходит в фоновый режим. Возвращаемое значение является идентификатором этой задачи, чтобы вы могли сообщить iOS, когда закончите. После этого вызова, если ваше приложение переходит в фоновый режим, оно по-прежнему будет получать процессорное время, пока вы не вызовете endBackgroundTask(_:) .

Ну, по крайней мере, некоторое количество процессорного времени.

Завершение задания

Если вы не позвоните endBackgroundTask(_:) через некоторое время в фоновом режиме iOS вызовет закрытие, определенное при вызове beginBackgroundTask(expirationHandler:) . Это дает вам возможность остановить выполнение кода.

Поэтому рекомендуется вызвать endBackgroundTask(_:) , чтобы сообщить системе, что вы закончили. Если вы не вызовете его и продолжите выполнение кода после запуска этого блока, iOS завершит работу вашего приложения!

Добавьте этот метод чуть ниже registerBackgroundTask() :

функция endBackgroundTaskIfActive() {
  пусть isBackgroundTaskActive = backgroundTask != .invalid
  если isBackgroundTaskActive {
    print("Фоновая задача завершена.")
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = .invalid
  }
}
 

Это завершит фоновую задачу, если она активно зарегистрирована, и сбросит ее идентификатор на , неверный .

Регистрация и завершение фоновых задач

Теперь важная часть: обновление onChangeOfScenePhase(_:) для регистрации и завершения фоновой задачи в зависимости от того, переходит ли приложение в фоновое или активное состояние.

Замените два оператора case следующими:

случай .фон:
  пусть isTimerRunning = updateTimer != ноль
  пусть isTaskUnregistered = backgroundTask == . invalid

  если isTimerRunning && isTaskUnregistered {
    регистрация фоновой задачи ()
  }
случай .активный:
  endBackgroundTaskIfActive()
 

При изменении состояния фона на это регистрирует задачу, когда она выполняется, но не зарегистрирована. При переходе в активное состояние фоновая задача завершится.

В beginPauseTask() добавьте эту строку сразу после updateTimer = nil :

endBackgroundTaskIfActive()
 

Теперь, когда пользователь останавливает вычисления, вы вызываете endBackgroundTask(_:) , чтобы указать iOS, что вам не нужно дополнительное процессорное время.

ПРИМЕЧАНИЕ. Важно вызывать endBackgroundTask(_:) каждый раз, когда вы вызываете beginBackgroundTask(expirationHandler:) . Если вы вызовете beginBackgroundTask(expirationHandler:) дважды и вызовете только endBackgroundTask(_:) для одной из задач, вы все равно получите процессорное время, пока не вызовете endBackgroundTask(_:) во второй раз с идентификатор второй фоновой задачи.

Соберите и запустите, затем перейдите на третью вкладку.

Коснитесь Играйте и смотрите, как приложение вычисляет эти замечательные значения Фибоначчи. Отправьте приложение в фоновый режим, но наблюдайте за выводом в консоли Xcode. Ваше приложение должно продолжать обновлять числа, пока не закончится оставшееся время.

В большинстве случаев это время начинается с 30 и сокращается до пяти секунд. Если вы ждете, пока время истечет, когда вы достигнете пяти секунд — или любого другого значения, которое вы видите — iOS вызывает блокировку истечения срока действия.

Вскоре после этого ваше приложение должно перестать генерировать выходные данные. Затем, если вы вернетесь в приложение, таймер снова начнет срабатывать, и безумие Фибоначчи продолжится.

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

Перейдем к последней теме этого руководства по фоновым режимам: фоновая выборка.

Фоновая загрузка

Фоновая загрузка была представлена ​​в iOS 7. Она позволяет вашему приложению отображаться в актуальном состоянии, сводя к минимуму влияние на срок службы батареи. Начиная с iOS 13, Apple представила новый API-интерфейс планировщика фоновых задач, который предлагает значительные улучшения.

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

К сожалению, пользователи будут видеть старые заголовки в течение нескольких секунд, пока происходит обновление. И вы знаете, что некоторые попытались бы использовать историю только для того, чтобы увидеть, как она исчезает и заменяется историей, не имеющей отношения к делу. Не хороший вид.

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

Если этот параметр включен, система использует шаблоны использования, чтобы определить, когда запускать фоновую выборку. Например, если пользователь открывает ваше новостное приложение в 9утра в большинстве дней фоновая загрузка, скорее всего, произойдет где-то с 90 273 до 90 274 9:00. Система решает, когда лучше всего запускать фоновую загрузку, и по этой причине она не подходит для критических обновлений.

Общие сведения о фоновой выборке

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

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

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

  • Установите флажок Фоновая загрузка в Фоновые режимы из Возможностей вашего приложения.
  • Добавьте идентификатор в Info.plist для задачи обновления.
  • Вызвать BGTaskScheduler.register(forTaskWithIdentifier:using:launchHandler:) в своем делегате приложения для обработки фоновой выборки.
  • Создайте BGAppRefreshTaskRequest с EarlyBeginDate для указания времени выполнения.
  • Отправьте запрос, используя BGTaskScheduler.submit(_:) .

Подобно задачам завершения в фоновом режиме, у вас есть короткий, но неопределенный период времени для выполнения фоновой выборки. Согласованная цифра составляет максимум 30 секунд, но планируйте меньше. Если вам нужно загрузить большие ресурсы как часть выборки, используйте службу фоновой передачи URLSession .

Внедрение фоновой выборки

Пора начинать. Во-первых, простая часть: проверьте возможность режима Background fetch в разделе Signing & Capabilities .

Затем откройте Info. plist и нажмите + , чтобы добавить новый идентификатор.

Прокрутите вниз и выберите Разрешенные идентификаторы планировщика фоновых задач . Разверните элемент, затем нажмите + рядом с этим новым идентификатором, чтобы добавить запись.

Введите com.mycompany.myapp.task.refresh в качестве значения идентификатора.

Примечание : в ваших реальных проектах вы должны использовать обратный URL-адрес вашей компании в качестве корня идентификатора, добавляя имя вашего приложения и описательные элементы, такие как task.refresh . Вы можете определить несколько видов задач обновления, каждая со своим идентификатором.

Затем вам нужен класс AppDelegate , потому что iOS ожидает, что вы зарегистрируете свою задачу выборки в течение приложение(_:didFinishLaunchingWithOptions:) .

В папку App добавьте новый файл Swift с именем AppDelegate.swift . Затем замените существующий код следующим:

.
импортировать UIKit
импортировать фоновые задачи

класс AppDelegate: UIResponder, UIApplicationDelegate {
  статический var dateFormatter: DateFormatter = {
    пусть форматер = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .long
    форматтер возврата
  }()

  переменное окно: UIWindow?

  функциональное приложение(
    _ приложение: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Любой]? = ноль
  ) -> Логический {
    вернуть истину
  }
}
 

Этот код определяет средство форматирования даты для метки времени обновления. Он также включает пустой метод для application(_:didFinishLaunchingWithOptions:) , в котором вы зарегистрируете задачу фоновой выборки.

Теперь добавьте следующую функцию в AppDelegate :

функция обновления () {
  // чтобы имитировать обновление, просто обновите дату последнего обновления
  // к текущей дате/времени
  пусть formattedDate = Self. dateFormatter.string (от: Дата ())
  UserDefaults.standard.set(
    форматированная дата,
    forKey: UserDefaultsKeys.lastRefreshDateKey)
  print("Произошло обновление")
}
 

Эта функция имитирует обновление.

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

Все еще в AppDelegate.swift добавьте следующую функцию в AppDelegate :

функция расписанияAppRefresh() {
  пусть запрос = BGAppRefreshTaskRequest(
    идентификатор: AppConstants.backgroundTaskIdentifier)
  request.earliestBeginDate = Дата (timeIntervalSinceNow: 1 * 60)
  делать {
    попробуйте BGTaskScheduler.shared.submit(запрос)
    print("Запланировано фоновое обновление")
  } ловить {
    print("Не удалось запланировать обновление приложения \(error.localizedDescription)")
  }
}
 

Здесь вы создаете BGAppRefreshTaskRequest , затем назначаете EarlyBeginDate через одну минуту от настоящего времени. Затем вы отправляете запрос, используя BGTaskScheduler.submit(_:) .

Теперь замените тело application(_:didFinishLaunchingWithOptions:) на:

BGTaskScheduler.shared.register(
  forTaskWithIdentifier: AppConstants.backgroundTaskIdentifier,
  использование: nil) { задача в
    self.refresh() // 1
    task.setTaskCompleted(успех: правда) // 2
    self.scheduleAppRefresh() // 3
}

расписаниеAppRefresh()
вернуть истину
 

Когда iOS завершает запуск приложения, этот код регистрирует задачу в планировщике задач и планирует первое обновление. Сама задача при выполнении будет:

  1. Выполнять обновление.
  2. Отметить задачу как успешно выполненную.
  3. Запланировать следующее обновление.

Теперь вам нужно подключить AppDelegate к AppMain . Откройте AppMain.swift . Добавьте эту строку непосредственно перед телом :

@UIApplicationDelegateAdaptor(AppDelegate. self) вар appDelegate
 

Это все, что вам нужно, чтобы iOS вызывала AppDelegate .

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

Тестирование фоновой выборки

Один из способов протестировать фоновую выборку — сидеть и ждать, пока система решит это сделать. Но вы можете сидеть в течение длительного времени, ожидая, что это произойдет.

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

Откройте RefreshView.swift и установите точку останова на print("перемещено в фон") .

Затем отправьте приложение в фоновый режим, и Xcode должен сломаться в вашей новой точке останова. В lldb введите (или, поскольку это довольно сложно, скопируйте и вставьте!) следующую команду:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.mycompany.myapp.task.refresh"]
 

Это даст указание отладчику немедленно выполнить фоновое обновление.

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

Затем снова откройте приложение. На вкладке Refresh будут отображаться время и дата, когда произошло обновление.

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

Куда идти дальше?

Чтобы сравнить результаты, загрузите готовые файлы проекта, нажав кнопку Download Materials вверху или внизу руководства.

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

Есть также две отличные презентации WWDC, связанные с фоновыми режимами:

  1. Достижения в фоновом выполнении приложения: обсуждаются последние улучшения в параметрах фоновой обработки.
  2. Демистификация фонового выполнения: поможет вам глубже понять различные фоновые режимы.

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

Мы надеемся, что вам понравилось это руководство по фоновым режимам. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, присоединяйтесь к обсуждению на форуме ниже!

Учебное пособие по фоновым режимам: Начало работы

Примечание об обновлении : Чак Круцингер обновил это руководство для Swift 5. 5, iOS 15 и Xcode 13. Крис Вагнер написал оригинал.

Apple начала разрешать приложениям работать в фоновом режиме в 2010 году с выпуском iOS 4 и с тех пор развивала и улучшала фоновые режимы. iOS ограничивает использование фоновых операций, чтобы улучшить взаимодействие с пользователем и продлить срок службы батареи. Ваше приложение может работать в фоновом режиме для определенных случаев использования, в том числе для воспроизведения звука, обновления местоположения и получения последнего контента с сервера.

Если ваша задача не попадает ни в одну из разрешенных категорий, фоновый режим может вам не подойти. Вы можете столкнуться с одним из тех ужасных отказов в App Store, если попытаетесь обмануть систему фоновыми режимами, которые работают за рамками их целей. Считай себя предупрежденным!

В этом руководстве по фоновым режимам вы узнаете о четырех функциях, которые ваши приложения могут выполнять в фоновом режиме:

  • Воспроизведение звука : Разрешить приложению продолжать воспроизведение звука в фоновом режиме.
  • Получать обновления местоположения : Разрешить приложению получать изменения местоположения в фоновом режиме.
  • Завершение критических задач конечной длины : Разрешить приложению продолжать выполнять критическую задачу после перехода в фоновый режим.
  • Фоновая выборка : выполнение фоновых обновлений по расписанию, определяемому iOS.

Начало работы

Загрузите файлы проекта в верхней или нижней части руководства, щелкнув значок Кнопка «Скачать материалы» . Пользовательский интерфейс и базовая логика уже созданы.

Перед тем, как углубиться, вот краткий обзор основных фоновых режимов, доступных в iOS:

  • Аудио, AirPlay и Картинка в картинке : Воспроизведение аудио и видео, когда приложение находится в фоновом режиме.
  • Обновления местоположения : Продолжайте получать обновления местоположения в фоновом режиме.
  • Передача голоса по IP : Отправка и прием голоса через Интернет.
  • Связь с внешними аксессуарами : Связь через порт Lightning с внешними аксессуарами.
  • Использование аксессуаров Bluetooth LE : Связь с аксессуарами Bluetooth LE в фоновом режиме.
  • Работа в качестве аксессуара Bluetooth LE : Разрешить приложению передавать информацию Bluetooth LE аксессуару.
  • Фоновая выборка : выполнить обновление данных.
  • Удаленные уведомления : Отправка и получение удаленных уведомлений.
  • Фоновая обработка : Выполнять более длительные критические процессы.

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

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

Прежде чем вы сможете запустить проект на физическом устройстве, вы должны настроить команду разработчиков, как показано здесь:

Соберите и запустите пример проекта, чтобы почувствовать Sleepless , приложение, которое никогда не отдыхает, потому что оно делает что-то в фоновом режиме. Есть четыре вкладки — по одной для каждого режима:

Первая возможность, которую вы собираетесь добавить, — это фоновый звук.

Воспроизведение аудио

Создайте и запустите Sleepless на физическом устройстве. Перейдите на вкладку «Аудио», воспроизведите музыку, а затем переведите приложение в фоновый режим, вернувшись на главный экран. Музыка перестанет играть.

Открыть AudioModel.swift .

Приложение использует AVQueuePlayer для постановки песен в очередь и последовательного их воспроизведения. Модель наблюдает за значением currentItem игрока, чтобы предоставлять обновления для представления.

Предоставление кредита там, где это необходимо

Стартовый проект включает аудиофайлы с incompetech.com, популярного бесплатного музыкального веб-сайта. Вы можете использовать музыку бесплатно с указанием авторства. Все три песни написаны Кевином Маклаудом:

  • «Чувствую себя хорошо» Кевин Маклауд (incompetech.com)
    Лицензия Creative Commons: By Attribution 3.0 License
    http://creativecommons.org/licenses/by/3.0/
  • «Железный бекон» Кевина Маклеода (incompetech.com)
    Лицензия Creative Commons: By Attribution 3.0 License
    http://creativecommons.org/licenses/by/3.0/
  • «What You Want» Кевина Маклеода (incompetech.com)
    Лицензия Creative Commons: By Attribution 3.0 License
    http://creativecommons.org/licenses/by/3.0/

Спасибо за прекрасную музыку, Кевин!

Примечание : ознакомьтесь со состояниями выполнения для приложений в документации Apple UIKit, чтобы узнать больше об активном состоянии и других.

Тестирование звука в фоновом режиме

Почему музыка останавливается, когда приложение переходит в фоновый режим? Что ж, важной части не хватает!

Большинство фоновых режимов не будут работать, если вы не включите определенные возможности, указывающие на то, что приложение хочет запускать код в фоновом режиме. Исключением является завершение критических задач, которое может выполнять любое приложение.

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

Вернитесь в Xcode и выполните следующие действия:

  1. Щелкните проект в навигаторе проектов .
  2. Выберите цель SleeplessApp .
  3. Выберите вкладку Подписание и возможности .
  4. Нажмите на 9Символ 0003 + для добавления возможности.

Затем дважды щелкните Фоновые режимы , чтобы добавить эту возможность. Разверните функцию Background Modes , затем установите флажок Audio, AirPlay и Picture in Picture , чтобы включить фоновый звук.

Создайте и запустите приложение на физическом устройстве. Запустите музыку, как и раньше, затем выйдите из приложения. На этот раз звук продолжится. Это так просто!

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

Получение обновлений местоположения

Сначала создайте и запустите приложение. Выберите вкладку Location и нажмите Start . Пока ничего не происходит, потому что вы пропустили несколько важных шагов. Вы измените это сейчас.

Включение обновлений местоположения

Открыть LocationModel.swift . Это код, который предоставляет данные о местоположении МестоположениеПросмотр . Вы собираетесь внести простое изменение в init() . Замените следующие две строки:

  mgr.requestWhenInUseAuthorization()
  mgr.allowsBackgroundLocationUpdates = false
 

С:

 mgr.requestAlwaysAuthorization()
 mgr.allowsBackgroundLocationUpdates = true
 

Первая строка запрашивает обновления местоположения, даже если приложение не используется. Второй запрашивает обновления даже в фоновом режиме.

Вернитесь к экрану Signing & Capabilities и установите флажок Обновления местоположения , чтобы iOS знала, что ваше приложение хочет получать обновления местоположения в фоновом режиме.

Помимо установки этого флажка, iOS требует, чтобы вы установили ключ в своем Info.plist , объясняющий пользователю, зачем вам нужны фоновые обновления. Если вы не включите это, запросы о местоположении не будут выполняться.

Откройте Info.plist и добавьте ключи на Конфиденциальность — Местоположение Всегда и при использовании Описание использования и Конфиденциальность — Местоположение при использовании Описание использования . Затем введите Приложение покажет ваше местоположение на карте как значение для обоих ключей.

Теперь собирай и запускай! Перейдите на вкладку Location и нажмите Start .

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

Коснитесь Разрешить при использовании приложения и прогуляйтесь снаружи или вокруг своего здания — постарайтесь не слишком отвлекаться на ловлю покемонов.

Должны начать появляться обновления местоположения. Если это не так, снова отправьте приложение в фоновый режим, чтобы вызвать запрос Всегда для отслеживания местоположения. Вы также можете использовать приложение Settings , чтобы включить постоянное отслеживание приложением Sleepless в настройках Privacy ▸ Location Services ▸ Sleepless .

Если вы переведете приложение в фоновый режим, вы все равно будете видеть обновления местоположения в консоли.

Через некоторое время вы должны увидеть что-то вроде этого:

Проверка режима определения местоположения в фоновом режиме

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

Если вы используете симулятор, вы также можете использовать его для имитации движения! Ознакомьтесь с меню Features ▸ Location :

Легко, верно? Переходим к третьей вкладке и третьему фоновому режиму!

Выполнение важных задач после перехода в фоновый режим

Следующий фоновый режим официально называется «Продление времени фонового выполнения вашего приложения». Какой глоток. Завершение задачи немного проще сказать!

Технически это вообще не фоновый режим. Вам не нужно объявлять, что ваше приложение использует его в Capabilities. Это API, который позволяет вам запускать произвольный код в течение ограниченного периода времени, когда ваше приложение находится в фоновом режиме, что дает вам больше времени для выполнения важных задач, таких как сохранение данных.

Когда использовать завершение задачи

Допустимый вариант использования завершения фонового режима — выполнение некоторых важных задач, таких как сохранение ввода пользователя или публикация транзакции. Есть много возможностей.

Поскольку код произвольный, вы можете использовать этот API практически для всего: выполнять длительные вычисления, применять фильтры к изображениям, рендерить сложную трехмерную сетку — что угодно! Ваше воображение — это предел, пока вы помните, что вы получаете только некоторое время , не неограниченное время. Через несколько минут вы настроите длительные вычисления для запуска в фоновом режиме, чтобы увидеть, как работает этот API.

iOS определяет, сколько времени вы получите после того, как ваше приложение перейдет в фоновый режим. Нет никаких гарантий относительно предоставленного вам времени, но вы всегда можете проверить UIApplication.shared.backgroundTimeRemaining . Это скажет вам, сколько времени у вас осталось.

Согласно общему мнению, основанному на наблюдениях, вы получаете около 30 секунд. Опять же, есть не гарантирует , а документация по API даже не дает оценки — так что не надейтесь на это число. Вы можете получить пять минут или пять секунд, поэтому ваше приложение должно быть готово к прерыванию. iOS сообщит вам об обратном вызове, когда ваше время подойдет к концу.

Настройка завершающей задачи

Вот распространенная задача, с которой должен быть знаком каждый студент, изучающий информатику: вычисление чисел в последовательности Фибоначчи. Изюминка здесь в том, что вы будете вычислять эти числа после того, как приложение перейдет на фон !

Откройте CompleteTaskModel.swift и посмотрите, что там уже есть. В нынешнем виде это представление будет последовательно вычислять числа Фибоначчи и отображать результат.

Если бы вы приостановили работу приложения на реальном устройстве прямо сейчас, вычисления остановятся и возобновятся с того места, где они были, как только приложение снова станет активным. Ваша задача — создать фоновую задачу, чтобы вычисления могли продолжаться до тех пор, пока iOS не скажет «Время вышло!»

Сначала вам нужно добавить следующее к CompleteTaskModel :

вар backgroundTask: UIBackgroundTaskIdentifier = .invalid
 

Это свойство определяет запрос задачи для выполнения в фоновом режиме.

Затем добавьте следующий метод в CompleteTaskModel непосредственно перед resetCalcuation() :

func registerBackgroundTask() {
  backgroundTask = UIApplication.shared.beginBackgroundTask { [слабый я] в
    print("iOS сообщила, что время истекло")
    сам?.endBackgroundTaskIfActive()
  }
}
 

registerBackgroundTask() сообщает iOS, что вам нужно больше времени, чтобы завершить то, что вы делаете, когда приложение переходит в фоновый режим. Возвращаемое значение является идентификатором этой задачи, чтобы вы могли сообщить iOS, когда закончите. После этого вызова, если ваше приложение переходит в фоновый режим, оно по-прежнему будет получать процессорное время, пока вы не вызовете endBackgroundTask(_:) .

Ну, по крайней мере, некоторое количество процессорного времени.

Завершение задания

Если вы не позвоните endBackgroundTask(_:) через некоторое время в фоновом режиме iOS вызовет закрытие, определенное при вызове beginBackgroundTask(expirationHandler:) . Это дает вам возможность остановить выполнение кода.

Поэтому рекомендуется вызвать endBackgroundTask(_:) , чтобы сообщить системе, что вы закончили. Если вы не вызовете его и продолжите выполнение кода после запуска этого блока, iOS завершит работу вашего приложения!

Добавьте этот метод чуть ниже registerBackgroundTask() :

функция endBackgroundTaskIfActive() {
  пусть isBackgroundTaskActive = backgroundTask != .invalid
  если isBackgroundTaskActive {
    print("Фоновая задача завершена. ")
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = .invalid
  }
}
 

Это завершит фоновую задачу, если она активно зарегистрирована, и сбросит ее идентификатор на , неверный .

Регистрация и завершение фоновых задач

Теперь важная часть: обновление onChangeOfScenePhase(_:) для регистрации и завершения фоновой задачи в зависимости от того, переходит ли приложение в фоновое или активное состояние.

Замените два оператора case следующими:

случай .фон:
  пусть isTimerRunning = updateTimer != ноль
  пусть isTaskUnregistered = backgroundTask == .invalid

  если isTimerRunning && isTaskUnregistered {
    регистрация фоновой задачи ()
  }
случай .активный:
  endBackgroundTaskIfActive()
 

При изменении состояния фона на это регистрирует задачу, когда она выполняется, но не зарегистрирована. При переходе в активное состояние фоновая задача завершится.

В beginPauseTask() добавьте эту строку сразу после updateTimer = nil :

endBackgroundTaskIfActive()
 

Теперь, когда пользователь останавливает вычисления, вы вызываете endBackgroundTask(_:) , чтобы указать iOS, что вам не нужно дополнительное процессорное время.

ПРИМЕЧАНИЕ. Важно вызывать endBackgroundTask(_:) каждый раз, когда вы вызываете beginBackgroundTask(expirationHandler:) . Если вы вызовете beginBackgroundTask(expirationHandler:) дважды и вызовете только endBackgroundTask(_:) для одной из задач, вы все равно получите процессорное время, пока не вызовете endBackgroundTask(_:) во второй раз с идентификатор второй фоновой задачи.

Соберите и запустите, затем перейдите на третью вкладку.

Коснитесь Играйте и смотрите, как приложение вычисляет эти замечательные значения Фибоначчи. Отправьте приложение в фоновый режим, но наблюдайте за выводом в консоли Xcode. Ваше приложение должно продолжать обновлять числа, пока не закончится оставшееся время.

В большинстве случаев это время начинается с 30 и сокращается до пяти секунд. Если вы ждете, пока время истечет, когда вы достигнете пяти секунд — или любого другого значения, которое вы видите — iOS вызывает блокировку истечения срока действия.

Вскоре после этого ваше приложение должно перестать генерировать выходные данные. Затем, если вы вернетесь в приложение, таймер снова начнет срабатывать, и безумие Фибоначчи продолжится.

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

Перейдем к последней теме этого руководства по фоновым режимам: фоновая выборка.

Фоновая загрузка

Фоновая загрузка была представлена ​​в iOS 7. Она позволяет вашему приложению отображаться в актуальном состоянии, сводя к минимуму влияние на срок службы батареи. Начиная с iOS 13, Apple представила новый API-интерфейс планировщика фоновых задач, который предлагает значительные улучшения.

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

К сожалению, пользователи будут видеть старые заголовки в течение нескольких секунд, пока происходит обновление. И вы знаете, что некоторые попытались бы использовать историю только для того, чтобы увидеть, как она исчезает и заменяется историей, не имеющей отношения к делу. Не хороший вид.

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

Если этот параметр включен, система использует шаблоны использования, чтобы определить, когда запускать фоновую выборку. Например, если пользователь открывает ваше новостное приложение в 9утра в большинстве дней фоновая загрузка, скорее всего, произойдет где-то с 90 273 до 90 274 9:00. Система решает, когда лучше всего запускать фоновую загрузку, и по этой причине она не подходит для критических обновлений.

Общие сведения о фоновой выборке

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

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

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

  • Установите флажок Фоновая загрузка в Фоновые режимы из Возможностей вашего приложения.
  • Добавьте идентификатор в Info.plist для задачи обновления.
  • Вызвать BGTaskScheduler. register(forTaskWithIdentifier:using:launchHandler:) в своем делегате приложения для обработки фоновой выборки.
  • Создайте BGAppRefreshTaskRequest с EarlyBeginDate для указания времени выполнения.
  • Отправьте запрос, используя BGTaskScheduler.submit(_:) .

Подобно задачам завершения в фоновом режиме, у вас есть короткий, но неопределенный период времени для выполнения фоновой выборки. Согласованная цифра составляет максимум 30 секунд, но планируйте меньше. Если вам нужно загрузить большие ресурсы как часть выборки, используйте службу фоновой передачи URLSession .

Внедрение фоновой выборки

Пора начинать. Во-первых, простая часть: проверьте возможность режима Background fetch в разделе Signing & Capabilities .

Затем откройте Info.plist и нажмите + , чтобы добавить новый идентификатор.

Прокрутите вниз и выберите Разрешенные идентификаторы планировщика фоновых задач . Разверните элемент, затем нажмите + рядом с этим новым идентификатором, чтобы добавить запись.

Введите com.mycompany.myapp.task.refresh в качестве значения идентификатора.

Примечание : в ваших реальных проектах вы должны использовать обратный URL-адрес вашей компании в качестве корня идентификатора, добавляя имя вашего приложения и описательные элементы, такие как task.refresh . Вы можете определить несколько видов задач обновления, каждая со своим идентификатором.

Затем вам нужен класс AppDelegate , потому что iOS ожидает, что вы зарегистрируете свою задачу выборки в течение приложение(_:didFinishLaunchingWithOptions:) .

В папку App добавьте новый файл Swift с именем AppDelegate.swift . Затем замените существующий код следующим:

.
импортировать UIKit
импортировать фоновые задачи

класс AppDelegate: UIResponder, UIApplicationDelegate {
  статический var dateFormatter: DateFormatter = {
    пусть форматер = DateFormatter()
    formatter. dateStyle = .short
    formatter.timeStyle = .long
    форматтер возврата
  }()

  переменное окно: UIWindow?

  функциональное приложение(
    _ приложение: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Любой]? = ноль
  ) -> Логический {
    вернуть истину
  }
}
 

Этот код определяет средство форматирования даты для метки времени обновления. Он также включает пустой метод для application(_:didFinishLaunchingWithOptions:) , в котором вы зарегистрируете задачу фоновой выборки.

Теперь добавьте следующую функцию в AppDelegate :

функция обновления () {
  // чтобы имитировать обновление, просто обновите дату последнего обновления
  // к текущей дате/времени
  пусть formattedDate = Self.dateFormatter.string (от: Дата ())
  UserDefaults.standard.set(
    форматированная дата,
    forKey: UserDefaultsKeys.lastRefreshDateKey)
  print("Произошло обновление")
}
 

Эта функция имитирует обновление.

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

Все еще в AppDelegate.swift добавьте следующую функцию в AppDelegate :

функция расписанияAppRefresh() {
  пусть запрос = BGAppRefreshTaskRequest(
    идентификатор: AppConstants.backgroundTaskIdentifier)
  request.earliestBeginDate = Дата (timeIntervalSinceNow: 1 * 60)
  делать {
    попробуйте BGTaskScheduler.shared.submit(запрос)
    print("Запланировано фоновое обновление")
  } ловить {
    print("Не удалось запланировать обновление приложения \(error.localizedDescription)")
  }
}
 

Здесь вы создаете BGAppRefreshTaskRequest , затем назначаете EarlyBeginDate через одну минуту от настоящего времени. Затем вы отправляете запрос, используя BGTaskScheduler.submit(_:) .

Теперь замените тело application(_:didFinishLaunchingWithOptions:) на:

BGTaskScheduler.shared.register(
  forTaskWithIdentifier: AppConstants.backgroundTaskIdentifier,
  использование: nil) { задача в
    self.refresh() // 1
    task.setTaskCompleted(успех: правда) // 2
    self.scheduleAppRefresh() // 3
}

расписаниеAppRefresh()
вернуть истину
 

Когда iOS завершает запуск приложения, этот код регистрирует задачу в планировщике задач и планирует первое обновление. Сама задача при выполнении будет:

  1. Выполнять обновление.
  2. Отметить задачу как успешно выполненную.
  3. Запланировать следующее обновление.

Теперь вам нужно подключить AppDelegate к AppMain . Откройте AppMain.swift . Добавьте эту строку непосредственно перед телом :

@UIApplicationDelegateAdaptor(AppDelegate.self) вар appDelegate
 

Это все, что вам нужно, чтобы iOS вызывала AppDelegate .

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

Тестирование фоновой выборки

Один из способов протестировать фоновую выборку — сидеть и ждать, пока система решит это сделать. Но вы можете сидеть в течение длительного времени, ожидая, что это произойдет.

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

Откройте RefreshView.swift и установите точку останова на print("перемещено в фон") .

Затем отправьте приложение в фоновый режим, и Xcode должен сломаться в вашей новой точке останова. В lldb введите (или, поскольку это довольно сложно, скопируйте и вставьте!) следующую команду:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com. mycompany.myapp.task.refresh"]
 

Это даст указание отладчику немедленно выполнить фоновое обновление.

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

Затем снова откройте приложение. На вкладке Refresh будут отображаться время и дата, когда произошло обновление.

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

Куда идти дальше?

Чтобы сравнить результаты, загрузите готовые файлы проекта, нажав кнопку Download Materials вверху или внизу руководства.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *