В этом уроке по 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:
- BGAppRefreshTaskRequest: это запрос на запуск приложения в фоновом режиме для выполнения короткой задачи обновления.
- BGProcessingTaskRequest: это запрос на запуск приложения в фоновом режиме и выполнение процесса, выполнение которого занимает больше времени.
Фоновые задачи можно использовать для выполнения различных действий, таких как очистка базы данных, загрузка изображений на сервер, синхронизация изображений на других устройствах и многое другое.
В этом уроке по iOS мы рассмотрим пример фоновой задачи iOS по извлечению последнего количества добавленных изображений в галерее изображений.
Реализация BackgroundTasks Framework в вашем проекте
1. Создайте новый проект, используя XCODE 11.
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.