2013-08-12 13 views
5

Według dokumentów Apple możemy zidentyfikować dotknięcie użytkownika powiadomieniem, sprawdzając, czy zmienna stanu aplikacji jest nieaktywna (link).Wykrywanie kranu użytkownika po powiadomieniu

iOS Uwaga: iOS, można określić, czy dana aplikacja jest uruchomiona wskutek użytkownikowi dotknięcie przycisku akcji lub czy zgłoszenie został dostarczony do aplikacji już uruchomiony przez zbadaniu stanu aplikacji . W implementacji delegata aplikacja: didReceiveRemoteNotification: lub aplikacja: didReceiveLocalNotification: metoda, uzyskaj wartość właściwości applicationState i oceń ją. Jeśli wartość wynosi UIApplicationStateInactive, użytkownik stuknął przycisk akcji; jeśli wartość to UIApplicationStateActive, aplikacja otrzymała powiadomienie z wyprzedzeniem, gdy otrzymała powiadomienie.

Ale widzę przypadek użycia tam, gdzie istnieje system ostrzegania (By system ostrzegania, to znaczy powiadomienie pogląd przedstawiony w planie aplikacji, który jest kontrolowany przez iOS) na pierwszym planie, a aplikacja jest nieaktywna state (Kiedy pojawi się "alert systemowy", aplikacja za nią jest nieaktywna przez iOS, ustawiając aplikację application state na UIApplicationStateInactive), ale użytkownik nadal będzie mógł zobaczyć zawartość aplikacji na ekranie. Patrz załącznik poniżej:

enter image description here

W tym stanie, jeśli aplikacja otrzymuje powiadomienie, będzie zachowywać się jak gdyby zapukał powiadamiania użytkownika. Czy istnieje rozwiązanie, aby rozwiązać ten przypadek użycia?

+1

Dość mylące. Co dokładnie oznacza "alert systemu na pierwszym planie, a aplikacja jest w stanie nieaktywnym"? –

+0

@HinataHyuga Na zrzucie ekranu mam przykład alertu systemowego (alert powiadomień na aplikacji Gmail), który jest kontrolowany przez iOS, a nie przez aplikację. W tym momencie iOS traktuje aplikację, ponieważ jest w stanie nieaktywnym (aplikacja status aplikacji zostanie wyłączona). – Shashank

+0

za każdym razem 'application: didReceiveLocalNotification:' wywołanie metody po otrzymaniu powiadomienia. – iPatel

Odpowiedz

5
- (void)application:(UIApplication*)application didReceiveRemoteNotification: 
(NSDictionary*)userInfo 
{ 
     UIApplicationState state = [application applicationState]; 
     if (state == UIApplicationStateActive) 
     { 
       //When your app was active and it got push notification 
     } 
     else if (state == UIApplicationStateInactive) 
     { 
       //When your app was in background and it got push notification 
     } 
} 

i didFinishLaunchingWithOptions zostanie wywołana, gdy aplikacja nie została uruchomiona i uruchamianie został kliknięty w swoim zgłoszeniu.

Po wyświetleniu alertu w aplikacji didReceiveRemoteNotification można zidentyfikować dotknięcie metody delegata alertu, tj. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex.

+0

Rozumiem. Chcę rzetelnie sprawdzić, czy użytkownik dotknął powiadomienia, nawet gdy użytkownik znajduje się w stanie, jak pokazano na zrzucie ekranu. – Shashank

+1

To jest niepoprawne. Ta metoda jest wywoływana tylko wtedy, gdy aplikacja jest uruchomiona."Jeśli aplikacja nie jest uruchomiona po nadejściu powiadomienia push, metoda uruchamia aplikację i dostarcza odpowiednich informacji w słowniku opcji uruchamiania. Aplikacja nie wywołuje tej metody obsługi tego powiadomienia push." – nerowolfe

+0

Jak pokazano na zrzucie ekranu - ten alert jest pokazywany za pomocą kodu, nie jest powiadomieniem systemowym o powiadomieniu. – nerowolfe

0

one rozwiązać ten problem na ios10, gdy metoda add:

userNotificationCenter willPresentNotification. 

to będzie tylko wywoływana, gdy aplikacja jest w forground/stan aktywny, a powiadomienie pojawi się dopiero po użytkownik odwoływania inny system ostrzegania .

+0

Myślę, że zamiast tego miałeś na myśli ['opcjonalne func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive odpowiedź: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void)'] (https://developer.apple.com/ dokumentacja/usernotifications/unusernotification_enterdelegate/1649501-usernotificationcenter). <- Ta metoda faktycznie przechwytuje odpowiedź, tj. Kran. 'WillPresentNotification' jest tylko wtedy, gdy aplikacja znajduje się na ** pierwszym planie ** ... a kiedy jesteś na pierwszym planie, po prostu wyświetlasz alert i sam proces. – Honey

Powiązane problemy