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ę?
22 answers
Próbowałeś exit(0)
?
Alternatywnie, [[NSThread mainThread] exit]
, chociaż nie próbowałem, że wydaje się bardziej odpowiednie rozwiązanie.
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ć.
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);
}
}
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];
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.
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ąceexit
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 metodyUIApplicationDelegate
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 makroassert
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
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:
- ręcznie wywołaj
- (void)applicationWillTerminate:(UIApplication *)application
na delegata. - Call
exit(0);
.
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.
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 "
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)).
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.
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.
Aby uzyskać więcej informacji, znajdź ten wątek z pytaniami o Apple , aby uzyskać więcej informacji.Jeśli podczas rozwoju lub testowania konieczne jest zakończenie zalecane jest stosowanie, funkcja abort lub assert makro
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ć.
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.
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);
}
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);
}
}
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.
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.
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).
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);
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
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
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