Правильный способ выхода из приложения iPhone?

голоса
253

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

Задан 10/12/2008 в 06:42
источник пользователем
На других языках...                            


24 ответов

голоса
261

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

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

Ответил 10/12/2008 в 15:54
источник пользователем

голоса
206

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

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

Ответил 10/12/2008 в 06:49
источник пользователем

голоса
45

выход (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);
    }
}
Ответил 23/07/2013 в 06:54
источник пользователем

голоса
38

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

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];
Ответил 04/08/2009 в 01:59
источник пользователем

голоса
37

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

Ответил 01/06/2011 в 05:47
источник пользователем

голоса
36

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

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

Там нет API предусмотрено грациозно завершение приложения IOS.

В прошивке, пользователь нажимает кнопку Home, чтобы закрыть приложения. Если ваше приложение имеет условия, в которых он не может предоставить свои функции, рекомендуемый подход, чтобы отобразить предупреждение для пользователя, который указывает на характер проблемы и возможных действий, которые пользователь может принять - включение Wi-Fi, что позволяет Location Services и т.д. Разрешить пользователю завершить приложение по своему усмотрению.

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

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

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

Ответил 05/06/2010 в 15:31
источник пользователем

голоса
15

добавить UIApplicationExitsOnSuspend свойства на прикладном info.plist к истине

Ответил 07/07/2011 в 09:14
источник пользователем

голоса
13

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

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

Мой совет:

  1. Вручную вызвать - (void)applicationWillTerminate:(UIApplication *)applicationна делегата.
  2. Вызов exit(0);.
Ответил 17/05/2009 в 18:00
источник пользователем

голоса
7

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

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

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

        exit(0);

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

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

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

Ответил 12/08/2010 в 11:41
источник пользователем

голоса
6

Apple, говорят:

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

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

Ответил 23/05/2013 в 13:01
источник пользователем

голоса
6

Мой App был отвергнут в последнее время до н.э. я использовал нелегальный метод. Буквально:

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

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

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

Ответил 02/12/2009 в 18:44
источник пользователем

голоса
4

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

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

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

Ответил 03/02/2011 в 16:23
источник пользователем

голоса
3

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

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

Вы можете найти это Apple , Q & нить , чтобы получить больше информации.

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

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

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

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

Ответил 28/04/2016 в 13:21
источник пользователем

голоса
2

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

Зачем? Потому что мое приложение использует сертификат пиннинга на всех сетевых API требует, чтобы предотвратить человек-в-середине атаки. Они включают в себя инициализацию называет мое финансовое приложение делает при запуске.

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

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

Ответил 24/11/2015 в 23:44
источник пользователем

голоса
2
- (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);
  }
}
Ответил 17/09/2013 в 12:56
источник пользователем

голоса
2

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

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
Ответил 11/12/2008 в 02:55
источник пользователем

голоса
2

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

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

Ответил 10/12/2008 в 15:04
источник пользователем

голоса
1

Закройте приложение , другой путь , чем домашняя кнопка является действительно не-IOS-эск подход.

Я сделал этот помощник, однако, что использование не личных вещей:

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

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

Ответил 27/01/2014 в 15:57
источник пользователем

голоса
0

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

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Использование:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
Ответил 18/06/2019 в 13:07
источник пользователем

голоса
0

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

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

import Darwin

exit(0) // Here you go

NB: Это не в приложениях Рекомендуемые нами IOS.

Делать это поможет вам краш журнал.

Ответил 28/02/2019 в 09:51
источник пользователем

голоса
0

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

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

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

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

Ответил 12/10/2015 в 16:55
источник пользователем

голоса
0

Закройте приложение другой путь

Я сделал этот помощник, однако, что использование не личных вещей:

Выход (0);

Ответил 07/02/2014 в 14:11
источник пользователем

голоса
0

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

Если есть ошибка: Реализовать это лучше или Уведомлять пользователя. Если должны быть рестарта: Реализовать лучше из Уведомлять пользователя.

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

Ответил 30/09/2013 в 10:53
источник пользователем

голоса
-1
[[UIApplication sharedApplication] terminateWithSuccess];

Он работал хорошо, и автоматически вызывает

- (void)applicationWillTerminateUIApplication *)application delegate.

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

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
Ответил 05/11/2009 в 16:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more