Я программирую приложение для iPhone, и мне нужно заставить его выйти из-за определенных действий пользователя. После очистки памяти, выделенной приложению, какой метод следует вызвать для завершения приложения?
ios
objective-c
iphone
cocoa-touch
ipad
user21293
источник
источник
Ответы:
Ты пробовал
exit(0)
?В качестве альтернативы,
[[NSThread mainThread] exit]
хотя я не пробовал, это кажется более подходящим решением.источник
На iPhone нет концепции выхода из приложения. Единственное действие, которое должно привести к закрытию приложения, - это нажать кнопку «Домой» на телефоне, и разработчики не имеют к этому доступа.
Согласно Apple, ваше приложение не должно завершаться само по себе. Поскольку пользователь не нажимал кнопку «Домой», любой возврат к главному экрану создает у пользователя впечатление, что ваше приложение не работает. Это запутанное, нестандартное поведение, и его следует избегать.
источник
exit (0) отображается для пользователя как сбой, поэтому покажите пользователю подтверждающее сообщение. После подтверждения приостановите (нажмите кнопку «Домой» программно) и подождите 2 секунды, пока приложение движется в фоновом режиме с анимацией, затем выйдите из поля зрения пользователя.
источник
exit(0)
не имеет значения. Дело в том, что у вашего приложения "поведение при выходе". Сам по себе выход из поведения запрещен в AppStore, за исключением нескольких приложений, созданных очень важными сторонними разработчиками. Кроме того, имитация поведения кнопки «Домой» также может быть отклонена.Проверьте вопросы и ответы здесь: https://developer.apple.com/library/content/qa/qa1561/_index.html
источник
Это не способ выйти из программы, а способ заставить людей выйти из программы.
источник
Зайдите в ваш info.plist и проверьте ключ «Приложение не запускается в фоновом режиме». На этот раз, когда пользователь нажимает кнопку «Домой», приложение полностью закрывается.
источник
Добавить
UIApplicationExitsOnSuspend
недвижимость наapplication-info.plist
вtrue
.источник
После некоторых тестов могу сказать следующее:
[UIApplication sharedApplication]
приложение будет выглядеть так, как будто оно зависло, НО оно будет вызывать- (void)applicationWillTerminate:(UIApplication *)application
перед этим;exit(0);
также завершит работу приложения, но оно будет выглядеть «нормально» (значки трамплина выглядят так, как ожидалось, с эффектом уменьшения), НО это не вызовет- (void)applicationWillTerminate:(UIApplication *)application
метод делегата.Мой совет:
- (void)applicationWillTerminate:(UIApplication *)application
делегату.exit(0);
.источник
Ваш ApplicationDelegate получает уведомление о намеренном выходе пользователя:
Когда я получаю это уведомление, я просто звоню
Который делает всю работу. И самое главное, это намерение пользователей выйти, поэтому это не должно быть проблемой, вызывая его там.
В моем Audio-App было необходимо выйти из приложения после того, как люди синхронизировали свое устройство, пока музыка еще играла. Как только синхронизация завершена, я получаю уведомление. Но выход из приложения сразу после этого будет выглядеть как сбой.
Поэтому вместо этого я установил флаг, чтобы ДЕЙСТВИТЕЛЬНО выйти из приложения при следующем фоновом действии. Что нормально для обновления приложения после синхронизации.
источник
Мое приложение было отклонено недавно, потому что я использовал недокументированный метод. Буквально:
«К сожалению, его нельзя добавить в App Store, поскольку он использует частный API. Использование непубличных API, как описано в разделе 3.3.1 Лицензионного соглашения программы для разработчиков iPhone, запрещено:
«3.3.1 Приложения могут использовать документированные API только в порядке, установленном Apple, и не должны использовать или вызывать какие-либо частные API».
Непубличный API, включенный в ваше приложение, является terminateWithSuccess "
источник
Apple говорит:
«Предупреждение: не вызывайте функцию выхода. Приложения, вызывающие выход, будут казаться пользователю потерпевшим крах, а не выполнять постепенное завершение и анимацию обратно на главный экран».
Я думаю, что это плохое предположение. Если пользователь нажимает кнопку «Выход» и появляется сообщение, в котором говорится что-то вроде: «Теперь приложение будет закрыто», значит, оно не будет аварийно завершено. Apple должна предоставить правильный способ выхода из приложения (не выход (0)).
источник
Это получил хороший ответ, но решил немного расширить:
Вы не можете принять ваше приложение в AppStore, если не будете внимательно читать Руководство по интерфейсу iOS для Apple. (они сохраняют за собой право отклонить вас делать что - либо против них) Раздел «Не Quit» Программная http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. HTML это точное руководство, как вы должны относиться в этом случае.
Если у вас возникли проблемы с платформой Apple, для которой вы не можете легко найти решение, обратитесь в HIG. Возможно, Apple просто не хочет, чтобы вы это делали, и они обычно (я не Apple, поэтому я не могу гарантировать всегда), говорят об этом в своей документации.
источник
Хм, вам может потребоваться выйти из приложения, если, скажем, ваше приложение требует подключения к Интернету. Вы можете отобразить предупреждение, а затем сделать что-то вроде этого:
источник
Мы не можем выйти из приложения , используя
exit(0)
,abort()
функцию, так как Apple , сильно препятствовать использованию этих функций. Хотя вы можете использовать эти функции для разработки или тестирования.Пожалуйста, найдите эту ветку вопросов и ответов Apple, чтобы получить больше информации.
Как использование этой функции создает впечатление, что приложение падает. Поэтому у меня появилось предположение, что мы можем отобразить Alert с сообщением о завершении для осведомленного пользователя о закрытии приложения из-за недоступности определенных функций.
Но iOS Руководство по интерфейсу пользователя для запуска и остановки приложения , предлагая никогда не использовать кнопку Выйти или Закрыть для завершения приложения. Скорее, они предлагают отобразить правильное сообщение, чтобы объяснить ситуацию.
источник
В дополнение к вышесказанному, хорошо, ответ, который я просто хотел добавить, подумайте о том, чтобы очистить вашу память.
После выхода из приложения iPhone OS автоматически очистит все, что осталось от вашего приложения, поэтому освобождение всей памяти вручную может просто увеличить время, необходимое для выхода из приложения.
источник
источник
Я использовал упомянутый выше подход [[NSMutableArray new] addObject: nil], чтобы принудительно завершить (аварийно завершить работу) приложение без вызова контрольной функции выхода (0).
Зачем? Потому что мое приложение использует закрепление сертификатов во всех вызовах сетевого API для предотвращения атак «человек посередине». К ним относятся вызовы инициализации, которые мое финансовое приложение делает при запуске.
Если проверка подлинности сертификата не удалась, все мои инициализации вызывают ошибку и оставляют мое приложение в неопределенном состоянии. Позволить пользователю вернуться домой и вернуться обратно в приложение не поможет, поскольку, если приложение не было очищено ОС, оно все еще не инициализировано и ненадежно.
Итак, в этом одном случае мы посчитали целесообразным выдать предупреждение, информирующее пользователя о том, что приложение работает в небезопасной среде, а затем, когда они нажали «Закрыть», принудительно завершить работу приложения, используя вышеупомянутый метод.
источник
Работало нормально и автоматически звонит
чтобы убрать предупреждение о времени компиляции добавьте этот код
источник
Вы не должны напрямую вызывать функцию, так
exit(0)
как она немедленно выйдет из приложения и будет выглядеть так, как будто ваше приложение не работает. Поэтому лучше показывать пользователям оповещения о подтверждении и позволять им делать это самостоятельно.Swift 4.2
Использование:
источник
Пользователь должен решить, когда приложение выйдет. Я не думаю, что это хорошее взаимодействие с пользователем, когда приложение закрывается. Поэтому для него нет приятного API, он есть только у кнопки home.
Если есть ошибка: лучше ее внедрите или оповестите пользователя. Если должен быть перезапуск: Внедрите его лучше. Сообщите пользователю.
Звучит глупо, но это плохая практика - выходить из приложения, не позволяя пользователю решать и не уведомляя его. И, как утверждает Apple, поскольку есть кнопка «Домой» для взаимодействия с пользователем, не должно быть двух вещей для одной и той же функции (выход из приложения).
источник
Выход из приложения другим способом, кроме кнопки «Домой», на самом деле не в стиле iOS .
Я сделал этого помощника, который не использует ничего личного:
Но все равно не предназначен для производства в моем случае. Он предназначен для тестирования отчетов о сбоях или для быстрого перезапуска после сброса основных данных. Просто сделал безопасным, чтобы не быть отклоненным, если функция оставлена в рабочем коде.
источник
Swift 4.2 (или старше)
Библиотека называется
Darvin
может быть использована.Примечание: это не рекомендуется в приложениях iOS.
Делая это, вы получите журнал аварий.
источник
В iPadOS 13 теперь вы можете закрыть все сеансы сцены следующим образом:
Это вызовет
applicationWillTerminate(_ application: UIApplication)
делегата вашего приложения и в конце концов завершит работу приложения.Но остерегайтесь двух вещей:
Это, конечно, не предназначено для закрытия всех сцен. (см. https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/multiple-windows/ )
Он компилируется и прекрасно работает на iOS 13 на iPhone, но, похоже, ничего не делает.
Дополнительная информация о сценах в iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes
источник
Выход из приложения другим способом
Я сделал этого помощника, который не использует ничего личного:
Выход (0);
источник
Может быть целесообразно выйти из приложения, если это долгоживущее приложение, которое также выполняется в фоновом режиме, например, для получения обновлений местоположения (с использованием обновлений местоположения фоновая возможность ).
Например, предположим, что пользователь выходит из приложения, основанного на местоположении, и переводит приложение в фоновый режим с помощью кнопки «Домой». В этом случае ваше приложение может продолжать работать, но может иметь смысл полностью выйти из него. Это было бы хорошо для пользователя (освобождает память и другие ресурсы, которые не нужно использовать), и хорошо для стабильности приложения (т. Е. Обеспечение возможности периодического перезапуска приложения, когда это возможно, является защитной сетью от утечек памяти и других недостатков памяти). вопросы).
Это может (хотя, вероятно, не следует, см. Ниже :-) быть достигнуто с помощью чего-то вроде:
Поскольку приложение будет выходить из фона оно не будет выглядеть неправильно для пользователя и не будет напоминать сбой, если пользовательский интерфейс будет восстановлен при следующем запуске приложения. Другими словами, для пользователя это не будет отличаться от инициированного системой завершения приложения, когда приложение находится в фоновом режиме.
Тем не менее, было бы предпочтительнее использовать более стандартный подход, чтобы система знала, что приложение может быть остановлено. Например, в этом случае, убедившись, что GPS не используется, прекратив запрашивать обновления местоположения, включая отключение показа текущего местоположения на виде карты, если он есть. Таким образом, система позаботится о прекращении работы приложения через несколько минут (то есть
[[UIApplication sharedApplication] backgroundTimeRemaining]
) после того, как приложение войдет в фоновый режим. Это позволило бы получить все те же преимущества без использования кода для завершения работы приложения.И, конечно, использование
exit(0)
никогда не будет подходящим для обычного производственного приложения, которое работает на переднем плане, согласно другим ответам, которые ссылаются на http://developer.apple.com/iphone/library/qa/qa2008/qa1561.htmlисточник