猿问

如何在iOS应用程序中每n分钟更新一次背景位置?

如何在iOS应用程序中每n分钟更新一次背景位置?

我正在寻找一种方法,以获得一个背景位置更新每n分钟在我的iOS应用程序。我使用的是iOS 4.3,这个解决方案应该适用于非越狱iPhone。

我尝试/考虑了以下选择:

  • CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges

    :根据配置的属性在后台按预期工作,但似乎不可能强迫它每n分钟更新一次位置。
  • NSTimer

    :应用程序在前台运行时是否工作,但似乎不是为后台任务设计的
  • 本地通知:本地通知可以每n分钟调度一次,但是不可能执行一些代码来获得当前位置(用户不必通过通知启动应用程序)。这种方法似乎也不是一种干净的方法,因为这不是应该使用的通知。
  • UIApplication:beginBackgroundTaskWithExpirationHandler

    据我所知,当一个应用程序被移到后台而不是实现“长期运行”后台进程时,应该使用它来完成背景中的一些工作(也是有限的时间)。

如何实现这些定期的背景位置更新?


潇潇雨雨
浏览 579回答 3
3回答

隔江千里

在Apple Developer论坛的帮助下,我找到了一个实现这个问题的解决方案:指定location background mode创建一个NSTimer在背景中UIApplication:beginBackgroundTaskWithExpirationHandler:什么时候n是较小比UIApplication:backgroundTimeRemaining一切都会好起来的。什么时候n是更大,location manager在没有时间避免后台任务被杀死之前,应该再次启用(并禁用)。这是因为位置是允许的三种背景执行类型之一。.注意:我浪费了一些时间在模拟器中测试它不起作用。然而,它在我的手机上工作得很好。

慕田峪4524236

在……上面iOS 8/9/10要使背景位置每5分钟更新一次,请执行以下操作:转到Project->Capability->后台模式->选择位置更新转到Project->Info->添加一个键NSLocationAlwaysUsageDescription和空值(或者任意文本)要使位置在后台工作,并将坐标发送到Web服务或每5分钟对它们执行任何操作,请按照下面的代码执行。我不使用任何背景任务或计时器。我已经用iOS 8.1在我的设备上测试了这段代码,它在我的桌子上躺了几个小时,我的应用程序在后台运行。设备被锁定,代码一直在正常运行。@interface&nbsp;LocationManager&nbsp;()&nbsp;<CLLocationManagerDelegate>@property&nbsp;(strong,&nbsp;nonatomic)&nbsp;CLLocationManager&nbsp;*locationManager; @property&nbsp;(strong,&nbsp;nonatomic)&nbsp;NSDate&nbsp;*lastTimestamp;@end@implementation&nbsp;LocationManager+&nbsp;(instancetype)sharedInstance{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;id&nbsp;sharedInstance&nbsp;=&nbsp;nil; &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;dispatch_once_t&nbsp;onceToken; &nbsp;&nbsp;&nbsp;&nbsp;dispatch_once(&onceToken,&nbsp;^{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sharedInstance&nbsp;=&nbsp;[[self&nbsp;alloc]&nbsp;init]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocationManager&nbsp;*instance&nbsp;=&nbsp;sharedInstance; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.locationManager&nbsp;=&nbsp;[CLLocationManager&nbsp;new]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.locationManager.delegate&nbsp;=&nbsp;instance; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.locationManager.desiredAccuracy&nbsp;=&nbsp;kCLLocationAccuracyBest;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;use&nbsp;kCLLocationAccuracyHundredMeters&nbsp;to&nbsp;get&nbsp;better&nbsp;battery&nbsp;life &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.locationManager.pausesLocationUpdatesAutomatically&nbsp;=&nbsp;NO;&nbsp;//&nbsp;this&nbsp;is&nbsp;important &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sharedInstance;}-&nbsp;(void)startUpdatingLocation{ &nbsp;&nbsp;&nbsp;&nbsp;CLAuthorizationStatus&nbsp;status&nbsp;=&nbsp;[CLLocationManager&nbsp;authorizationStatus]; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(status&nbsp;==&nbsp;kCLAuthorizationStatusDenied) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"Location&nbsp;services&nbsp;are&nbsp;disabled&nbsp;in&nbsp;settings."); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;iOS&nbsp;8 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([self.locationManager&nbsp;respondsToSelector:@selector(requestAlwaysAuthorization)]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.locationManager&nbsp;requestAlwaysAuthorization]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;iOS&nbsp;9 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([self.locationManager&nbsp;respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.locationManager&nbsp;setAllowsBackgroundLocationUpdates:YES]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[self.locationManager&nbsp;startUpdatingLocation]; &nbsp;&nbsp;&nbsp;&nbsp;}}-&nbsp;(void)locationManager:(CLLocationManager&nbsp;*)manager&nbsp;didUpdateLocations:(NSArray&nbsp;*)locations{ &nbsp;&nbsp;&nbsp;&nbsp;CLLocation&nbsp;*mostRecentLocation&nbsp;=&nbsp;locations.lastObject; &nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"Current&nbsp;location:&nbsp;%@&nbsp;%@",&nbsp;@(mostRecentLocation.coordinate.latitude),&nbsp;@(mostRecentLocation.coordinate.longitude)); &nbsp;&nbsp;&nbsp;&nbsp;NSDate&nbsp;*now&nbsp;=&nbsp;[NSDate&nbsp;date]; &nbsp;&nbsp;&nbsp;&nbsp;NSTimeInterval&nbsp;interval&nbsp;=&nbsp;self.lastTimestamp&nbsp;?&nbsp;[now&nbsp;timeIntervalSinceDate:self.lastTimestamp]&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!self.lastTimestamp&nbsp;||&nbsp;interval&nbsp;>=&nbsp;5&nbsp;*&nbsp;60) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.lastTimestamp&nbsp;=&nbsp;now; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"Sending&nbsp;current&nbsp;location&nbsp;to&nbsp;web&nbsp;service."); &nbsp;&nbsp;&nbsp;&nbsp;}}@end
随时随地看视频慕课网APP

相关分类

iOS
我要回答