Правильный способ выхода из приложения iPhone? - PullRequest
264 голосов
/ 10 декабря 2008

Я программирую приложение для iPhone, и мне нужно заставить его выйти из-за определенных действий пользователя. После очистки памяти, выделенной приложению, какой метод вызывать для завершения приложения?

Ответы [ 23 ]

270 голосов
/ 10 декабря 2008

На iPhone нет концепции выхода из приложения. Единственное действие, которое должно привести к закрытию приложения, - это нажать кнопку «Домой» на телефоне, и разработчики не имеют доступа к нему.

Согласно Apple, ваше приложение не должно завершаться само по себе. Поскольку пользователь не нажимал кнопку «Домой», при любом возврате на главный экран у пользователя создается впечатление, что ваше приложение не работает. Это запутанное, нестандартное поведение, и его следует избегать.

212 голосов
/ 10 декабря 2008

Вы пробовали exit(0)?

В качестве альтернативы [[NSThread mainThread] exit], хотя я не пробовал, что кажется более подходящим решением.

47 голосов
/ 23 июля 2013

выход (0) отображается для пользователя как сбой, поэтому покажите пользователю подтверждающее сообщение. После подтверждения приостановите (нажмите кнопку «Домой» программно) и подождите 2 секунды, пока приложение движется в фоновом режиме с анимацией, затем выйдите из поля зрения пользователя

-(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);
    }
}
38 голосов
/ 01 июня 2011

Зайдите в ваш info.plist и проверьте ключ «Приложение не работает в фоновом режиме». На этот раз, когда пользователь нажимает кнопку «Домой», приложение полностью закрывается.

38 голосов
/ 05 июня 2010

Проверьте Q & A здесь: https://developer.apple.com/library/content/qa/qa1561/_index.html

В: Как программно выйти из приложения iOS?

Не предусмотрено API для изящного завершения приложения iOS.

В iOS пользователь нажимает кнопку «Домой», чтобы закрыть приложения. Если в вашем приложении есть условия, при которых оно не может обеспечить выполнение своей целевой функции, рекомендуемый подход заключается в отображении предупреждения для пользователя, в котором указывается характер проблемы и возможные действия, которые может предпринять пользователь - включение WiFi, включение служб определения местоположения и т. Д. Разрешить пользователю завершать работу приложения по своему усмотрению.

ПРЕДУПРЕЖДЕНИЕ: Не вызывайте функцию exit. Приложения, вызывающие exit, будут казаться пользователю потерпевшими крах, вместо того, чтобы выполнять постепенное завершение и анимацию обратно на главный экран.

Кроме того, данные не могут быть сохранены, потому что -applicationWillTerminate: и аналогичные UIApplicationDelegate методы не будут вызываться, если вы вызываете exit.

Если при разработке или тестировании необходимо завершить работу приложения, рекомендуется использовать функцию abort или макрос assert

38 голосов
/ 04 августа 2009

На самом деле это не способ выйти из программы, а способ заставить людей выйти.

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];
17 голосов
/ 07 июля 2011

добавить свойство UIApplicationExitsOnSuspend в application-info.plist в true

13 голосов
/ 17 мая 2009

После некоторых тестов могу сказать следующее:

  • с использованием частного интерфейса: [UIApplication sharedApplication] приведет к тому, что приложение будет выглядеть так, как будто оно зависло, НО оно будет вызывать - (void)applicationWillTerminate:(UIApplication *)application перед этим;
  • использование exit(0); также приведет к завершению работы приложения, но оно будет выглядеть «нормально» (значки трамплина выглядят так, как ожидалось, с эффектом уменьшения), НО не вызовет метод делегата - (void)applicationWillTerminate:(UIApplication *)application. *

Мой совет:

  1. Вручную позвоните - (void)applicationWillTerminate:(UIApplication *)application делегату.
  2. Звоните exit(0);.
8 голосов
/ 12 августа 2010

Ваш ApplicationDelegate получает уведомление о намеренном выходе пользователя:

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

Когда я получаю это уведомление, я просто звоню

        exit(0);

Который делает всю работу. И самое главное, это намерение пользователей выйти, поэтому это не должно быть проблемой, вызывая его там.

В моем Audio-App было необходимо выйти из приложения после того, как люди синхронизировали свое устройство, пока музыка еще играла. Как только синхронизация завершена, я получаю уведомление. Но выход из приложения сразу после этого на самом деле будет выглядеть как сбой.

Поэтому вместо этого я установил флаг, чтобы ДЕЙСТВИТЕЛЬНО выйти из приложения при следующем фоновом действии. Это нормально для обновления приложения после синхронизации.

6 голосов
/ 02 декабря 2009

Мое приложение было отклонено недавно, т.к. я использовал недокументированный метод. Дословно:

"К сожалению, его нельзя добавить в App Store, так как он использует закрытый API. Использование закрытых API, как указано в разделе 3.3.1 Лицензионного соглашения программы для разработчиков iPhone, запрещено:

"3.3.1 Приложения могут использовать документированные API только в порядке, установленном Apple, и не должны использовать или вызывать какие-либо частные API."

Непубличный API, включенный в ваше приложение, является terminateWithSuccess "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...