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

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

Ответы [ 23 ]

6 голосов
/ 23 мая 2013

Apple, скажите:

"Предупреждение. Не вызывайте функцию выхода. Приложения, вызывающие выход, будут казаться пользователю потерпевшим крах, а не выполнять постепенное завершение и анимацию обратно на главный экран."

Я думаю, что это плохое предположение. Если пользователь нажимает кнопку «Выход» и появляется сообщение, в котором говорится что-то вроде: «Теперь приложение будет закрыто», оно не будет аварийно завершено. Apple должна предоставить правильный способ выхода из приложения (не выход (0)).

4 голосов
/ 03 февраля 2011

Получил хороший ответ, но решил немного расширить:

Вы не можете принять ваше приложение в AppStore, если не будете внимательно читать Руководство по интерфейсу пользователя iOS для Apple. (они сохраняют за собой право отклонить вас за то, что вы сделали что-либо против них) Раздел "Не выходите программно" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html это точное руководство, как вы должны относиться в этом случае.

Если у вас возникли проблемы с платформой Apple, для которой вы не можете легко найти решение, обратитесь в HIG. Возможно, Apple просто не хочет, чтобы вы это делали, и они обычно (я не Apple, поэтому я не могу гарантировать всегда), говорят об этом в своей документации.

3 голосов
/ 28 апреля 2016

Мы не можем выйти из приложения, используя функции exit(0), abort(), так как Apple настоятельно не рекомендует использовать эти функции. Хотя вы можете использовать эти функции для разработки или тестирования.

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

Найдите эту ветку Apple Q & A , чтобы получить больше информации.

Поскольку использование этой функции создает впечатление сбоя приложения. Поэтому у меня появилось предположение, что мы можем отобразить Alert с сообщением о завершении для осведомленного пользователя о закрытии приложения из-за недоступности определенных функций.

Но iOS Руководство по интерфейсу пользователя для Запуск и остановка приложения , предлагая Никогда не использовать кнопку «Выход» или «Закрыть» для завершения работы приложения. Вместо этого они предлагают показать правильное сообщение, чтобы объяснить ситуацию.

Приложение iOS никогда не отображает опцию Закрыть или Выйти. Люди перестают использовать приложение, когда они переключаются на другое приложение, возвращаются на главный экран или помещают их устройства в спящем режиме.

Никогда не выходите из приложения iOS программным способом. Люди склонны интерпретировать это как авария. Если что-то мешает вашему приложению работать как Предполагается, что вы должны рассказать пользователям о ситуации и объяснить, что они могут с этим поделать.

2 голосов
/ 17 сентября 2013
- (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 голосов
/ 11 декабря 2008

Хм, вам может потребоваться выйти из приложения, если, скажем, ваше приложение требует подключения к Интернету. Вы можете отобразить предупреждение, а затем сделать что-то вроде этого:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
2 голосов
/ 10 декабря 2008

В дополнение к вышесказанному, хорошо, ответ, который я просто хотел добавить, подумайте о том, как почистить память.

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

1 голос
/ 25 ноября 2015

Я использовал упомянутый выше подход [[NSMutableArray new] addObject: nil], чтобы принудительно завершить (аварийно завершить работу) приложение без вызова контрольного выхода (0).

Почему? Потому что мое приложение использует закрепление сертификатов во всех вызовах сетевого API для предотвращения атак «человек посередине». К ним относятся вызовы инициализации, которые мое финансовое приложение делает при запуске.

Если проверка подлинности сертификата завершается неудачно, все мои инициализационные вызовы вызывают ошибку и оставляют мое приложение в неопределенном состоянии. Позволить пользователю вернуться домой и вернуться обратно в приложение не поможет, поскольку, если приложение не было очищено ОС, оно все еще не инициализировано и ненадежно.

Итак, в этом одном случае мы посчитали целесообразным выдать предупреждение, информирующее пользователя о том, что приложение работает в небезопасной среде, а затем, когда он нажал «Закрыть», принудительно закрыть приложение, используя вышеупомянутый метод. 1007 *

1 голос
/ 05 ноября 2009
[[UIApplication sharedApplication] terminateWithSuccess];

Работает нормально и автоматически звонит

- (void)applicationWillTerminateUIApplication *)application delegate.

для удаления предупреждения о времени компиляции добавьте этот код

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
0 голосов
/ 28 февраля 2019

Swift 4.2 (или старше)

Может использоваться библиотека с именем Darvin.

import Darwin

exit(0) // Here you go

Примечание: это не рекомендуется в приложениях iOS.

В результате вы получите журнал сбоев.

0 голосов
/ 12 октября 2015

Может быть целесообразно выйти из приложения, если это долгоживущее приложение, которое также выполняется в фоновом режиме, например, для получения обновлений местоположения (для этого используется возможность обновления местоположения фона).

Например, предположим, что пользователь выходит из приложения, основанного на местоположении, и перемещает приложение в фоновый режим с помощью кнопки «Домой». В этом случае ваше приложение может продолжать работать, но может иметь смысл полностью выйти из него. Это было бы хорошо для пользователя (освобождает память и другие ресурсы, которые не нужно использовать), и хорошо для стабильности приложения (т. Е. Обеспечение периодического перезапуска приложения, когда это возможно, является защитной сетью от утечек памяти и других недостатков памяти вопросы).

Это может (хотя, вероятно, не следует, см. Ниже :-) быть достигнуто с чем-то вроде:

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

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

Тем не менее, было бы предпочтительнее использовать более стандартный подход, чтобы система знала, что приложение может быть остановлено. Например, в этом случае, убедившись, что GPS не используется, прекратив запрашивать обновления местоположения, включая отключение показа текущего местоположения на виде карты, если таковой имеется. Таким образом, система позаботится о прекращении работы приложения через несколько минут (т. Е. [[UIApplication sharedApplication] backgroundTimeRemaining]) после того, как приложение войдет в фоновый режим. Это дало бы все те же преимущества без использования кода для завершения работы приложения.

- (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.
    }
}

И, конечно же, использование exit(0) никогда не будет подходящим для среднего производственного приложения, которое работает на переднем плане, согласно другим ответам, которые ссылаются на http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

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