Właściwy sposób wyjścia z aplikacji iPhone?

Programuję aplikację na iPhone ' a i muszę wymusić jej wyjście z powodu pewnych działań użytkownika. Po oczyszczeniu pamięci przydzielonej aplikacji, jaka jest odpowiednia metoda wywołania, aby zakończyć aplikację?

Author: GameLoading, 2008-12-10

22 answers

Próbowałeś exit(0)?

Alternatywnie, [[NSThread mainThread] exit], chociaż nie próbowałem, że wydaje się bardziej odpowiednie rozwiązanie.

 209
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 18:48:41

Na iPhonie nie ma koncepcji zamknięcia aplikacji. Jedyną czynnością, która powinna spowodować zamknięcie aplikacji, jest dotknięcie przycisku Home w telefonie, a programiści nie mają do tego dostępu.

Według Apple, Twoja aplikacja nie powinna zostać zamknięta sama. Ponieważ użytkownik nie nacisnął przycisku Strona główna, każdy powrót do ekranu głównego daje użytkownikowi wrażenie, że aplikacja uległa awarii. Jest to mylące, niestandardowe zachowanie i należy go unikać.

 265
Author: August,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 14:54:06

Exit (0) wyświetla się użytkownikowi jako awaria, więc wyświetla użytkownikowi komunikat z potwierdzeniem. Po potwierdzeniu zawieś (przycisk home naciśnij programowo) i odczekaj 2 sekundy, podczas gdy aplikacja przechodzi w tło z animacją, a następnie wyjdź za Widok użytkownika

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}
 46
Author: Salim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-23 05:54:32

To nie jest tak naprawdę sposób na rzucenie programu, ale sposób na zmuszenie ludzi do odejścia.

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];
 38
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-04 00:59:29

Przejdź do informacji.plist i zaznacz klawisz "aplikacja nie działa w tle". Tym razem, gdy użytkownik kliknie przycisk home, aplikacja całkowicie się kończy.

 37
Author: Kalyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 04:47:38

Sprawdź Q & a tutaj: https://developer.apple.com/library/content/qa/qa1561/_index.html

P: jak programowo zamknąć aplikację na iOS?

Nie ma API, które umożliwiałoby zakończenie aplikacji na iOS.

W systemie iOS użytkownik naciska przycisk Home, aby zamknąć aplikacje. Jeśli aplikacja ma warunki, w których nie może spełniać swojej zamierzonej funkcji, zaleca się wyświetlanie alertu dla użytkownika wskazuje to na charakter problemu i możliwe działania, które użytkownik może podjąć - włączenie WiFi, włączenie usług lokalizacji itp. Pozwól użytkownikowi zakończyć aplikację według własnego uznania.

Uwaga: Nie wywołaj funkcji exit. Aplikacje wywołujące exit będą wyświetlane użytkownikowi jako zawieszone, zamiast wykonywać pełne wdzięku zakończenie i animować powrót do ekranu głównego.

Dodatkowo dane nie mogą być zapisywane, ponieważ -applicationWillTerminate: i podobne metody UIApplicationDelegate nie będą wywoływane, jeśli wywołasz exit.

Jeśli podczas programowania lub testowania konieczne jest zakończenie aplikacji, zalecana jest funkcja abort lub makro assert

 37
Author: Wagh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 13:28:13

Dodaj właściwość UIApplicationExitsOnSuspend na aplikacji-info.plist to true

 15
Author: Aman Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-07 08:14:39

Po kilku testach mogę powiedzieć, co następuje:

  • korzystanie z prywatnego interfejsu: [UIApplication sharedApplication] spowoduje, że aplikacja wygląda jakby się zawiesiła, ale wywoła - (void)applicationWillTerminate:(UIApplication *)application zanim to zrobi;
  • użycie exit(0); również zakończy działanie aplikacji, ale będzie wyglądało "normalnie" (ikony springboard ' a pojawiają się tak, jak oczekiwano, z efektem pomniejszenia), ale nie wywoła metody delegate - (void)applicationWillTerminate:(UIApplication *)application.

Moja rada:

  1. ręcznie wywołaj - (void)applicationWillTerminate:(UIApplication *)application na delegata.
  2. Call exit(0);.
 13
Author: rchampourlier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-17 17:00:54

Twoja aplikacja zostanie powiadomiona o celowym zamknięciu przez użytkownika:

- (void)applicationWillResignActive:(UIApplication *)application {

Kiedy dostaję to powiadomienie, po prostu dzwonię

        exit(0);
Który wykonuje całą pracę. A najlepsze jest to, że użytkownicy chcą zrezygnować, dlatego nie powinno to być problemem, nazywając to tam.

W mojej aplikacji Audio trzeba było zamknąć aplikację po tym, jak ludzie synchronizowali swoje urządzenie podczas odtwarzania muzyki. Po zakończeniu synchronizacji otrzymuję powiadomienie. Ale zamknięcie aplikacji zaraz po tym wyglądałoby na awarię.

Zamiast tego ustawiłem flagę, aby naprawdę zamknąć aplikację przy następnej akcji. Co jest w porządku do odświeżenia aplikacji po synchronizacji.

 8
Author: L'g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-12 10:41:15

Moja aplikacja została odrzucona niedawno BC użyłem nieudokumentowanej metody. Dosłownie:

"niestety nie można go dodać do App Store, ponieważ używa prywatnego API. Korzystanie z niepublicznych interfejsów API, które jak opisano w Umowie Licencyjnej programu iPhone Developer Program, sekcja 3.3.1 jest zabronione: [1]}

"3.3.1 aplikacje mogą używać udokumentowanych interfejsów API wyłącznie w sposób określony przez Apple i nie mogą używać ani wywoływać żadnych prywatnych interfejsów API."

Niepubliczne API zawarte w Twoja aplikacja jest terminateWithSuccess "

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 17:44:36

Apple say:

" Ostrzeżenie: nie wywołaj funkcji exit. Aplikacje wywołujące exit będą wyświetlane użytkownikowi jako zawieszone, zamiast wykonywać pełne wdzięku zakończenie i animować z powrotem do ekranu głównego."

Myślę, że to złe założenie. Jeśli użytkownik dotknie przycisku Zakończ i pojawi się komunikat o treści: "aplikacja zakończy działanie.", nie wydaje się być rozbity. Apple powinno podać prawidłowy sposób zamknięcia aplikacji (nie exit (0)).

 6
Author: AGPX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 12:01:23

To ma dobrą odpowiedź, ale postanowiłem nieco rozszerzyć:

Nie możesz dostać swoją aplikację zaakceptowaną do AppStore bez czytania Apple iOS Human Interface Guidelines dobrze. (zachowują prawo do odrzucenia cię za robienie czegokolwiek przeciwko nim) sekcja" nie rezygnuj programowo" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html jest dokładną wskazówką w jaki sposób należy leczyć w ta sprawa.

Jeśli kiedykolwiek masz problem z platformą Apple, którego nie możesz łatwo znaleźć, skonsultuj się z HIG. Możliwe, że Apple po prostu nie chce, abyś to robił i zwykle (nie jestem Apple, więc nie mogę zagwarantować zawsze) mówią tak w swojej dokumentacji.

 4
Author: nanonyme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 15:23:48

Nie możemy zamknąć aplikacji używając exit(0), abort() Funkcje, ponieważ Apple zdecydowanie odradza korzystanie z tych funkcji. Możesz jednak użyć tych funkcji do celów rozwojowych lub testowych.

Jeśli podczas rozwoju lub testowania konieczne jest zakończenie zalecane jest stosowanie, funkcja abort lub assert makro

Aby uzyskać więcej informacji, znajdź ten wątek z pytaniami o Apple , aby uzyskać więcej informacji.

Ponieważ użycie tej funkcji powoduje wrażenie, że aplikacja jest upaść. Więc mam pewną sugestię, jak możemy wyświetlić Alert z Komunikatem o zakończeniu do świadomego użytkownika o zamknięciu aplikacji, z powodu niedostępności niektórych funkcji.

Ale wytyczne dla interfejsu użytkownika iOS dla uruchamiania i zatrzymywania aplikacji, sugerujące, że nigdy nie używaj przycisku Zamknij lub Zakończ do zakończenia aplikacji. Zamiast tego sugerują wyświetlanie odpowiedniego komunikatu w celu wyjaśnienia sytuacji.

Aplikacja na iOS nigdy nie wyświetla opcji Zamknij lub Zakończ. Ludzie przestają używać aplikacja po przełączeniu się na inną aplikację, wróć do ekranu głównego lub umieść ich urządzenia w trybie uśpienia.

Nigdy nie zamykaj aplikacji na iOS programowo. Ludzie mają tendencję do interpretowania tego jako wypadek. Jeśli coś uniemożliwia działanie aplikacji jako zamierzony, trzeba powiedzieć użytkownikom o sytuacji i wyjaśnić, co mogą to zrobić.
 3
Author: technerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 13:21:24

Oprócz powyższego, dobra, odpowiedź chciałem tylko dodać, pomyśleć o oczyszczeniu pamięci.

Po zakończeniu aplikacji, iPhone OS automatycznie wyczyści wszystko, co aplikacja pozostawiła, więc ręczne zwolnienie całej pamięci może po prostu zwiększyć czas potrzebny aplikacji do zakończenia.

 2
Author: Chris Jefferson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 14:04:15

Hm, być może "będziesz musiał" zamknąć aplikację, jeśli, powiedzmy, Twoja aplikacja wymaga połączenia z Internetem. Możesz wyświetlić alert, a następnie zrobić coś takiego:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
 2
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-11 01:55:15
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}
 2
Author: Prabhu Natarajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 09:11:01

Użyłem wspomnianego powyżej podejścia [[NSMutableArray new] addObject: nil], aby wymusić zamknięcie (awarię) aplikacji bez wywoływania funkcji exit(0).

Dlaczego? Ponieważ moja aplikacja używa przypinania certyfikatów do wszystkich wywołań sieciowych API, aby zapobiec atakom typu man-in-the-middle. Należą do nich inicjalizacja połączeń moja aplikacja finansowa sprawia, że na starcie.

Jeśli uwierzytelnianie certyfikatu nie powiedzie się, cała moja inicjalizacja wywoła błąd i pozostawia moją aplikację w stanie nieokreślonym. Letting the użytkownik idź do domu, a następnie z powrotem do aplikacji nie pomaga, ponieważ jeśli aplikacja nie została wyczyszczona przez system operacyjny, nadal jest niezaliczona i niegodna zaufania.

Tak więc, w tym jednym przypadku, uznaliśmy, że najlepiej wyświetlać alert informujący użytkownika, że aplikacja działa w niebezpiecznym środowisku, a następnie, gdy naciśnie "Zamknij", Wymuś zamknięcie aplikacji za pomocą wspomnianej metody.

 2
Author: Michael Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 23:44:08

Wyjście aplikacji w inny sposób niż przycisk home jest naprawdę nie-iOS-esque podejście.

Zrobiłem jednak tego pomocnika, który nie używa prywatnych rzeczy:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

Ale nadal nie przeznaczone do produkcji w moim przypadku. Służy do testowania raportów o awariach lub szybkiego restartu po zresetowaniu danych rdzenia. Po prostu sprawiło, że nie można go odrzucić, jeśli funkcja pozostała w kodzie produkcyjnym.

 1
Author: Geri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 14:57:13

Użytkownik powinien zdecydować, kiedy aplikacja zakończy działanie. Nie sądzę, że jest to dobra interakcja z użytkownikiem, gdy aplikacja się kończy. Dlatego nie ma dla niego ładnego API, tylko przycisk home ma taki.

Jeśli wystąpił błąd: zaimplementuj go lepiej lub Powiadom użytkownika. Jeśli trzeba ponownie uruchomić: wdrożyć go lepiej powiadomić użytkownika.

To brzmi głupio, ale to zła praktyka, aby wyjść z aplikacji, nie pozwalając użytkownikowi zdecydować i nie powiadamiając go. A ponieważ jest przycisk home dla użytkownika interakcja, Apple stwierdza, nie powinno być 2 rzeczy dla tej samej funkcji(wychodzenie z aplikacji).

 0
Author: Binarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 09:53:07

Wyjdź z aplikacji w inny sposób

Zrobiłem jednak tego pomocnika, który nie używa prywatnych rzeczy:

Exit (0);

 0
Author: iOS.j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 13:11:41

Może być właściwe zamknięcie aplikacji, jeśli jest to aplikacja długotrwała, która również wykonuje się w tle, na przykład w celu uzyskania aktualizacji lokalizacji (używając do tego celu funkcji tła location updates).

Na przykład, załóżmy, że użytkownik wyloguje się z aplikacji opartej na lokalizacji i wypycha aplikację do tła za pomocą przycisku home. W takim przypadku aplikacja może nadal działać, ale może mieć sens całkowite jej zamknięcie. Byłoby to dobre dla użytkownika (zwalnia pamięć i upewnij się, że aplikacja jest okresowo uruchamiana ponownie, gdy jest to możliwe, jest zabezpieczeniem przed wyciekami pamięci i innymi problemami z niską pamięcią).

To mogłoby (choć prawdopodobnie nie powinno, patrz poniżej :-) być osiągnięte z czymś takim:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

Ponieważ aplikacja zakończy się z tła nie będzie wyglądać źle dla użytkownika i nie będzie przypominać awarii, pod warunkiem, że interfejs użytkownika zostanie przywrócony następnego dnia czas uruchomić aplikację. Innymi słowy, dla użytkownika nie wyglądałoby to inaczej niż system zainicjował zakończenie aplikacji, gdy aplikacja jest w tle.

Mimo to, lepiej byłoby użyć bardziej standardowego podejścia, aby poinformować system, że aplikacja może zostać zakończona. Na przykład w tym przypadku, upewniając się, że GPS nie jest używany, zatrzymując żądanie aktualizacji lokalizacji, w tym wyłączając Pokaż bieżącą lokalizację w widoku mapy, jeśli jest obecna. W ten sposób system przyjmie dbałość o zakończenie aplikacji kilka minut (np. [[UIApplication sharedApplication] backgroundTimeRemaining]) po wejściu aplikacji w tło. Uzyskałoby to wszystkie te same korzyści bez konieczności używania kodu do zakończenia aplikacji.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

I oczywiście użycie exit(0) nigdy nie byłoby odpowiednie dla przeciętnej aplikacji produkcyjnej, która działa na pierwszym planie, jak na inne odpowiedzi, które odwołują się http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

 0
Author: frankodwyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-12 16:55:35
[[UIApplication sharedApplication] terminateWithSuccess];

To działało dobrze i automatycznie wywołuje

- (void)applicationWillTerminateUIApplication *)application delegate.

Aby usunąć ostrzeżenie o czasie kompilacji dodaj ten kod

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
 0
Author: shiva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 13:44:35