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

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

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

Кроме того, [[NSThread mainThread] exit] , хотя я не пробовал, что это похоже на более подходящее решение.

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

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

exit (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); } } 

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

 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]; 

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

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

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

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

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

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

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

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

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

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

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

Мой совет:

  1. Вручную вызовите приложение - (void)applicationWillTerminate:(UIApplication *)application .
  2. Вызов вызова exit(0); ,

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

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

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

  exit(0); 

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

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

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

Недавно было отклонено мое приложение. Bc Я использовал недокументированный метод. Буквально:

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

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

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

Apple говорит:

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

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

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

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

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

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

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

Пожалуйста, найдите эту тему Apple Q & A, чтобы получить дополнительную информацию.

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

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

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

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

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

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

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

 if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) { [[UIApplication sharedApplication] performSelector:@selector(terminate)]; } else { kill(getpid(), SIGINT); } 
 - (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); } } 

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

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

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

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

Выход из приложения другим способом, чем кнопка «домой», действительно не подходит для iOS-esque .

Тем не менее, я использовал этот помощник, который не использует никаких личных вещей:

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

Но все же не предназначен для производства в моем случае. Он предназначен для тестирования отчетов о сбоях или для быстрого перезапуска после сброса основных данных. Просто сделал его безопасным, чтобы его не отвергли, если функция оставлена ​​в производственном коде.

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

Если есть ошибка: выполните ее лучше или сообщите об этом пользователю. Если необходимо перезапустить: выполните его лучше, чтобы уведомить пользователя.

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

Выйти из приложения другим способом

Тем не менее, я использовал этот помощник, который не использует никаких личных вещей:

Выход (0);

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

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

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

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

 [[UIApplication sharedApplication] terminateWithSuccess]; 

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

 - (void)applicationWillTerminateUIApplication *)application delegate. 

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

 @interface UIApplication(MyExtras) - (void)terminateWithSuccess; @end 
  • Как запустить UITableView на последней ячейке?
  • Есть ли документальный способ настройки ориентации iPhone?
  • Какова стоимость использования автореферата в cocoa?
  • Как преобразовать значения NSString в шестнадцатеричные значения
  • NSDateFormatter dateFromString возвращает nil
  • как сделать программный снимок экрана для iPhone?
  • Как реализовать представление аккордеона для iPhone SDK-приложения?
  • Как анализировать длительность ISO-8601 в Objective C?
  • Использование iPhone - dequeueReusableCellWithIdentifier
  • как отобразить тестовый баннер IAd в симуляторе
  • Круговые контрольные бары в IOS
  • Давайте будем гением компьютера.