O principal evento do ano no mundo dos desenvolvedores de iOS e MacOS, WWDC, sempre agrada a todas as pessoas envolvidas no setor com o lançamento de novas versões do sistema operacional, estruturas, hardware - em geral, tudo o que realmente precisa ser trabalhado.
Este ano não se tornou uma exceção e o assunto da discussão ativa foi a nova versão do iOS, SwiftUI, e o iPadOS OS para você entender o que dispositivos.
No entanto, houve tópicos que foram menos abordados, mas não menos interessantes com isso - por exemplo, algo útil como a execução em segundo plano dos aplicativos foi abordada.
Brevemente sobre o tópico
Para aqueles que não entendem bem o que é a execução em segundo plano, vamos explicar: a execução em segundo plano significa que o aplicativo está fazendo algum trabalho em um estado em que não está sendo executado fisicamente na tela do smartphone do usuário (ou seja, não está em primeiro plano) .

Esta imagem mostra claramente em que condições o aplicativo pode permanecer e como ir de um para outro.
Além disso, os desenvolvedores da Apple nesta sessão se concentraram no consumo de recursos (espero que seja óbvio que, ao trabalhar em segundo plano, o aplicativo continue consumindo energia). Mas é hora de ir diretamente para o relatório.
O que aconteceu na WWDC
Na verdade, os palestrantes começaram com a mesma coisa que eu - conversamos brevemente sobre o trabalho em segundo plano e descrevemos as tarefas que seriam realizadas lá.

Estamos nos aproximando do desenvolvimento. Existem três considerações principais para a Apple no que diz respeito ao desempenho em segundo plano:
- poder
- performance
- confidencialidade
Tudo é bem simples - se uma tarefa de aplicativo estiver sendo executada em segundo plano, essa execução poderá ocorrer enquanto outro aplicativo estiver sendo executado em primeiro plano. Portanto, existe um limite de recursos para garantir que os recursos não sejam consumidos excessivamente. Se esses limites forem excedidos, o aplicativo poderá ser encerrado à força pela Apple, o que reduzirá o tempo de inicialização. Em relação à privacidade, a empresa recomenda fortemente que os desenvolvedores usem todos os recursos de sua API para informar ao usuário quais dados o aplicativo usa em seu trabalho (mesmo em segundo plano).
A propósito, a lista dessas APIs foi bastante impressionante - elas não fizeram uma revisão separada, mas aconselho que você preste atenção nelas.
Sim, e na própria sessão, os desenvolvedores da Apple mostraram uma breve visão geral das possibilidades usando o exemplo de aplicativo messenger (vale a pena assistir a um vídeo da WWDC).
BackgroundTasks
Quase metade do relatório deste ano é dedicado a esse quadro.
2 tipos de tarefas que esta novidade oferece:
- Tarefa de atualização de aplicativo
- Tarefa de processamento em segundo plano
Tarefa de atualização de aplicativo
A Tarefa de atualização do aplicativo BG é um tipo especial de tarefa em segundo plano que podemos usar para atualizar os dados do aplicativo. Uma coisa que torna esse tipo de tarefa muito especial é o comportamento do usuário. O iOS aprende com que frequência e quando o usuário inicia seu aplicativo e tenta iniciar o BGAppRefreshTask em um momento em que é improvável que o usuário o use.

Sim, não funcionará por mais de 30 segundos - o recurso é muito desagradável, permanecendo das versões anteriores do sistema operacional.
Considere um exemplo de código da Internet.
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } }
Há vários pontos que você precisa parar e considerar melhor:
- Instale o manipulador de expiração no objeto de tarefa (expirationHandler), pois o sistema fornece um tempo limitado para concluir o trabalho e, se for excedido, você precisará limpar os recursos.
- Certifique-se de que o método setTaskCompleted tenha sido chamado assim que a operação for concluída.
- BGTaskScheduler é a classe principal usada para agendar o trabalho em segundo plano.
Tarefa de processamento em segundo plano
Outro tipo de hack de fundo é a tarefa de processamento BG. Você pode usá-lo para treinar o modelo de ML no dispositivo ou fazer uma limpeza no banco de dados. A Apple promete que o sistema é capaz de alocar vários minutos para esse tipo de tarefa, que é uma inovação muito importante para trabalhos pesados que não cabem em 30 segundos miseráveis.
Novamente um exemplo:
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } }
Pontos importantes:
- requiesExternalPower é um valor booleano que indica se um dispositivo conectado a uma fonte de energia é necessário para uma tarefa de processamento.
- requireNetworkConnectivity - Um valor booleano que indica se uma conexão de rede é necessária para uma tarefa de processamento.
Depuração
Aqui também não é sem amenidades. O atraso entre o tempo de execução agendado da tarefa em segundo plano e o momento em que o sistema inicia o aplicativo para concluí-lo pode levar várias horas. Ao desenvolver um aplicativo, você pode usar duas funções privadas para iniciar uma tarefa e forçar sua conclusão antecipada de acordo com a linha do tempo selecionada. Os recursos de depuração funcionam apenas em dispositivos.
- Início da tarefa:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]
- Rescisão antecipada forçada da tarefa:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]
Em conclusão
BackgroundTasks é uma ótima maneira de planejar seu trabalho duro com a melhor experiência do usuário usando seu ambiente. Dado que, desde a 13ª versão do sistema, muitos métodos para trabalhar em segundo plano estão se tornando obsoletos, a estrutura ainda será muito popular em aplicativos. Dadas as possibilidades acima, isso é bastante lógico.
Eu também recomendo assistir a um
vídeo da WWDC , os exemplos descritos são muito interessantes.