-->

在iOS的用户的位置的认识背景跟踪(Understanding background trackin

2019-08-17 03:46发布

我需要不断获取用户的位置更新应用程序时,将背景和,我苹果的文档中找到,这是被允许执行长期运行的后台任务之一。 我还需要作一些处理和网络通话时的位置更新通知发送给服务器的一些信息。 我正在试图做的,在广招,是这样的:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
   bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
      [application endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }];

   // Background task        
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSLog(@"Background time remaining: %f seconds (%d mins)",
     [[UIApplication sharedApplication] backgroundTimeRemaining], 
     (int)([[UIApplication sharedApplication] backgroundTimeRemaining] / 60));

      // Need to get data from database here

      // Finished
      if (bgTask != UIBackgroundTaskInvalid) {
         [application endBackgroundTask:bgTask];
         bgTask = UIBackgroundTaskInvalid;
      }

   });

   // Start location manager
   locationManager = [[CLLocationManager alloc] init];
   if ([CLLocationManager locationServicesEnabled]) {          
      locationManager.delegate = self;
      locationManager.distanceFilter = 20;
      locationManager.desiredAccuracy = kCLLocationAccuracyBest;
      [locationManager startUpdatingLocation];
   }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
   bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
      [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      // Want to perform some data processing here, including concurrent tasks 
      // and several network calls to get and send data to server

      [self locationProcessingCompleted];

   });
}

- (void)locationProcessingCompleted
{
   // Check results. If needed, some more data processing and several network 
   // calls to send data to server

   // Close background task
   if (bgTask != UIBackgroundTaskInvalid) {
      [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }
}

我不`吨找到有关位置的服务的长期运行的后台任务的任何代码示例,我对它有几个问题:

a)是否有必要到内执行所有的后台代码dispatch_async队列? 换句话说,已经全部代码applicationDidEnterBackground:异步执行,包括位置管理器设置?

[[UIApplication sharedApplication] backgroundTimeRemaining]返回一个非常长的值。 这个时间不应该是大约10分钟?

C)我想做的事:执行初始长度有限的任务,启动位置更新,然后执行一些其他有限长度的任务,每一个时间didUpdateToLocation:被触发。 我已经设置了location的值UIBackgroundModesInfo.plist 。 是我的方法正确吗? 我将继续无限期地更新位置,然后我可以在每一次更新不到10分钟长进行有限长度的任务接收到?

拜托,我需要这个问题有所帮助。 提前致谢

Answer 1:

所有你需要做的是增加“应用程序注册了位置更新”下的“所需的背景模式”,您可在文本编辑器或者编辑plist文件,并添加以下代码或可以使用Xcode中添加所需的背景模式。

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

该didUpdateToLocation方法将被调用(甚至当你的应用程序是在后台)。 您可以在调用此方法的基础进行任何的事情...

Xcode中的快照



Answer 2:

按你提供的代码你在applicationDidEnterBackground分配的LocationManager,我想建议你在didFinishLaunchingWithOptions方法分配的LocationManager,然后调用startUpdatingLocation方法在applicationDidEnterBackground方法。

您可能还需要调用stopUpdatingLocation在applicationWillEnterForeground方法(如果您不需要接收位置更新时,应用程序是在前台)。

提示:不要启用与最佳精度的GPS很长一段时间,因为它会吃掉你的电池非常快(3至4小时内,按我的经验)。



Answer 3:

声明:我Cintric工作

我们也希望能够准确地跟踪用户位置(应用程序已被杀害即使)的背景。 我们花了很长的时间解决问题,尤其是专注于电池消耗。

我们张贴在我们如何解决它一个伟大的博客文章。 http://www.blog.cintric.com/?p=121并且还提供了一个拖放SDK解决方案是免费的。 随着一行代码,你可以把它不断地在后台跟踪位置,并使用只有1%的电池。 此外,您可以设置一个类是它的委托,所以你可以发送信息到你的服务器(包括在后台,而不必使用后台任务API)。

您也可以下载.framework文件,将其拖放到你的项目,并用一行代码初始化: [CintricFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];

你可以得到免费的API密钥。 有文档说明一切都很这里: https://www.cintric.com/docs/ios



文章来源: Understanding background tracking of user's location in iOS