Может ли приложение iphone просыпаться в фоновом режиме при значительном изменении местоположения для сетевой активности? - PullRequest
17 голосов
/ 22 марта 2011

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

В настоящее время приложение осуществляет доступ к сети через TCP-сокеты. Гнездо отключается, когда приложение приостановлено.

Могу ли я повторно подключить сокет, получить некоторые данные, отправить новое местоположение, а затем выключить сокет, находясь в фоновом режиме, в результате получения события изменения местоположения? Это трудно проверить, находясь в офисе! Мы можем предположить, что сетевая активность занимает менее 10 секунд. Также предположим, что приложение не зарегистрировано как приложение voip (может / должно быть? ...)

Есть идеи?

Ответы [ 2 ]

11 голосов
/ 24 марта 2011

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

Когда вы проснулись в фоновом состоянии при значительных изменениях (из прекращенного или приостановленного состояния), вы можете сделать свой http-запрос.Если вы обнаружите, что ваше приложение закрывается до того, как вы завершите HTTP-запрос, вы можете запросить дополнительное время фоновой обработки с помощью метода beginBackgroundTaskWithExpirationHandler : для UIApplication.

Я потратил немало временив коротких поездках на поезде, чтобы проверить это.:)

4 голосов
/ 26 июля 2011

Я просто хотел бы подтвердить ответ RedBlueThing с некоторыми подробностями.

Теперь я использую следующее для достижения этой цели. bgTask объявлен как UIBackgroundTaskIdentifier

bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:
           ^{
                 [[UIApplication sharedApplication] endBackgroundTask:bgTask];
            }];

// Now call methods doing network activity
// ...
// WHEN I KNOW THE LAST ACTION HAS COMPLETED USE THIS BLOCK OF CODE

if (bgTask != UIBackgroundTaskInvalid)
{
      [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
}

Надеюсь, это поможет, поскольку я вижу немало людей, которые смотрят на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...