De hecho, no es necesario que agregue UIBackgroundModes a .plist simplemente para usar notificaciones remotas.
Sé que estoy dividiendo un poco a los herederos (la otra respuesta es en su mayoría excelente, y tal vez algo sea nuevo a partir de iOS 11), pero la pregunta se refiere a notificaciones automáticas que requieren actualizaciones en segundo plano, y no es así.
La distinción aquí es que hay dos métodos diferentes que aceptan notificaciones en AppDelegate;
Este no requiere que uses UIBackgroundModes:
optional func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
Lo anterior reemplaza el obsoleto a partir de iOS 11:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])
Y este requiere capacidad de modos de fondo:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
La clave aquí es que la primera (y la obsoleta que reemplazó) solo se ejecuta cuando la aplicación está en primer plano. Este último se ejecutará si la aplicación está en primer plano O en segundo plano. Consulte las especificaciones de este nugget específico:
Utilice este método para procesar las notificaciones remotas entrantes para su aplicación. A diferencia del método application (_: didReceiveRemoteNotification :), que se llama solo cuando su aplicación se ejecuta en primer plano, el sistema llama a este método cuando su aplicación se ejecuta en primer plano o en segundo plano.
Por lo tanto, si necesita notificaciones push, decida si necesita ejecutar en segundo plano; solo si necesita ambas, debe implementar el método sugerido por la advertencia.