Подтвердить что ты не робот

Может ли приложение iphone разбудить в фоновом режиме для значительного изменения местоположения активности сети?

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

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я просто хотел бы подтвердить ответ 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;
}

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