applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground

Qual é o delegado adequado a ser implementado quando um aplicativo está saindo do plano de fundo e você deseja prepará-lo para ser ativo?

applicationWillEnterForeground vs applicationDidBecomeActive - Qual é a diferença?

Qual é o delegado adequado a ser implementado para quando um aplicativo entra em suspensão e você deseja prepará-lo para limpar e salvar dados?

applicationWillResignActive vs. applicationDidEnterBackground - Qual é a diferença?

Além disso, notei que applicationWillResignActive é chamado quando um SMS ou chamada é recebida, mas o usuário escolhe clicar em OK e continuar. Não quero que meu aplicativo execute nenhuma ação nesses casos. Eu só quero que ele continue funcionando sem nenhuma limpeza intermediária, pois o usuário não saiu do aplicativo. Portanto, acho que faz mais sentido fazer o trabalho de limpeza apenas no applicationDidEnterBackground.

Agradeço sua opinião sobre as práticas recomendadas a seguir na escolha de quais delegados implementar para acordar e dormir, além de considerar eventos como ser interrompido por SMS / chamadas.

obrigado