в идеале вам никогда не придется проверять этот параметр. Похоже, вы ходите по фону, выбирая неправильный путь. Когда приложение свернуто, система будет периодически пробуждать ваше приложение и разрешать ему выполнять задачи. Из вашего кода вы хотите обновить местоположение. первое место, с которого нужно начать, здесь, используя этот метод делегата, который вызывается, когда приложение просыпается для фоновой выборки
/// Приложения с фоновым режимом "выборка" могут получить возможность получать обновленный контент в фоновом режиме или когда это удобно для системы. Этот метод будет вызываться в таких ситуациях. Вы должны вызвать fetchCompletionHandler, как только закончите выполнение этой операции, чтобы система могла точно оценить свою мощность и стоимость данных. - (void)application:(UIApplication *)application PerformFetchWithCompletionHandler:(void (^)(результат UIBackgroundFetchResult))completionHandler NS_AVAILABLE_IOS(7_0);
вот как вы его используете, в реализации делегата вашего приложения определите тело метода следующим образом
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"APP IS AWAKE FOR A BACKGROUND FETCH");
//do all the work you want to do
//once done, its important to call the completion hadler, otherwise the system will complain
completionHandler(UIBackgroundFetchResultNewData);
}
однако, поскольку вы обновляете местоположение, у которого есть свои делегаты, вы хотите, чтобы обработчик завершения вызывался только тогда, когда ваши делегаты возвращаются, а не раньше. Вызов обработчика завершения отправит ваше приложение обратно в спящий режим. Поскольку обработчик завершения является блочным объектом, его можно передавать, как и любой другой объект. Один из способов сделать это заключается в следующем: в заголовочном файле делегата приложения определите блочный объект:
void (^fetchCompletionHandler)(UIBackgroundFetchResult);
то в вашем PerformFetchWithCompletionHandler есть:
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
fetchCompletionHandler = completionHandler;
NSLog(@"APP IS AWAKE FOR A BACKGROUND FETCH");
//do all the work you want to do
[self.locationManager startUpdatingLocation];
}
в какое-то подходящее время, после того, как ваши методы делегата местоположения вернулись, вы вызываете
fetchCompletionHandler (UIBackgroundFetchResultNewData);
обязательно проверьте, является ли ваш fetchCompletionHandler отличным от нуля, вызов его, когда nil, немедленно приведет к сбою вашего приложения. Узнайте больше о блоках из документации Apple здесь https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html
также взгляните на вызов [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: ]; который указывает минимальное время, которое должно пройти между операциями фоновой выборки.
Вероятно, вы бы добавили это в метод didFinishLaunchingWithOptions приложения-делегата вашего приложения.
надеюсь, это поможет вам.
person
dubemike
schedule
09.10.2013