Отправка широты и долготы на сервер, когда приложение находится в фоновом режиме

Я пережил так много ссылок, даже после этого я не нашел правильного решения для получения широты и долготы.

Периодические обновления местоположения фона iOS

iOS длительный фоновый таймер с "местоположением" фоновый режим

Я пытался использовать некоторые ссылки и форумы, но он работает всего лишь 3 минуты, а затем приложение не обновляет местоположение пользователя.

- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.


//create new uiBackgroundTask
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

//and create new timer with async call:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    [locationManager startUpdatingLocation];

    NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(startTrackingBg) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
});

}
 -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//  store data
CLLocation *newLocation = [locations lastObject];


//tell the centralManager that you want to deferred this updatedLocation
if (_isBackgroundMode && !_deferringUpdates)
{
    _deferringUpdates = YES;
    [locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
}
}

Ответ 1

Ok.

После битвы за 3 дня он работает для меня для отправки широты и долготы, когда приложение находится в фоновом режиме даже через 3 минуты.

Я проверил свое приложение, постоянно отправляя lat в течение более часа в фоновом режиме.

Это может помочь кому-то хотя бы.

Сначала добавьте ниже два ключа в свой список pList.

 1.NSLocationAlwaysUsageDescription
 2.NSLocationWhenInUseUsageDescription

Bothe - это строки, и вы можете дать любую ценность.

Затем, пожалуйста, включите фоновый выбор и проверьте обновления местоположения по возможностям в разделе проекта.

Затем импортируйте инфраструктуру Corelocation и добавьте этот код ниже.

locationManager - глобальная переменная.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
 //create CLLocationManager variable
locationManager = [[CLLocationManager alloc] init];
//set delegate
locationManager.delegate = self;

app = [UIApplication sharedApplication];
// This is the most important property to set for the manager. It ultimately determines how the manager will
// attempt to acquire location and thus, the amount of power that will be consumed.

if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [locationManager setAllowsBackgroundLocationUpdates:YES];
}
locationManager.desiredAccuracy = 45;
locationManager.distanceFilter = 100;
// Once configured, the location manager must be "started".
[locationManager startUpdatingLocation];
}

 - (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

[locationManager stopUpdatingLocation];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
locationManager.pausesLocationUpdatesAutomatically = NO;
locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[locationManager startUpdatingLocation];
 }

 - (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.


[locationManager stopUpdatingLocation];

__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    bgTask = UIBackgroundTaskInvalid;
}];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                              target:self
                                            selector:@selector(startTrackingBg)
                                            userInfo:nil
                                             repeats:YES];


 }

-(void)startTrackingBg {

[locationManager startUpdatingLocation];
 NSLog(@"App is running in background");
}
 //starts automatically with locationManager
  -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
latitude=newLocation.coordinate.latitude;
longitude=newLocation.coordinate.longitude;
NSLog(@"Location: %f, %f",newLocation.coordinate.longitude, newLocation.coordinate.latitude);
 }

Ответ 2

Вам нужно обратиться к этой яблочной документации по обработке событий местоположения в фоновом режиме

Вам необходимо включить обновление местоположения в фоновых режимах в возможностях вашего проекта XCode.

Стандартная служба определения местоположения небудет работать в фоновом режиме, поэтому вам придется использовать либо службу определения местоположения с существенными изменениями, либо службу посещений.

Используйте этот код для

locationManager.delegate = self
locationManager.startMonitoringSignificantLocationChanges()

включить службу определения существенных изменений.

Ответ 3

Опираясь на ответ сантоса, в котором содержится большинство важных шагов для создания фонового позиционирования, я уточнил и исправил некоторые детали.

Настройки проекта

Вы должны добавить эти ключи в свой список свойств Info XCode Target. Обязательно добавьте правильное описание к каждому из них, иначе ваше приложение может не пройти утверждение.

  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysAndWhenInUseUsageDescription

enter image description here

Затем в разделе "Целевые возможности" включите фоновые режимы и проверьте обновления местоположения и выборку фона. Обновления местоположения включат местоположения в фоновом режиме, а выборка в фоновом режиме позволит вам использовать сеть в фоновом режиме. enter image description here

Начать мониторинг

Начните с создания экземпляра CLLocationManager, настройте его и включите фоновые обновления, затем запустите его. Хотя приведенный ниже код использует наиболее распространенную функцию startUpdatingLocation для определения местоположения, есть несколько других сервисов, которые нужно использовать. important важно выбрать наиболее подходящий сервис, так как это сильно влияет на использование батареи, а также на то, будет ли приложение перезапущено iOS или нет. Подробнее об этом см. ниже.

// Declare as properties in your class
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *lastLocation;

// Call to start
- (void)initializeAndStartLocationService {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    // Must be set for background operation
    self.locationManager.allowsBackgroundLocationUpdates = YES;

    // Optional configuration
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.pausesLocationUpdatesAutomatically = YES;
    self.locationManager.showsBackgroundLocationIndicator = YES;

    // Authorize - the lazy way
    [self.locationManager requestAlwaysAuthorization];

    // Start the standard location service, there are others
    [self.locationManager startUpdatingLocation];
}

// Delegate method that will receive location updates
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    // Keep the last received location
    self.lastLocation = [locations lastObject];

    NSLog(@"New position %f, %f", self.lastLocation.coordinate.latitude, self.lastLocation.coordinate.longitude);

    // Do something with the location or retrieve the location later
    //       :
}

Прекратить мониторинг

Не забудьте прекратить мониторинг, чтобы сохранить батарею. Вы можете запускать и останавливать несколько раз на одном экземпляре CLLocationManager.

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

Особенности автоматического перезапуска приложения

Когда ваше приложение работает в фоновом режиме, оно может (и фактически часто через некоторое время) будет закрыто iOS. В зависимости от типа обновлений местоположения, которые вы используете, iOS автоматически запустит или не запустит ваше приложение. В случаях, когда iOS не запускается повторно, пользователь должен снова запустить приложение, чтобы продолжить фоновую обработку.

Узнайте больше на этой странице.

enter image description here

Читать далее

CLLocationManager - Базовое расположение | Документация Apple
Обработка событий местоположения в фоновом режиме | Документация Apple