Czy można dowiedzieć się, czy aplikacja została uruchomiona / otwarta z powiadomienia push?
Wydaje mi się, że wydarzenie inauguracyjne można złapać tutaj:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions != nil) {
// Launched from push notification
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}
Jak jednak mogę wykryć, że została otwarta z powiadomienia push, gdy aplikacja była w tle?
Odpowiedzi:
Zobacz ten kod:
taki sam jak
źródło
późno, ale może przydatne
Gdy aplikacja nie działa
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
jest nazywany ..
gdzie musisz sprawdzić powiadomienia push
źródło
Problem, który napotkaliśmy, polegał na poprawnym aktualizowaniu widoku po uruchomieniu aplikacji. Istnieją tu skomplikowane sekwencje metod cyklu życia, które są mylące.
Metody cyklu życia
Nasze testy na iOS 10 ujawniły następujące sekwencje metod cyklu życia dla różnych przypadków:
Problem
Ok, więc teraz musimy:
Problem polega na tym, że aktualizacja widoku musi nastąpić, gdy aplikacja faktycznie staje się aktywna, co jest tą samą metodą cyklu życia we wszystkich przypadkach.
Szkic naszego rozwiązania
Oto główne elementy naszego rozwiązania:
notificationUserInfo
zmienną wystąpienia w AppDelegate.notificationUserInfo = nil
w obuapplicationWillEnterForeground
ididFinishLaunchingWithOptions
.notificationUserInfo = userInfo
wdidReceiveRemoteNotification:inactive
applicationDidBecomeActive
zawsze wywołuj niestandardową metodęopenViewFromNotification
i podajself.notificationUserInfo
. Jeśliself.notificationUserInfo
jest nil, wróć wcześniej, w przeciwnym razie otwórz widok na podstawie stanu powiadomienia znalezionego wself.notificationUserInfo
.Wyjaśnienie
Podczas otwierania z wypychania
didFinishLaunchingWithOptions
lubapplicationWillEnterForeground
jest zawsze wywoływana bezpośrednio przeddidReceiveRemoteNotification:inactive
, więc najpierw resetujemy notificationUserInfo w tych metodach, aby nie było przestarzałego stanu. Następnie, jeślididReceiveRemoteNotification:inactive
zostanie wywołany, wiemy, że otwieramy z push, więc ustawiamy,self.notificationUserInfo
który jest następnie odbierany,applicationDidBecomeActive
aby przekierować użytkownika do właściwego widoku.Jest jeszcze jeden przypadek, w którym użytkownik ma otwartą aplikację w przełączniku aplikacji (tj. Dwukrotne dotknięcie przycisku strony głównej, gdy aplikacja jest na pierwszym planie), a następnie otrzymuje powiadomienie push. Tylko w tym przypadku
didReceiveRemoteNotification:inactive
jest wywoływana i ani WillEnterForeground, ani didFinishLaunching nie są wywoływane, więc do obsługi tego przypadku potrzebny jest specjalny stan.Mam nadzieję że to pomoże.
źródło
receive
metodach, gdy stan aplikacji jest aktywny lub aplikacja jest wznawiana. Może to prowadzić do problemów ze zmianą VC, gdy aplikacja jest nadal nieaktywna. Twoje rozwiązanie wygląda świetnie, dopóki Apple ponownie nie zmieni cyklu życia.applicationWillResignActive
wywoływany jest tylko element, a następnieapplicationDidBecomeActive
. Dlatego poapplicationWillResignActive
wywołaniu nie zapisuj otrzymanego powiadomienia do momentu wywołaniaapplicationDidEnterBackground
lubapplicationDidBecomeActive
.To bardzo wysłużony post ... ale wciąż brakuje w nim rzeczywistego rozwiązania problemu (jak wskazano w różnych komentarzach).
Powód można zobaczyć w przebiegu połączenia, gdy nadejdzie powiadomienie,
application:didReceiveRemoteNotification...
zostaje wywołany, gdy powiadomienie zostanie odebrane ORAZ ponownie, gdy powiadomienie zostanie dotknięte przez użytkownika. Z tego powodu nie można tego stwierdzić, patrząc po prostu,
UIApplicationState
czy użytkownik ją stuknął.Ponadto nie musisz już zajmować się sytuacją `` zimnego startu '' aplikacji,
application:didFinishLaunchingWithOptions...
jakapplication:didReceiveRemoteNotification...
to się nazywa ponownie po uruchomieniu w iOS 9+ (może również 8).Jak więc możesz stwierdzić, czy użytkownik kliknął, rozpoczął łańcuch zdarzeń? Moim rozwiązaniem jest zaznaczenie czasu, w którym aplikacja zaczyna wychodzić z tła lub zimnego startu, a następnie sprawdzenie tego czasu
application:didReceiveRemoteNotification...
. Jeśli jest krótszy niż 0,1 s, możesz być całkiem pewien, że dotknięcie spowodowało uruchomienie.Swift 2.x
Szybki 3
Przetestowałem to w obu przypadkach (aplikacja w tle, aplikacja nie działa) na iOS 9+ i działa jak urok. 0,1 s jest również dość konserwatywne, rzeczywista wartość to ~ 0,002 s, więc 0,01 również jest w porządku.
źródło
UNNotificationCenter
wersje , możesz po prostu użyć API, w szczególności metod UNNotificationCenterDelegate. Te API wywołująuserNotificationCenter(UNUserNotificationCenter, didReceive: UNNotificationResponse, withCompletionHandler: @escaping () -> Void)
metodę func tylko wtedy, gdy użytkownik faktycznie dotknął powiadomienia.applicationWillEnterForeground
połączenia, w rezultacie rozwiązanie nie wykrywa dotknięcia.UNUserNotificationCenter.current().delegate
wapplication:didFinishLaunchingWithOptions
, aplikacja zadzwoniuserNotificationCenter(didReceive response)
po dotknięciu w opisanym przypadkuGdy aplikacja zostanie zamknięta, a użytkownik kliknie powiadomienie push
Gdy aplikacja działa w tle, a użytkownik dotyka powiadomienia push
W zależności od Twojej aplikacji może również wysłać Ci cichy push z
content-available
wnętrzemaps
, więc pamiętaj również o tym :) Zobacz https://stackoverflow.com/a/33778990/1418457źródło
Swift 2.0 dla stanu `` nie działa '' (powiadomienie lokalne i zdalne)
źródło
W
application:didReceiveRemoteNotification:
sprawdzić, czy otrzymaliśmy powiadomienie, gdy aplikacja jest na pierwszym planie lub w tle.Jeśli został odebrany w tle, uruchom aplikację z poziomu powiadomienia.
źródło
Dla szybkiego:
źródło
Tak, możesz wykryć tą metodą w appDelegate :
W przypadku powiadomienia lokalnego:
źródło
jeśli ktoś chce uzyskać szybką odpowiedź 3
źródło
Publikowanie tego dla użytkowników platformy Xamarin.
Kluczem do wykrycia, czy aplikacja została uruchomiona za pośrednictwem powiadomienia wypychanego, jest
AppDelegate.FinishedLaunching(UIApplication app, NSDictionary options)
metoda i słownik opcji, który jest przekazywany.Słownik opcje będą mieć ten klucz w nim, czy jest to lokalny powiadomienie:
UIApplication.LaunchOptionsLocalNotificationKey
.Jeśli jest to zdalne powiadomienie, będzie
UIApplication.LaunchOptionsRemoteNotificationKey
.Gdy klucz jest
LaunchOptionsLocalNotificationKey
, obiekt jest typuUILocalNotification
. Następnie możesz spojrzeć na powiadomienie i określić, które to jest konkretne powiadomienie.Porada od specjalistów:
UILocalNotification
nie zawiera identyfikatora, tak samo jakUNNotificationRequest
. Umieść klucz słownika w UserInfo zawierającym requestId, aby podczas testowaniaUILocalNotification
był dostępny określony requestId, na którym można oprzeć pewną logikę.Zauważyłem, że nawet na urządzeniach iOS 10+, które podczas tworzenia powiadomień o lokalizacji za pomocą
UNUserNotificationCenter
'sAddNotificationRequest
&UNMutableNotificationContent
, że gdy aplikacja nie działa (zabiłem ją) i jest uruchamiana przez dotknięcie powiadomienia w centrum powiadomień, że słownik nadal zawieraUILocalNotificaiton
przedmiot.Oznacza to, że mój kod sprawdzający uruchamianie na podstawie powiadomień będzie działał na urządzeniach z systemem iOS 8 i iOS 10+
źródło
Prosto z dokumentacji dla
Jeśli aplikacja działa i odbiera zdalne powiadomienie, wywołuje tę metodę w celu przetworzenia powiadomienia.
Twoja implementacja tej metody powinna korzystać z powiadomienia, aby podjąć odpowiednie działania.
I trochę później
Jeśli aplikacja nie działa w momencie nadejścia powiadomienia wypychanego, metoda uruchamia aplikację i udostępnia odpowiednie informacje w słowniku opcji uruchamiania.
Aplikacja nie wywołuje tej metody w celu obsługi tego powiadomienia wypychanego.
Zamiast tego Twoja implementacja
lub
musi pobrać dane ładunku powiadomienia wypychanego i odpowiednio zareagować.
źródło
Zacznę od wykresu stanu, który utworzyłem na własny użytek, aby go dokładniej zwizualizować i wziąć pod uwagę wszystkie inne stany: https://docs.google.com/spreadsheets/d/e/2PACX-1vSdKOgo_F1TZwGJBAED4C_7cml0bEATqeL3P9UKpBwASlT6ZkU3iubLg31g ? gid = 0 & single = true
Korzystając z tego wykresu, możemy zobaczyć, co jest faktycznie wymagane, aby opracować solidny system obsługi powiadomień, który działa w prawie wszystkich możliwych przypadkach użycia.
Kompletne rozwiązanie ↓
Uwaga: Podobna odpowiedź jest sugerowana w komentarzach do odpowiedzi Erica, jednak arkusz stanu pomaga w znalezieniu wszystkich możliwych scenariuszy, tak jak w mojej aplikacji.
Proszę znaleźć pełny kod poniżej i komentarz poniżej, jeśli jakikolwiek konkretny przypadek nie jest obsługiwany:
AppDelegate
NotificationUtils : Tutaj możesz napisać cały kod, aby przejść do różnych części aplikacji, obsługiwać bazy danych (CoreData / Realm) i wykonać wszystkie inne czynności, które należy wykonać po otrzymaniu powiadomienia.
źródło
źródło
Jest tylko jeden niezawodny sposób i działa tylko na iOS 10+ :
Za pomocą metody
UNUserNotificationCenter
implementacjiUNUserNotificationCenterDelegate
:źródło
Możesz użyć:
do obsługi zdalnych powiadomień push.
Sprawdź tutaj dokumentację
źródło
Jeszcze tego nie próbowałem, ale może mógłbyś wysłać sobie powiadomienie? http://nshipster.com/nsnotification-and-nsnotificationcenter/
źródło
źródło
Problem z tym pytaniem polega na tym, że „otwieranie” aplikacji nie jest dobrze zdefiniowane. Aplikacja jest uruchamiana na zimno ze stanu niedziałającego lub reaktywowana ze stanu nieaktywnego (np. W wyniku przełączenia z powrotem z innej aplikacji). Oto moje rozwiązanie, aby rozróżnić wszystkie te możliwe stany:
I
MXDefaults
jest tylko małym opakowaniemNSUserDefaults
.źródło
Dla
swift
źródło
Xcode 10 Swift 4.2.0 Łatka
źródło
W przypadku iOS 10+ możesz użyć tej metody, aby dowiedzieć się, kiedy kliknięto powiadomienie, niezależnie od stanu aplikacji.
źródło
Odpowiedź M.Othmana jest poprawna dla aplikacji, które nie zawierają delegata sceny Dla aplikacji delegata sceny To działało dla mnie na iOS 13
Oto kod, który należy zapisać w will connect scene
Kod delegata aplikacji do obsługi wcześniejszych wersji didFinishLaunchingWithOptions
źródło
Dla szybkich użytkowników:
Jeśli chcesz uruchomić inną stronę podczas otwierania z wypychania lub czegoś podobnego, musisz to sprawdzić w następujący sposób
didFinishLaunchingWithOptions
:źródło
W SWIFT:
Uruchamiam powiadomienia push (z pobieraniem w tle). Kiedy moja aplikacja działa w tle i otrzymuję powiadomienie push, stwierdziłem, że didReceiveRemoteNotification w appDelegate zostanie wywołane dwukrotnie; raz, gdy otrzymano powiadomienie, a drugi, gdy użytkownik kliknie alert powiadomienia.
Aby wykryć, czy kliknięto alert powiadomienia, po prostu sprawdź, czy applicationState surowa wartość == 1 wewnątrz didReceiveRemoteNotification w appDelegate.
Mam nadzieję, że to pomoże.
źródło
Gdy aplikacja jest w tle , możesz użyć shanegao
Ale jeśli chcesz uruchomić aplikację i gdy aplikacja jest zamknięta i chcesz debugować aplikację, możesz przejść do Edytuj schemat iw lewym menu wybierz Uruchom, a następnie podczas uruchamiania wybierz Czekaj na uruchomienie pliku wykonywalnego, a następnie uruchom aplikację, gdy kliknij powiadomienie push
Edytuj schemat> Uruchom> Poczekaj na uruchomienie pliku wykonywalnego
źródło