Я создаю приложение на основе навигации для iOS 7, для него я беру данные о местоположении пользователей, используя платформу CoreLocation,
Требование к приложению - начать получать информацию о местоположении пользователей в фоновом режиме в определенное время. Для этого я реализовал Silent Pushnotification с методом didReceiveRemoteNotification fetchCompletionHandler:
,
Я успешно реализовал это, используя тихое push-уведомление и вызов startUpdatingLocation
, и я могу получить данные о местоположении в методе делегата:
Используя эту полезную нагрузку:
{"aps" : {"content-available" : 1},"SilentPush" : "4"}
Я включил location
и remote notification
для фонового режима:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
__block UIBackgroundTaskIdentifier bgTask =0;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[self.locationManager startUpdatingLocation];
}];
didUpdateLocations
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
lastLoc=[locations lastObject];
[logFile addLocObject:[NSString stringWithFormat:@"Loc: %@",lastLoc]];
}
Но проблема в следующем:
Через несколько секунд метод делегата класса местоположения останавливается, и он не будет отправлять данные, если устройство движется, и когда я говорю о приложении на переднем плане, он вызывает метод «didFinishLaunhing», поэтому я предполагаю, что ОС убьет приложение, даже если местоположение обновляется, в Устройство Diagnostics & usage
я получаю следующий отчет о сбое:
Application Specific Information:
MockUpApp2[390] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x145ac790> identifier: Called by MockUpApp2, from -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] process: MockUpApp2[390] permittedBackgroundDuration: 40.000000 reason: finishTaskAfterBackgroundContentFetching owner pid:390 preventSuspend preventIdleSleep preventSuspendOnSleep
)}
Вчера я задал этот вопрос, теперь я могу запустить менеджер местоположения в фоновом режиме через push-уведомление,
Поэтому, пожалуйста, кто-нибудь может дать решение этой проблемы.
Спасибо.
Примечание. Если я запускаю приложение в режиме отладки, это означает, что я запускаю приложение через XCode, не останавливая его и не отключая, приложение будет работать. В этом случае приложение не будет останавливаться операционной системой.
ИЗМЕНИТЬ 1
Согласно ответу @Stephen Darlington, если я удалю все фоновые изображения, например,
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
[self.locationManager startUpdatingLocation];
}
Теперь приложение не будет вызывать didUpdateLocations
ни разу, :(
Что я должен написать в этом методе?
Edit 2
Согласно Apple Doc сказать:
If your app is suspended or not running, the system wakes up or launches your app and puts it into the background running state before calling the method.
ТАК, должно ли приложение работать в фоновом режиме, пока я включил режим фона местоположения?
possible duplicate
, потому что это другая проблема, и если другой пользователь SO покажет это в вопросе, они не будут пытаться ответить на него, поэтому, пожалуйста. - person   schedule 07.02.2014