Может ли приложение iphone разбудить в фоновом режиме для значительного изменения местоположения активности сети?
Я работаю над приложением, которое отслеживает значительные изменения местоположения в фоновом режиме. Я читал все ответы (ну, я думаю, все!) Об ios4 и жизненном цикле приложения, но я не могу понять, могу ли я делать любой доступ к сети, когда приложение пробуждается в фоновом режиме в результате значительного изменения местоположения.
Приложение в настоящее время осуществляет доступ к сети через сокеты TCP. Сокет отключается, когда приложение приостановлено.
Могу ли я повторно подключить сокет, получить некоторые данные, отправить новое местоположение и затем выключить сокет, все еще находясь в фоновом режиме, в результате получения события изменения местоположения? Трудно протестировать в стационаре в офисе! Мы можем предположить, что сетевая активность занимает менее 10 секунд. Также предположим, что приложение не зарегистрировано в качестве приложения voip (может/должно быть?...)
Любые идеи?
Ответы
Ответ 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;
}
Надеюсь, что это поможет, так как я вижу довольно много людей, которые смотрят на вопрос.