2011-08-24 8 views
29

Po otrzymaniu UILocalNotificationUstalenie czy UILocalNotification zwolniony z aplikacji w planie lub w tle

  1. Metoda application:DidReceiveLocalNotification jest wywoływana, gdy aplikacja jest na pierwszym planie.
  2. Gdy aplikacja jest w tle, otwiera aplikację, a następnie wywołuje application:DidReceiveLocalNotification.

Jak ustalić, który z tych scenariuszy ma miejsce? Chciałbym traktować je inaczej.

Jeśli aplikacja była w tle, użytkownik wskazał, że chce obejrzeć wydarzenie. Więc w application:DidReceiveLocalNotification nie chcę ich ponownie pytać, chcę tylko zabrać ich na to wydarzenie.

Ale jeśli aplikacja jest na pierwszym planie, gdy powiadomienie odpala i dzwoni application:DidReceiveLocalNotification, chcę zapytać użytkownika, czy chce obejrzeć wydarzenie.

W istocie musiałbym:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

if (appLauncedFromBackground) 
    // go to event 
else 
    // ask if user wants to view event 

} 

myślałem o napisaniu wartość bool do NSUserDefault wewnątrz applicationWillEnterForeground:application a następnie odczyt i zerowanie go wewnątrz application:DidReceiveLocalNotification. Ale pomyślałem, że jeśli istnieje sposób na sprawdzenie, to byłoby o wiele lepsza trasa.

Dzięki, Mark

EDIT * ** * ** * ** * ** * ** * ** * * ** ** * ** * **

Dzięki Xuzhe, ale to nie zadziała w tej sytuacji. Oto trochę więcej szczegółów, które mogą wyjaśnić, dlaczego to nie zadziała, i być może pomóc komuś w udzieleniu odpowiedzi:

Ustawienie UILocalNotification, które tu ustawiam, jest zdarzeniem podobnym do zdarzenia kalendarza zaplanowanego do uruchomienia u wybranego użytkownika więc kiedy planuję powiadomienie, nie będę miał pojęcia, co zrobi użytkownik po uruchomieniu powiadomienia. Korzystam z parametru userInfo powiadomienia, aby przechowywać dane o zdarzeniu, które jest zaplanowane, ale ustawienie wartości takiej jak w BackBack zgodnie z sugestią nie będzie działać.

Wiem, że będzie to jedna z dwóch sytuacji, jeśli użytkownik zdecyduje, że chce "obejrzeć" wydarzenie. (wszystko to zakłada, że ​​aplikacja jest albo w tle, albo na pierwszym planie, a NIE, aby zakończyć).

1 - Jeśli jest wyzwalana, gdy aplikacja nie jest używana & & aplikacja znajduje się w tle i nie rzucić, iOS poinformuje użytkownika, że ​​wystąpiło zdarzenie i stanowią opcję dla zamiar odpowiedzialnego aplikacji (co w tym przypadku jest moje). W tym momencie zakładając, że użytkownik mówi "tak, zabierz mnie do tej fajnej aplikacji", otworzy aplikację z tła i zadzwoni do aplikacji: DidReceiveLocalNotification, gdzie mogę uzyskać wszystkie powiadomienia userInfo.

2 - Użytkownik przypadkowo znajduje się w mojej aplikacji, gdy ma miejsce zaplanowane wydarzenie. W tym momencie aplikacja: metoda DidReceiveLocalNotification jest wywoływana ponownie, gdzie mogę uzyskać wszystkie powiadomienia userInfo.

Ale jest w tym momencie, że chcę wiedzieć, które z tych dwóch scenariuszy właśnie miała miejsce 1 lub 2.

nadzieję, że ten dodatkowy szczegół o moim użytkowania UILocalNotification pomogą w odpowiedzi na to pytanie. Dzięki z góry - znak

END EDIT * ** * ** * ** * ** * ** * ** * ** * ** * ***

Odpowiedz

46

Może najłatwiej jest, gdy aplikacja jest na pierwszym planie, nie wysłać LocalNotification ale po prostu zabierz użytkowników do wydarzenia.

Ale jeśli nalegasz na zrobienie tego za pomocą LocalNotification, tutaj jest łatwy sposób na wykrycie stanu Twojej aplikacji po uruchomieniu UILocalNotification.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    //[super application:application didReceiveLocalNotification:notification]; // In most case, you don't need this line 
    UIApplicationState state = [application applicationState]; 
    if (state == UIApplicationStateInactive) { 
     // Application was in the background when notification was delivered. 
    } else { 

    } 
} 
+2

Zmieniłem to pytanie, aby lepiej wyjaśnić. I dzięki, @usu, ale to nie zadziała dla mnie. Nie wylogowuję się z LocalNotification, jest to UILocalNotification, która została zaplanowana na jakiś czas. Dlatego nie mogę określić, co użytkownik będzie robić w tym czasie. –

+0

Zmieniono odpowiedź ponownie. Możesz łatwo sprawdzić stan swojej aplikacji za pomocą właściwości UIApplicationState. – xuzhe

+0

Bardzo, bardzo ładne. Naprawiono błąd, który miałem od dłuższego czasu. –

1

To właśnie dodałem do organów tych funkcji ... application didFinishLaunchingWithOptions:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
UILocalNotification *localNotif = 
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
if (localNotif) { //launched from notification 
    [userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 
else{ 
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 

W applicationDidEnterBackground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

W applicationWillEnterForeground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:YES forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

applicationDidBecomeActive:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
[userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
[userDefaults synchronize]; 

didReceiveLocalNotification:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
if(![userDefaults boolForKey:@"deactivate in-app notification"]){ 
    UIAlertView* alert= [[UIAlertView alloc]initWithTitle:@"My App" message:notif.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 

    NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; 
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; 
    [userDefaults synchronize]; 
} 

Teraz oba powiadomienia odeszły (szczególnie jeden pojawia się, gdy aplikacja jest w tle i otworzyć go z wpisu powiadomień.

1

W didReceiveLocalNotification można sprawdzić stan aplikacji:

[UIApplication shareApplication].applicationState

Jeśli jest równa UIApplicationStateInactive wiesz, że aplikacja była w tle, a użytkownik otworzył je z lokalnego wpisu powiadomień.

jeśli jest to UIApplicationStateActive, możesz chcieć wyświetlić swój własny alert dla użytkownika.

Powiązane problemy