W rzeczywistości nie ma potrzeby dodawania UIBackgroundModes do .plist tylko po to, aby używać zdalnych powiadomień.
Wiem, że trochę dzielę spadkobierców (druga odpowiedź jest przeważnie świetna i być może coś nowego w iOS 11), ale pytanie dotyczy powiadomień push wymagających aktualizacji w tle, a tak nie jest.
Różnica polega na tym, że istnieją dwie różne metody, które akceptują powiadomienia w AppDelegate;
Ten nie wymaga używania UIBackgroundModes:
optional func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
Powyższe zastępuje przestarzałe od wersji iOS 11:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])
A ten wymaga możliwości trybów w tle:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
Najważniejsze jest to, że pierwsza (i przestarzała, którą zastąpiła) działa tylko wtedy, gdy aplikacja jest na pierwszym planie. Ta ostatnia będzie działać, jeśli aplikacja jest na pierwszym planie LUB w tle. Zobacz specyfikację tego konkretnego modelu użytkowego:
Użyj tej metody do przetwarzania przychodzących zdalnych powiadomień dla swojej aplikacji. W przeciwieństwie do metody application (_: didReceiveRemoteNotification :), która jest wywoływana tylko wtedy, gdy aplikacja działa na pierwszym planie, system wywołuje tę metodę, gdy aplikacja działa na pierwszym planie lub w tle.
Dlatego jeśli potrzebujesz powiadomień push, zdecyduj, czy chcesz działać w tle - tylko jeśli potrzebujesz obu, zaimplementuj metodę sugerowaną przez ostrzeżenie.