2013-04-24 5 views
3

Я разрабатываю приложение iOS для установки офисного лобби. Приложение будет установлено только на шести iPads и никогда не будет распространяться через магазин приложений. Приложению потребуется загрузить большой файл контента один раз в день и в любое время его перезапустить. Кроме того, приложение должно будет предварительно загрузить кучу изображений, чтобы они могли отображаться быстро. Весь этот процесс занимает некоторое время - 45 секунд или около того. Это достаточно долго, так что os убивает приложение при запуске. Я отложил процесс загрузки до запуска, который, похоже, работает.Будет ли iOS убивать мое приложение, если оно перестанет отвечать?

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

+1

Я считаю, что вы можете развернуть тестовые приложения в виде пакетов на телефоны. Почему бы не написать приложение, которое выполняет бесконечный цикл и попробовать? –

+3

Любые причины, по которым вы не хотите делать это в отдельном потоке? –

+3

Вам нужно сделать это в основной теме? Даже если он работает только на шести устройствах, нет необходимости его плохо выполнять. – Sulthan

ответ

4

Да. Наблюдатель убьет ваше приложение, если вы заблокируете основной поток, и приложение слишком долго реагирует на системные события. Я не верю, что Apple заявляет о фактическом времени.

Дополнительная информация здесь https://developer.apple.com/library/ios/#technotes/tn2008/tn2151.html или google 0x8badf00d. Это код исключения, связанный с тайм-аутом сторожевого таймера.

2

Технически вы можете запускать долговременную задачу синхронно после того, как приложение было запущено, если ваши пользователи не возражают ждать невосприимчивого пользовательского интерфейса. Однако пользователь может заблокировать свое устройство и разблокировать его позже. Если ваше приложение не сможет ответить на обратные вызовы жизненного цикла приложения (applicationWillResignActive: и applicationDidBecomeActive:), он все равно может быть убит.

См. Это Q/A для получения технической информации о iOS watchdog - процессе демона, который гарантирует, что приложения будут вести себя хорошо.

Обратите внимание, что при запуске приложения из Xcode сторожевой таймер не убьет его, несмотря ни на что. Но как только вы запустили свое приложение с главного экрана, сторожевой таймер берет его на себя. На самом деле это не имеет никакого отношения к App Store.

Чтобы быть в безопасности, я предлагаю вам выполнять длительные задачи в фоновом потоке. Это очень легко сделать с [self performSelectorInBackground:withObject:]. И вы можете показать индикатор активности или даже отобразить количество загруженных файлов в пользовательском интерфейсе, чтобы пользователи знали, что что-то работает под капотом.

Чтобы обновить пользовательский интерфейс из фонового потока, вы должны позвонить в основной поток для выполнения кода обновления. Это можно сделать так:

- (void)methodRunningInBackground 
{ 
    // some work is done here ... 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update your UI here 
    }); 
} 
Смежные вопросы