Jest wiele wątków związanych z przepełnieniem stosów dotyczących tego tematu, ale nadal nie znalazłem dobrego rozwiązania.
Jeśli aplikacja nie jest w tle, można sprawdzić launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]
na application:didFinishLaunchingWithOptions:
wezwanie, aby zobaczyć czy jest otwarty od zgłoszenia.
Jeśli aplikacja działa w tle, wszystkie posty sugerują użycie application:didReceiveRemoteNotification:
i sprawdzenie stanu aplikacji. Ale jak eksperymentowałem (i jak sugeruje nazwa tego API), ta metoda jest wywoływana po odebraniu powiadomienia, zamiast dotknięcia.
Problem polega więc na tym, że jeśli aplikacja jest uruchomiona, a następnie działa w tle, i wiesz, że otrzymano powiadomienie application:didReceiveNotification
( application:didFinishLaunchWithOptions:
nie zostanie uruchomione w tym momencie), skąd wiesz, czy użytkownik wznowił aplikację, dotykając powiadomienia lub po prostu dotykając ikonę aplikacji? Ponieważ jeśli użytkownik dotknął powiadomienia, oczekuje się, że otworzy stronę wspomnianą w tym powiadomieniu. W przeciwnym razie nie powinno.
Mógłbym użyć handleActionWithIdentifier
do powiadomień o niestandardowych akcjach, ale jest to wyzwalane tylko po dotknięciu przycisku niestandardowej akcji, a nie po dotknięciu przez użytkownika głównej treści powiadomienia.
Dzięki.
EDYTOWAĆ:
po przeczytaniu jednej odpowiedzi poniżej pomyślałem, że mogę wyjaśnić swoje pytanie:
Jak możemy rozróżnić te 2 scenariusze:
(A) 1. aplikacja przechodzi w tło; 2. otrzymane powiadomienie; 3. użytkownik dotyka powiadomienia; 4. aplikacja przechodzi na pierwszy plan
(B) 1. aplikacja przechodzi w tło; 2. otrzymane powiadomienie; 3. użytkownik ignoruje powiadomienie i później dotyka ikony aplikacji; 4. aplikacja przechodzi na pierwszy plan
Ponieważ application:didReceiveRemoteNotification:
jest wyzwalane w obu przypadkach w kroku 2.
A może powinien application:didReceiveRemoteNotification:
zostać uruchomiony w kroku 3 tylko dla (A), ale w jakiś sposób skonfigurowałem nieprawidłową aplikację, więc widzę ją w kroku 2?
Odpowiedzi:
OK, w końcu się domyśliłem.
W ustawieniach docelowych ➝ Karta Możliwości ➝ Tryby w tle, jeśli zaznaczysz opcję „Powiadomienia zdalne”,
application:didReceiveRemoteNotification:
zostaną uruchomione, gdy tylko nadejdzie powiadomienie (o ile aplikacja działa w tle) i w takim przypadku nie ma sposobu, aby stwierdzić, czy użytkownik dotknie powiadomienia.Jeśli odznaczysz to pole,
application:didReceiveRemoteNotification:
zostanie uruchomione dopiero po dotknięciu powiadomienia.To trochę dziwne, że zaznaczenie tego pola zmieni sposób zachowania jednej z metod delegata aplikacji. Byłoby lepiej, gdyby to pole było zaznaczone, Apple używa dwóch różnych metod delegatów do odbierania powiadomień i stukania powiadomień. Myślę, że większość programistów zawsze chce wiedzieć, czy dotknęło powiadomienia, czy nie.
Mam nadzieję, że będzie to pomocne dla każdego, kto napotka ten problem. Apple również nie udokumentował tego jasno tutaj, więc zajęło mi trochę czasu, zanim się zorientowałem.
źródło
Szukałem tego samego co Ty i znalazłem rozwiązanie, które nie wymaga odhaczania zdalnego powiadomienia.
Aby sprawdzić, czy użytkownik kliknął, aplikacja jest w tle lub jest aktywna, wystarczy sprawdzić stan aplikacji w
Aby uzyskać więcej informacji, sprawdź:
UIKit Framework Reference> UIApplication Class Reference> UIApplicationState
źródło
content-available
klucz, ale powiadomienie musi być ciche (tj. Nie zawierać dźwięku ani znaczka), jak podano w oficjalnych dokumentach .func applicationDidEnterBackground(_ application: UIApplication)
i false w tym,func applicationDidBecomeActive(_ application: UIApplication)
co pozwoliło mi pokazać w aplikacji powiadomienia, gdy aplikacja jest nieaktywna z powodu centrum sterowania lub listy powiadomieńWedług iOS / XCode: skąd wiedzieć, że aplikacja została uruchomiona za pomocą kliknięcia powiadomienia lub ikony aplikacji Springboard? musisz sprawdzić stan aplikacji w didReceiveLocalNotification w następujący sposób:
Chociaż nie ma to dla mnie pełnego sensu, wydaje się, że działa.
źródło
Jeśli ktoś chce tego w swift 3.0
dla szybkiego 4
źródło
Ja też napotkałem ten problem - ale na iOS 11 z nowym
UserNotifications
Framework.Tutaj dla mnie jest tak:
application:didFinishLaunchingWithOptions:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
userNotificationCenter(_:willPresent:withCompletionHandler:)
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
źródło
Jeśli masz zaznaczone "Tryby w tle"> "Zdalne powiadomienia" == TAK, stuknij w powiadomienie, które pojawi się za:
Pomogło mi. Miłej zabawy :)
źródło
W moim przypadku wyłączenie trybu tła nie miało żadnego znaczenia. Jednak gdy aplikacja została zawieszona, a użytkownik dotknął powiadomienia, mogłem obsłużyć ten przypadek w tej metodzie wywołania zwrotnego:
źródło
W przypadku iOS 10 i nowszych umieść to w AppDelegate, aby dowiedzieć się, że powiadomienie jest dotknięte (działa nawet, gdy aplikacja jest zamknięta lub otwarta)
źródło
Istnieją dwie funkcje dla uchwytu otrzymanego w
PushNotificationManager
klasie PushNotification :Jak przetestowałem pierwszy wyzwalacz, gdy tylko nadeszło powiadomienie
I drugi po dotknięciu powiadomienia:
Przetestowałem to również z włączonymi i wyłączonymi stanami zdalnego powiadamiania (w trybach w tle)
źródło
SWIFT 5.1
UIApplication.State
u mnie nie zadziałało, ponieważ po odczytaniu odcisku palca (pojawia się modal) w mojej aplikacji, powiadomienie jest również rzucane w górnym pasku i użytkownik musi go kliknąć.Stworzyłem
public static var isNotificationFromApp: Bool = false
in
AppDelegate
i ustawiam totrue
na początku,viewController
a potem w powiadomieniustoryboard
/viewController
właśnie to sprawdzam :)Mam nadzieję, że może się przydać
źródło
Możesz skonfigurować ładunek powiadomienia wypychanego, aby wywoływał delegata aplikacji
application:didReceiveRemoteNotification:fetchCompletionHandler:
metodę gdy aplikacja działa w tle. Możesz tutaj ustawić flagę, aby przy następnym uruchomieniu aplikacji przez użytkownika można było wykonać operację.Z dokumentacji firmy Apple należy skorzystać z tej metody, aby pobrać nową zawartość związaną z powiadomieniem push. Aby to zadziałało, musisz włączyć zdalne powiadamianie z trybów w tle, a ładunek powiadomienia push musi zawierać
content-available
klucz z wartością ustawioną na 1. Więcej informacji można znaleźć w sekcji Używanie powiadomień push do inicjowania pobierania z dokumentu Apple tutaj .Innym sposobem jest liczenie znaczków w ładunku powiadomień push. Dlatego następnym razem, gdy aplikacja zostanie uruchomiona, możesz sprawdzić liczbę odznak aplikacji. Jeśli jego wartość jest większa od zera, wykonaj operację i zeruj / wyczyść liczbę identyfikatorów z serwera.
Mam nadzieję, że to ci pomoże.
źródło