Статьи

Как обновить содержимое приложения с помощью фоновых задач с помощью планировщика задач в iOS 13?

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

В прошлом месяце на конференции разработчиков WWDC 2019 Apple выпустила последнюю версию iOS 13 с огромным списком новых функций и возможностей. Это были вторые крупные ревизии ОС. В настоящее время он используется на более чем одном миллиарде iOS-устройств по всему миру. 

Самая значимая вещь, которую Apple сделала в этом обновлении, — это Optimized Trend. Оптимизированный Trend, изначально выпущенный в iOS 12, сделал iOS 13 более быстрой и эффективной. Время обновления приложения было улучшено, а время запуска приложения стало в два раза быстрее по сравнению с предыдущей итерацией. Размер загрузки приложения также был уменьшен до половины.

Вот список некоторых важных функций, появившихся в iOS 13:

  • Темный режим.
  • Обновленное приложение Фотографии.
  • Войдите с Apple.
  • HomeKit Безопасное видео.
  • Имя и изображение в сообщениях.
  • Смахивание клавиатуры.
  • Многопользовательский HomePod.
  • Абсолютно новое приложение для напоминаний.
  • Памятные и наклейки.
  • Умнее, плавнее голосовая помощь Сири.

С точки зрения технических функций, Apple представила:

  • Достижения в контекстных меню действий в iOS, macOS и iPadOS.
  • UIWindowScene API и многозадачность в iPadOS.
  • Функциональные возможности AI / ML, такие как четкость изображения и речи, встраивание слов, анализ звука, текстовый каталог и распознавание, сходство и классификация изображений, речь на устройстве, качество захвата лица, классификация настроений.
  • Разговорные ярлыки в Siri для приложений.
  • Новый BackgroundTasks Framework.

BackgroundTasks Framework

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

BackgroundTasks Framework имеет два основных запроса задач под BGTaskScheduler:

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

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

В этом уроке по iOS мы рассмотрим пример фоновой задачи iOS по извлечению последнего количества добавленных изображений в галерее изображений.

Реализация BackgroundTasks Framework в вашем проекте

1. Создайте новый проект, используя XCODE 11.

Создать новый проект Xcode

Создать новый проект Xcode

2. Выберите «Single View App» в разделе iOS и введите имя проекта. (Мы сохранили название проекта как «SOBackgroundTask».)

введите название проекта.

Введите название проекта

свойства проекта

Свойства проекта

3. Перейдите в SoBackgroundTask Target, нажмите «Подписи и возможности», а затем нажмите «+ Возможность».

настроить возможности

Настроить возможности

4. Дважды нажмите «Режимы фона».

установить фоновые режимы

Установить фоновые режимы

5. Выберите «Фоновая выборка» и «Фоновая обработка» из всех фоновых задач.

установить фоновые режимы

Установить фоновые режимы

6. Добавьте ключ «BGTaskSchedulerPermittedIdentifiers» в info.plist и добавьте массив идентификаторов задач.

добавить идентификатор задачи

Добавить идентификатор задачи

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

7. Импортируйте фоновые задачи в AppDelegate.swift.

8. Создайте метод registerBackgroundTaks () с идентификатором (используйте тот же идентификатор, который мы использовали в info.plist) и вызовите его из Application: didFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

registerBackgroundTaks()
return true
}

//MARK: Register BackGround Tasks
private func registerBackgroundTaks() {

BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.SO.imagefetcher", using: nil) { task in
//This task is cast with processing request (BGProcessingTask)
self.scheduleLocalNotification()
self.handleImageFetcherTask(task: task as! BGProcessingTask)
}

BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.SO.apprefresh", using: nil) { task in
//This task is cast with processing request (BGAppRefreshTask)
self.scheduleLocalNotification()
self.handleAppRefreshTask(task: task as! BGAppRefreshTask)
}
}

9. Создайте метод scheduleImagefetcher () и scheduleAppRefresh () для извлечения изображений из галереи и обновления приложения после завершения извлечения изображений. Эти методы вызываются из applicationDidEnterBackground.

func applicationDidEnterBackground(_ application: UIApplication) {
scheduleAppRefresh()
scheduleImagefetcher()
}

func scheduleImagefetcher() {
let request = BGProcessingTaskRequest(identifier: "com.SO.imagefetcher")
request.requiresNetworkConnectivity = false // Need to true if your task need to network process. Defaults to false.
request.requiresExternalPower = false
//If we keep requiredExternalPower = true then it required device is connected to external power.

request.earliestBeginDate = Date(timeIntervalSinceNow: 1 * 60) // fetch Image Count after 1 minute.
//Note :: EarliestBeginDate should not be set to too far into the future.
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Could not schedule image fetch: \(error)")
}
}

func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.SO.apprefresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 2 * 60) // App Refresh after 2 minute.
//Note :: EarliestBeginDate should not be set to too far into the future.
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Could not schedule app refresh: \(error)")
}
}

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

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

func cancelAllPendingBGTask() {
BGTaskScheduler.shared.cancelAllTaskRequests()
}

Примечание : ограничение времени фоновой задачи iOS составляет 30 секунд; политика все та же.

Заключение

Мы надеемся, что это руководство по iOS поможет вам понять, как работает BackgroundTasks Framework. Вы можете получить исходный код, обратившись к демонстрационной версии github .

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

Дайте нам знать, если у вас есть предложения или вопросы в этом руководстве или какие-либо вопросы, касающиеся разработки приложений для iPhone.