Czy zdalne powiadomienia push wymagają dodania UIBackgroundModes w Info.plist?

105

Mam zintegrowane zdalne powiadomienia push, ale otrzymuję takie ostrzeżenie:

didReceiveRemoteNotification:fetchCompletionHandler:], ale nadal musisz dodać „ remote-notification” do listy obsługiwanych UIBackgroundModeplików w swoim Info.plist.

Moja wersja Xcode to 8.3.1. Naprawdę chcę to dodać Info.plist. Skorzystałem również z kilku tutoriali, ale oni też o tym nie wspomnieli. Co naprawdę powinienem zrobić?

user1960169
źródło

Odpowiedzi:

247

Tak, należy włączyć tryby w tle / zdalne powiadomienia, aby móc używać zdalnych powiadomień do aktualizacji w tle.

Najłatwiej to zrobić za pomocą ustawień projektu. Przejdź do Cele -> Twoja aplikacja -> Możliwości -> Tryby w tle i sprawdź Zdalne powiadomienia . Spowoduje to automatyczne włączenie wymaganych ustawień.

Lista rozwijana Tryby tła w Ustawieniach projektu

Tamás Sengel
źródło
3
Sprawdziłem już to pole, ale nadal otrzymuję ten sam błąd.
Anuj
Anuj zobacz moją odpowiedź poniżej
Joshua Cleetus,
1
Nie zgadzam się z tą odpowiedzią. Powinieneś włączać tryby tła -> Zdalne powiadomienia tylko wtedy, gdy używasz zdalnego powiadomienia do aktualizacji w tle. Zapoznaj się z dokumentacją tutaj Konfigurowanie powiadomienia o aktualizacji w tle
jzeferino,
1
@jzeferino Dziękuję za powiadomienie, dodałem kilka wyjaśnień do mojej odpowiedzi. Zwróć uwagę, że pierwotne pytanie dotyczyło application(_:didReceiveRemoteNotification:fetchCompletionHandler:)funkcji, która służy do obsługi pobierania danych.
Tamás Sengel
To świetnie, ale odpowiada na pytanie, czy potrzebujesz możliwości aktualizacji w tle, co oczywiście robisz. Opublikowałem odpowiedź na temat tego, czy musisz ustawić możliwości trybów tła tylko dla powiadomień push (spoiler, nie musisz).
mobob
30

Możesz także edytować potrzebne info.plist (Otwórz jako -> Kod źródłowy) i wkleić:

<dict>
<key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>
Aleksandr B.
źródło
7
Jest teraz automatycznie dodawany przez Xcode podczas sprawdzania zdalnych powiadomień w trybach w tle
Vinoth Vino,
2
Nie dla mnie: wersja 11.4.1 (11E503a)
paiego
4

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.

mobob
źródło
3

Zdarzyło mi się to nawet po ustawieniu trybu zdalnych powiadomień w tle w możliwościach. Problem polegał na tym, że miałem trzy cele, jeden dotyczący produkcji, jeden dla QA i jeden dla inscenizacji. Musiałem ustawić zdalne powiadomienia we wszystkich trzech celach i to naprawiło ostrzeżenie.

Joshua Cleetus
źródło