2013-04-30 2 views
3

У меня есть приложение, которое захватывает местоположение пользователя и отправляет эту информацию на мой сервер.[iOS] захват пользователя местоположение: уточнение

Я начал службу LocationManager с:

- (CLLocationManager *)locationManager { 
    if (_locationManager == nil) { 
     _locationManager = [[CLLocationManager alloc] init]; 
     _locationManager.delegate = self; 
     isUpdatingLocation = NO; 
    } 
    return _locationManager; 
} 

-(void) startLookingForLocation{ 

    [self locationManager].desiredAccuracy = kCLLocationAccuracyBest; 
    [self locationManager].distanceFilter = 250; 

    if([[self locationManager]respondsToSelector:@selector(setPausesLocationUpdatesAutomatically:)]) 
     [[self locationManager] setPausesLocationUpdatesAutomatically:YES]; 

    if([[self locationManager]respondsToSelector:@selector(setActivityType:) ]) 
     [[self locationManager] setActivityType:CLActivityTypeFitness]; 

    [[self locationManager] startUpdatingLocation]; 
    [[self locationManager] startUpdatingHeading]; 

    isUpdatingLocation = YES; 
} 

и остановить его:

-(void) stopLookingForLocation{ 

    [[self locationManager] stopUpdatingLocation]; 
    [[self locationManager] stopUpdatingHeading]; 

    isUpdatingLocation = NO; 

} 

Так что, когда я обнаружить изменение местоположения пользователя:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

    [self setCurrentLocation:newLocation]; 

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

    if (isInBackground) 
    { 
     UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] 
        beginBackgroundTaskWithExpirationHandler: 
        ^{ 
         [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
        }]; 

     // Send user-location to my server 

     if (bgTask != UIBackgroundTaskInvalid) 
     { 
      [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
      bgTask = UIBackgroundTaskInvalid; 
     } 
    } 
    else 
    { 
     // Send user-location to my server 
    } 

} 

и все работает правильно. (Я полагаю).

Когда приложение перейдет в фоновый режим, я призываю этот метод в AppDelegate - (ничтожной) applicationDidEnterBackground: (UIApplication *) применение { [locationManager startMonitoringSignificantLocationChanges]; }

и когда приложение возвращение на передний план:

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

Но у меня есть некоторые сомнения. Таким образом, если приложение закрыто, мое приложение продолжает связываться с местоположением на сервере?

Как я могу отправить местоположение только тогда, когда я нахожусь в фоновом режиме или на переднем плане?

EDIT: Я также установил:

UIBackgroundModes расположения

ответ

2

Там нет необходимости этого кода это будет активное приложение в фоновом режиме для маленького времени, вы должны упомянуть режимы Необходимых предпосылок в info.plist проекта, и значение должно быть регистрами приложений для обновлений местоположения.

Установите только расположение UIBackgroundModes в info.plist, и оно работает в фоновом режиме . Это может вам помочь.

//In app deligate 

#pragma mark - 
#pragma mark GPS Service 

//========== start GPS SERVICE =========== 
-(void)startGpsService 
{ 

    locationManager=[[CLLocationManager alloc] init]; 
    locationManager.delegate=self; 
    locationManager.desiredAccuracy=kCLLocationAccuracyBest; 
    locationManager.distanceFilter=10.0; 
    [locationManager startUpdatingLocation]; 
    [self performSelectorInBackground:@selector(sendDataToServer) withObject:nil]; 
} 

#pragma mark - 
#pragma mark CLLocation Manager Delegates 

- (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation 
{ 
     [self performSelectorInBackground:@selector(sendDataToServer) withObject:nil]; 

} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    // No need to do any thing 
    /* UIApplication *app = [UIApplication sharedApplication]; 
     UIBackgroundTaskIdentifier bgTask = 0; 
     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     }]; 
*/ 
} 
+0

@Cecco Я уже столкнулся с этой проблемой, а затем, наконец, получил это решение. –

+0

Извините, но я новичок в Objective-C. Можете ли вы опубликовать мне фрагмент кода, чтобы я мог понять этот вопрос? Спасибо за ваш ответ. – CeccoCQ

+0

Большое спасибо. Но этот фрагмент отправляет местоположение на сервер только тогда, когда приложение находится на переднем плане, а также когда оно находится в фоновом режиме или закрыто? Я полагаю, что только в фоновом режиме и переднем плане (для закрытых я имею в виду, когда пользователь дважды нажимает на домашний ключ и закрывает приложение). – CeccoCQ

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