Правильний спосіб виходу з програми iPhone?


277

Я програмую додаток для iPhone, і мені потрібно змусити його вийти через певні дії користувача. Після очищення пам’яті виділений додаток, який підходящий спосіб викликати, щоб закрити програму?


34
Є лише один правильний спосіб - кнопка «Додому»
берилій

5
Єдиною ситуацією, яку я можу собі уявити, хто планує вийти з програми, - це такий сценарій: додаток запускається, відображає умови використання, відмовляється приймати, а потім виходить із програми. Це те, що бренди іноді тиснуть на розробника. Але це неправильно.
Даніель

6
@Daniel Зазвичай ви ставите свої відмови / умови використання (EULA) на itunes підключення під час завантаження програми. Якщо користувач завантажує ваше додаток, це означає, що він прийняв ваш EULA
Пол де Ланге

8
Існують цілком поважні причини, що потрібно змусити вийти з програми ios. Моя справа полягає в тому, що я поширюю бета-версії свого додатка перед запуском. Бета-версії відкривають усі IAP безкоштовно. Вони мають обмеження часу і термін дії повинен закінчитися через кілька тижнів. Тому я використовую відповідь нижче, щоб знищити додаток після закінчення бета-періоду. Я видалю це у LIVE-версії. Але все ж відповідь мені допомогла і є правильною!
badweasel

5
Однією з дійсних причин виходу з програми є те, що це програма, яка довго працює, і програма переходить у стан, коли її більше не потрібно запускати у фоновому режимі. Наприклад, користувач виходить із системи. У цьому випадку було б доцільно вийти, щоб при наступному запуску програми воно починало чистити. Це може діяти як захисна мережа проти витоків пам'яті, серед інших причин. Зверніть увагу, що в цьому випадку додаток буде виходити з фону , тому користувач не помітить нічого поганого.
frankodwyer

Відповіді:


217

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

Як варіант, [[NSThread mainThread] exit]хоча я ще не намагався, як здається, більш прийнятного рішення.


85
Оскільки це Apple - ні-ні (може спричинити відмову вашої програми в магазині додатків за нестандартний інтерфейс), вважайте відповідь Августа "правильною". FYI, ця відповідь (Бретта) правильна для ВСІХ програм C, а NSThread - для всіх програм какао.
Олі

21
Що стосується Tech Q&A QA1561, Apple сильно не відмовляється від використання виходу, тому що, здається, додаток вийшов з ладу. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr

8
[[NSThread mainThread] exit] призводить до збоїв у вашій програмі, оскільки вихід не є методом екземпляра. exit (0) відправить додаток на задній план в iOS 4. Виклик виходу (0) знову призведе до збою. Принаймні в тренажері.
користувач123444555621

10
Я розумію, чому так багато людей радять проти цього, але як щодо того, щоб дати нам розробникам деяку кредит? Всі ми тут дорослі, і ми хочемо дізнатися про цю особливість. Я вважаю це дуже корисним для внутрішніх збірок якості, і, коли я вперше шукав його, був радий бачити цю "неправильну" відповідь.
evanflash

7
@Kevin "Не роби цього" ніколи не є правильною відповіддю. Надайте застереження та відмови від відповідальності, якщо вам подобається, але єдина правильна відповідь на питання "як це зробити" - це "ось як це зробити". Якщо я шукаю, як щось зробити (можливо, я хочу змусити його вийти під час налагодження), люди справедливо заявляють "ти цього не робиш!" і намагатися поховати відповідь, яка мені потрібна, - це марний час. Однак у багатьох людей можуть бути погані причини зробити щось, правильна відповідь StackOverflow - це та, яка відповідає на питання, тому що люди з поважними причинами також шукатимуть свій шлях до цього.
Гленн Мейнард

274

На iPhone немає концепції виходу з програми. Єдина дія, через яку програма повинна вийти, - це торкнутись кнопки «Головна» на телефоні, і розробники не мають доступу до цього.

На думку Apple, ваш додаток не має припинятися самостійно. Оскільки користувач не натиснув кнопку "Головна", будь-яке повернення на головний екран створює у користувача враження, що ваш додаток вийшов з ладу. Це заплутане, нестандартне поведінку і цього слід уникати.


13
Як я вже говорив, це нестандартна поведінка і цього слід уникати. Додатки для iPhone - це не настільні програми. Не ставтесь до них як до таких.
серпня

8
Я можу зрозуміти думку Apple, але у мене схожа ситуація, моя програма вимагає доступу до Інтернету, якщо він недоступний, вони повинні мати можливість залишити додаток, а не просто повідомлення про помилку
Anthony Main

22
У нас є програми, які допомагають людям спати. Вони хочуть, щоб програма закінчилася після встановленого періоду, щоб зменшити розряд акумулятора. Я думаю, що цей випадок є прийнятним, оскільки користувач сподівається спати і не може вийти з програми вручну.
JamesSugrue

36
Я все одно не погоджуюся. Коли вони прокидаються, додаток "пішло", залишаючи користувача дивуватися, що сталося. Замість цього встановіть у своєму додатку таймер, тоді, коли час закінчиться, не працюйте з додатком - жодної активності. Додаток, який не робить нічого, не розрядить акумулятор. Springboard - це також додаток - він не вимикається лише для економії енергії. Натомість він просто чекає введення користувачем.
серпня

8
Це насправді не відповідає на питання. Це на 100% точно, але я думаю, що в ідеалі це був би коментар або до питання ОП, або до прийнятої відповіді.
Бен Зотто

49

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

1
Чи схвалить яблуко цей "вихід (0)"? Оскільки деякі люди кажуть, що Apple відхилить ваш додаток, коли ви використовуєте вихід 0.
Gajendra K Chauhan,

2
@GajendraKChauhan exit(0)не має значення. Справа в тому, що ваш додаток "припиняє поведінку". Вихід із поведінки сам по собі заборонено в AppStore, за винятком кількох додатків, які створюються дуже важливими сторонніми сторонами. Також імітація поведінки кнопки будинку також може бути відхилена.
Eonil

41

Ознайомтесь із запитаннями тут: https://developer.apple.com/library/content/qa/qa1561/_index.html

Питання: Як я можу програматично закрити свою програму iOS?

Для граціозного завершення програми iOS не передбачено API.

В iOS користувач натискає кнопку «Головна», щоб закрити програми. Якщо у вашій програмі є умови, в яких вона не може забезпечити передбачувану функцію, рекомендований підхід полягає у відображенні попередження для користувача, яке вказує на характер проблеми та можливі дії, які може вжити користувач - включення WiFi, включення служб локації тощо. Дозволити користувачеві скасувати додаток на власний розсуд.

ПОПЕРЕДЖЕННЯ: Не викликайте exitфункції. exitКористувачі, які дзвонять програмам, здадуться збоєм, замість того, щоб виконати витончене припинення та анімацію назад на головний екран.

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

Якщо під час розробки або тестування необхідно припинити роботу програми, рекомендується abortфункція або assertмакрос


2
Просто додали AlertView без кнопок, щоб виконати це. Легко.
Schultz9999

Чудова відповідь, щойно працював з виходом (0) і не знав, що він належить до приватного api
Alex Cio

39

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

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

2
Принаймні, на тренажері, якщо ви це зробите, сповіщення все ще буде, коли користувач повторно відкриє додаток. Таким чином, пропоную дати їм хоча б одну кнопку.
cheshirekow

Скористайтеся відповіддю Каляна, щоб програма закривалась, коли натискали кнопку додому.
Тимур Кучкаров

Проблема з цим полягає в тому, що він фактично не виходить з програми, тому все, що розробник може захотіти досягти виходу (викидання недійсного / старого інтерфейсу, очищення констант тощо), не буде виконано, якщо користувач не проведе програму зачинено.
Ben Leggiero

Це не вбиває додаток.
Дастін

38

Перейдіть до свого інформаційного списку та перевірте клавішу "Програма не працює у фоновому режимі". Цього разу, коли користувач натискає кнопку будинку, додаток повністю закривається.


1
Але фоновий процес також може бути звільнений.
Gajendra K Chauhan

17

Додати UIApplicationExitsOnSuspendвласність application-info.plistу true.


Чи можна змінити цей параметр під час виконання? Я маю на увазі, що я хочу жити у фоновому режимі, за винятком випадків, коли моє додаток ВИБІРЬ вийти з наступного призупинення - в цей час я хочу ввести UIApplicationExitsOnSuspend. Чи можливо це?
Motti Shneor

13

Після деяких тестів можу сказати наступне:

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

Моя порада:

  1. Вручну зателефонуйте - (void)applicationWillTerminate:(UIApplication *)applicationделегату.
  2. Дзвінок exit(0);.

Apple заявляє, що не використовувати вихід через "Програми, що викликають вихід, видаються користувачеві збоєм, а не виконують витончене припинення та анімацію назад на головний екран" developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD

8

Ваш ApplicationDelegate отримує повідомлення про навмисну ​​відмову від користувача:

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

Коли я отримую це повідомлення, я просто дзвоню

        exit(0);

Яка вся робота. І найкраще, це те, що використання має намір кинути, тому це не повинно бути проблемою його виклику там.

У моєму аудіо-додатку потрібно було вийти з програми після того, як люди синхронізували свій пристрій, поки музика ще грала. Як тільки синхронізація завершена, я отримую сповіщення. Але вихід із програми відразу після цього насправді буде схожий на збій.

Тому замість цього я встановив прапор, ЩО ЗАСТОСУВАТИ закрити програму на наступну дію фонового зображення. Що добре для оновлення програми після синхронізації.


1
Це не гарне рішення, оскільки програма відмовиться від активних дій з інших причин, наприклад, вхідного телефонного дзвінка.
frankodwyer

Рішення полягає в тому, щоб додати чек, який закривається, лише якщо це корисно. Наприклад, якщо користувач знаходиться на стартовому екрані. Тоді це нормально, навіть якщо телефонний дзвінок надходить. Apple не відкидала цього, оскільки iOS 2 в моїх додатках. stackoverflow.com/a/43906936/712124
кіт

6

Моє додаток нещодавно відхилено. Натомість я використав метод без документації. Буквально:

"На жаль, його не можна додати до App Store, оскільки він використовує приватний API. Використання непублічних API, як зазначено в розділі 3.3.1 Ліцензійної угоди програми для розробників iPhone, заборонено:

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

Непублічний API, який включений у вашу заявку, є terminateWithSuccess "


6

Apple кажуть:

"Попередження: не викликайте функцію виходу. Програми, що викликають вихід, здадуться користувачеві збоєм, замість того, щоб виконати витончене припинення та анімацію назад на головний екран."

Я думаю, що це погане припущення. Якщо користувач натисне кнопку "Вийти" і з'явиться повідомлення, яке говорить про щось на зразок: "Додаток зараз вийде.", Воно, здається, не працює. Apple має надати дійсний спосіб виходу з програми (не вихід (0)).


3
Вони роблять це зателефонувати на кнопку "Головна", вона може розташовуватися внизу будь-якого iDevice. Тому через це ніколи не потрібно створювати власну кнопку виходу.
Попайе

4

Це отримало хорошу відповідь, але вирішив трохи розширитись:

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

Якщо у вас виникли проблеми з платформою Apple, ви не можете легко знайти рішення, зверніться до компанії HIG. Можливо, Apple просто не хоче, щоб ви це робили, і вони зазвичай (я не Apple, тому я не можу гарантувати завжди) так говорять у своїй документації.


3

Так, вам, можливо, доведеться "закрити заявку", якщо, скажімо, для вашої програми потрібне підключення до Інтернету. Ви можете відобразити попередження, а потім зробити щось подібне:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}

9
Ні, не потрібно це припиняти. Наприклад, додаток iTunes, коли він не може виявити належне з'єднання, просто виводить екран із повідомленням, що вони не підключені. Він не виходить, він просто інформує користувача про те, що відбувається. Потім користувач виходить, натискаючи кнопку додому.
серпня

1
Додаток компаса замикається, якщо він не в змозі функціонувати.
Джош Лі

3

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

Якщо під час розробки або тестування необхідно припинити застосування, рекомендується припинити функцію або затвердити макрос

Знайдіть цю запитання щодо Apple тему щоб отримати більше інформації.

Під час використання цієї функції створюється враження, ніби програма виходить з ладу. Отож, я отримав кілька пропозицій, як ми можемо відобразити Повідомлення з повідомленням про припинення, щоб обізнаний користувач про закриття програми через відсутність певної функціональності.

Але керівництво IOS для людського інтерфейсу для запуску та зупинки програми , що дозволяє ніколи не використовувати кнопку Закрити чи Закрити, щоб припинити програму. Скоріше, що вони пропонують показати належне повідомлення для пояснення ситуації.

Додаток iOS ніколи не відображає параметр Закрити або Вийти. Люди перестають користуватися додатком, коли вони переходять на інший додаток, повертаються на головний екран або переводять свої пристрої у сплячий режим.

Ніколи не виходьте з програми iOS програмно. Люди схильні трактувати це як крах. Якщо щось заважає вашому додатку функціонувати за призначенням, вам потрібно повідомити користувачам про ситуацію та пояснити, що вони можуть щодо цього зробити.


2

На додаток до сказаного, добру відповідь, яку я просто хотів додати, подумайте про очищення вашої пам’яті.

Після того, як ваша програма закінчиться, iPhone OS автоматично очистить все, що залишилось у вашій програмі, тому звільнення всієї пам’яті вручну може просто збільшити кількість часу, необхідне для виходу програми.


Будь ласка, змініть свою відповідь у поточному сценарії IOS4.0 та UP ..: P
rptwsthi

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

1

Я використовував згаданий вище підхід [[NSMutableArray]] addObject: nil] для примусового виходу (збою) програми, не роблячи виклик функції «казка» (0).

Чому? Оскільки мій додаток використовує фіксацію сертифікатів для всіх дзвінків мережевого API, щоб запобігти атакам "посеред". До них належать ініціалізаційні дзвінки, які робить мій фінансовий додаток при запуску.

Якщо автентифікація сертифікату не вдається, усі мої ініціалізації викликають помилку і залишають додаток у невизначеному стані. Не дозволяти користувачеві повернутися додому, а потім повернутися в додаток, це не допоможе, оскільки, якщо додаток не очищено ОС, він все ще неініціалізований і ненадійний.

Тож у цьому випадку ми вважали, що найкращим чином з’являється попередження, сповіщаючи користувача про те, що додаток працює в незахищеному середовищі, а потім, натиснувши «Закрити», змусити вийти з програми за допомогою вищезгаданого методу.


Я не бачу, що вас заважає показувати одне повне екранне сповіщення у повноекранному режимі, повідомляючи користувачеві, що додаток не може використовуватись з тих причин "закріплення сертифіката", і все. З часом користувач закриє додаток. Ви можете не знати, але iOS залишає за собою право вбити ваш процес (підтримуючи його стан) та відновити його пізніше, і "життєвий цикл" додатка iOS насправді не в ваших руках. Ваш збій - це просто збій, і ОС може вирішити відновити додаток в будь-якому випадку.
Мотті Шноор

Вау, трирічна посада. Так чи інакше, нова архітектура додатків робить це значною мірою за допомогою кнопки повтору, яка повторює API і або скидає блок-екран, або повертає їх на екран блоку з новою помилкою.
Майкл Лонг

Стара структура програми в значній мірі не давала змоги повторно спробувати виклики запуску API, і додаток опинився в невідповідному стані без них. Ми могли використати постійний блок-екран, але це вимагало від користувача, щоб примусово закрити додаток, і було вирішено, що не кожен користувач знає, ЯК двічі клацнути та змусити вийти з програми. Сьогодні простіше, але досить приховано три роки тому.
Майкл Лонг

1
[[UIApplication sharedApplication] terminateWithSuccess];

Він працював чудово і автоматично дзвонив

- (void)applicationWillTerminateUIApplication *)application delegate.

щоб видалити попередження часу компіляції, додайте цей код

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

5
Це приватний метод, Дієго Меркадо вище пояснив, що його додаток відхилено, чому тоді так ризикувати.
RVN

Використовуючи приватний API, програма відхилить Apple.
ZYiOS

2
для корпоративного додатку - це може бути рішенням.
користувач1140780

- (IBAction) exitApp: (id) відправник {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
unom

@unmircea зробив цей відгук?
Чудо-о

1

Не слід безпосередньо викликати функцію exit(0) оскільки вона негайно вийде з програми та буде виглядати, як ваш додаток розбито. Тож краще показати користувачам попередження про підтвердження та дозволити їм зробити це самостійно.

Швидкий 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()
     }
}

0

Користувач повинен вирішити, коли програма закривається. Я не думаю, що це хороша взаємодія з користувачем, коли програма закривається. Тому для нього немає приємного API, лише кнопка домашнього має його.

Якщо є помилка: Реалізуйте її краще або Повідомте користувача. Якщо потрібно здійснити перезавантаження: виконайте це краще, ніж сповістити користувача.

Це звучить глупо, але погана практика виходити з програми, не дозволяючи користувачеві приймати рішення та не повідомляти про нього. А оскільки існує домашня кнопка для взаємодії з користувачем, заявляє Apple, не повинно бути двох речей для тієї самої функції (вихід із програми).


0

Вихід із програми в інший спосіб, ніж кнопка додому, насправді не є iOS-esque .

Я зробив цей помічник, але не використовував приватних речей:

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

Але все ще не призначений для виробництва в моєму випадку. Він призначений для тестування звітів про збої або для швидкого перезапуску після скидання основних даних. Щойно зробило безпечним його не відхиляти, якщо функцію залишити у виробничому коді.


0

Швидкий 4.2 (або старший)

Викликана бібліотека Darvinможе бути використана.

import Darwin

exit(0) // Here you go

Примітка. Це не рекомендується в додатках iOS.

Якщо це зробити, ви отримаєте журнал аварій.


0

В iPadOS 13 тепер ви можете закрити всі сеанси сцени так:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

Це applicationWillTerminate(_ application: UIApplication)зажадає делегата вашого додатка та врешті-решт його припинить.

Але будьте обережні:

Детальніше про сцени в iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes


-1

Вийдіть із програми іншим способом

Я зробив цей помічник, але не використовував приватних речей:

Вихід (0);


-1

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

Наприклад, скажімо, користувач виходить із програми, що базується на вашому місцезнаходження, і натискає програму на задній план за допомогою домашньої кнопки. У цьому випадку ваша програма може продовжувати працювати, але це може мати сенс повністю закрити її. Це було б добре для користувача (вивільняє пам'ять та інші ресурси, які не потрібно використовувати), а також добре для стабільності додатків (тобто переконайтеся, що додаток періодично перезапускається, коли це можливо, мережа безпеки від витоків пам'яті та інших низьких обсягів пам'яті питання).

Це можна (хоча, мабуть, і не повинно, див. Нижче :-) досягти чогось типу:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.