2015-06-19 3 views
1

Я разрабатываю приложение, которое работает в фоновом режиме, чтобы получить местоположение пользователя и отправить его на сервер с помощью HTTP-запросов. Мое первое намерение состояло в том, чтобы получить местоположение пользователя каждые n минут, но после многих исследований и испытаний я сдался, так как ios убивает мои фоновые задачи через 3 минуты.Получение местоположения пользователя, когда приложение находится в фоновом режиме. IOS

Затем я попытался работать с MonitoringSignificantLocationChanges, но его неточное обновление местоположения из-за использования ячеистой камеры разрушает цель моего приложения.

Решение любой из следующих высоко оценили:

  1. Получение данных о местоположении пользователя в фоновом режиме каждые п минут бесконечно.
  2. Получение местоположения пользователя в фоновом режиме на SignificantLocationChanges с высокой точностью (с использованием gps)
  3. Любое другое фоновое решение с высокой точностью.

ответ

0

Получение данных о местоположении пользователя в фоновом режиме на SignificantLocationChanges с высокой точностью (с использованием GPS)

Выполните следующие действия:

в info.plist добавить следующий

<key>NSLocationAlwaysUsageDescription</key> 
    <string>{your app name} requests your location coordinates.</string> 
    <key>UIBackgroundModes</key> 
    <array> 
     <string>location</string> 
    </array> 

в использовании кода LoctionManager для получения местоположения обновления, (он будет работать как в переднем и заднем плане)

@interface MyViewController <CLLocationManagerDelegate> 
@property (nonatomic, strong) CLLocationManager *locationManager; 
@end 

@implementation MyViewController 
-(void)startLocationUpdates { 
    // Create the location manager if this object does not 
    // already have one. 
    if (self.locationManager == nil) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
    } 

    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 
    self.locationManager.activityType = CLActivityTypeFitness; 

    // Movement threshold for new events. 
    self.locationManager.distanceFilter = 25; // meters 

    if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [self.locationManager requestAlwaysAuthorization]; 
    } 
    [self.locationManager startUpdatingLocation]; 
} 

- (void)stopLocationUpdates { 
    [self.locationManager stopUpdatingLocation]; 
} 

#pragma mark CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    // Add your logic here 
} 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"%@", error); 
} 
1

Это то, что работает для меня, я использую CLLocationManagerDelegate, регистрация обновлений на didUpdateLocations и в приложении делегатом

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [_locationManager stopMonitoringSignificantLocationChanges]; 
    [_locationManager startUpdatingLocation]; 
} 

Я начинаю обновлять местоположение, ключ для меня, когда приложение переходит к фону, я переключаюсь на значительные изменения местоположения, поэтому приложение не сбрасывает тесто, как это:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [_locationManager startMonitoringSignificantLocationChanges]; 
} 

В didUpdateLocations, вы можете проверить

BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 

И запустить задачу в фоновом режиме, чтобы сообщить о местонахождении, например

if (isInBackground) { 
    [self sendBackgroundLocationToServer:self.location]; 
} 

И запустить задачу, я надеюсь, что помогает.

Смежные вопросы