Приложение не запускается в фоновом режиме, но могу ли я выполнить какую-либо задачу до того, как мое приложение будет закрыто? - PullRequest
1 голос
/ 10 февраля 2012

У меня странная ситуация, клиент не хочет, чтобы его приложение поддерживало многозадачность, поэтому я создал флаг в info.plist как,

Application does not run in background = YES;

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

Теперь мои вопросы,

  • Сколько у меня есть времени, прежде чем ОС завершит работу моего приложения? Иногда данные могут быть большими для загрузки, и если интернет работает медленно, мне может потребоваться больше времени.
  • Я видел, что этот метод beginBackgroundTaskWithExpirationHandler будет работать в моей ситуации. Я сомневаюсь, как это может работать, если я поддерживаю фоновое выполнение. я прав?

Заключительные вопросы,

  • Какие еще варианты я могу придумать?
  • я должен уйти в отставку как разработчик iOS?

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

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

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

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

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

2 голосов
/ 10 февраля 2012

Мой совет - попробовать что-то вроде этого:

[[NSNotificationCenter defaultCenter] 
 addObserver:self 
 selector:@selector(saveWhatever) 
 name:UIApplicationWillTerminateNotification
 object:nil];

Просто поместите этот код в метод init вашего класса.Обязательно удалите себя в качестве наблюдателя в viewDidUnload следующим образом:

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

1 голос
/ 10 февраля 2012

Имеет ли значение, когда вы загружаете данные на сервер? Должно ли это быть правильно до завершения приложения?

Если нет, то у меня есть предложение:

В методе Application Delegate applicationWillTerminate запишите все свои данные в текстовый файл, что-то вроде mydata.txt, вашей файловой системы изолированной программной среды приложения (а именно в каталоге Library / Cache. Не удается использовать каталог Document для файлов, созданных приложением Apple теперь использует каталог документов для синхронизации iCloud, поэтому размещение ваших файлов приведет к отклонению приложения). Также необходимо пометить файл с помощью атрибута not sync to iCloud.

Затем при следующем запуске приложения вы можете проверить существование этого файла "mydata.txt". Если он существует, прочитайте все данные и загрузите его на свой сервер. Затем удалите файл из папки Library / Cache, чтобы в следующий раз он не загружал те же данные. Вы можете сделать это в методе applicationDidFinishLaunching делегата приложения.

...