Держите GPS включенным в течение нескольких минут при нажатии кнопки «Домой».

У меня есть приложение с мониторингом региона, но для лучшего понимания я вызываю «startUpdatingLocation» для использования GPS, когда пользователь входит в указанный регион:

  - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
   [manager startUpdatingLocation]; 
}



-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
locationManager =manager;

     CLLocation *location1 = locationManager.location;
     CLLocation *location2 = [[CLLocation alloc] initWithLatitude:obj.latitude longitude:obj.longitude];
    float betweenDistance=[location1 distanceFromLocation:location2];


    if((betweenDistance/1000)<=0.350000){
            // Fires an UIAlert
     }

}

Это отлично работает в большинстве случаев, например, если пользователь находится за пределами региона, а затем нажимает кнопку «Домой», и после входа в регион срабатывает функция «didEnterRegion», и GPS начинает работать в течение нескольких минут и показывает Предупреждение, это правильный путь.

Но если приложение открыто, а затем пользователь входит в регион, запускает функцию «didEnterRegion» и запускается GPS, но если пользователь нажимает кнопку «Домой» в этот момент, GPS останавливается, и предупреждение никогда не появляется.

Я не хочу активировать опцию «Обязательные фоновые режимы» в info.plist, потому что я хочу использовать GPS только в течение нескольких минут после того, как пользователь нажмет кнопку «Домой», а не для использования в чрезмерном режиме.

Есть идеи?


person Roberto Briones Argüelles    schedule 03.02.2013    source источник


Ответы (1)


Когда ваш делегат приложения получает сообщение applicationWillResignActive: вы можете запросить, чтобы ОС продолжала работу вашего приложения, создав такой запрос:

UIBackgroundTaskIdentifier taskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // do you cleanup in here if your background task gets terminated by the system
}];

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

Как только вам больше не нужно продолжать работу, вы можете отпустить свой запрос следующим образом.

[[UIApplication sharedApplication] endBackgroundTask:taskID];

Чтобы все это работало, просто добавьте флаг в делегат вашего приложения, чтобы он знал, когда вы делаете что-то, что требует больше времени. Затем, когда ваш делегат получает сообщение applicationWillResignActive:, он может проверить этот флаг и, если он установлен, запросить некоторое фоновое время для продолжения работы.

person John Stephen    schedule 04.02.2013
comment
Спасибо, но мой CLLocationManager Delegate находится в другом представлении, и мне нужно вызывать метод startUpdatingLocation того же CLLocationManager, пока пользователь не получит свое предназначение. Я не знаю, как это сделать внутри applicationWillResignActive в AppDelegate. - person Roberto Briones Argüelles; 04.02.2013
comment
Материал фоновой задачи просто сообщает системе, что ваше приложение должно работать. Неважно, где находится ваш CLLocationManager, просто сообщите делегату приложения, что приложение необходимо поддерживать в рабочем состоянии еще какое-то время, а затем делегат может сообщить системе, когда приложение попросят уйти в отставку. - person John Stephen; 05.02.2013