如何在iOS应用程序中每n分钟更新一次背景位置?我正在寻找一种方法,以获得一个背景位置更新每n分钟在我的iOS应用程序。我使用的是iOS 4.3,这个解决方案应该适用于非越狱iPhone。我尝试/考虑了以下选择:CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges:根据配置的属性在后台按预期工作,但似乎不可能强迫它每n分钟更新一次位置。NSTimer:应用程序在前台运行时是否工作,但似乎不是为后台任务设计的本地通知:本地通知可以每n分钟调度一次,但是不可能执行一些代码来获得当前位置(用户不必通过通知启动应用程序)。这种方法似乎也不是一种干净的方法,因为这不是应该使用的通知。UIApplication:beginBackgroundTaskWithExpirationHandler据我所知,当一个应用程序被移到后台而不是实现“长期运行”后台进程时,应该使用它来完成背景中的一些工作(也是有限的时间)。如何实现这些定期的背景位置更新?
3 回答
隔江千里
TA贡献1906条经验 获得超10个赞
指定 location background mode
创建一个 NSTimer
在背景中 UIApplication:beginBackgroundTaskWithExpirationHandler:
什么时候 n
是 较小
比 UIApplication:backgroundTimeRemaining
一切都会好起来的。什么时候 n
是 更大
, location manager
在没有时间避免后台任务被杀死之前,应该再次启用(并禁用)。
这是因为位置是允许的三种背景执行类型之一。.
注意:我浪费了一些时间在模拟器中测试它不起作用。然而,它在我的手机上工作得很好。
慕田峪4524236
TA贡献1875条经验 获得超5个赞
转到Project->Capability->后台模式->选择位置更新 转到Project->Info->添加一个键NSLocationAlwaysUsageDescription和空值(或者任意文本) 要使位置在后台工作,并将坐标发送到Web服务或每5分钟对它们执行任何操作,请按照下面的代码执行。
@interface LocationManager () <CLLocationManagerDelegate>@property (strong, nonatomic) CLLocationManager *locationManager; @property (strong, nonatomic) NSDate *lastTimestamp;@end@implementation LocationManager+ (instancetype)sharedInstance{ static id sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; LocationManager *instance = sharedInstance; instance.locationManager = [CLLocationManager new]; instance.locationManager.delegate = instance; instance.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // you can use kCLLocationAccuracyHundredMeters to get better battery life instance.locationManager.pausesLocationUpdatesAutomatically = NO; // this is important }); return sharedInstance;}- (void)startUpdatingLocation{ CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; if (status == kCLAuthorizationStatusDenied) { NSLog(@"Location services are disabled in settings."); } else { // for iOS 8 if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [self.locationManager requestAlwaysAuthorization]; } // for iOS 9 if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { [self.locationManager setAllowsBackgroundLocationUpdates:YES]; } [self.locationManager startUpdatingLocation]; }}- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ CLLocation *mostRecentLocation = locations.lastObject; NSLog(@"Current location: %@ %@", @(mostRecentLocation.coordinate.latitude), @(mostRecentLocation.coordinate.longitude)); NSDate *now = [NSDate date]; NSTimeInterval interval = self.lastTimestamp ? [now timeIntervalSinceDate:self.lastTimestamp] : 0; if (!self.lastTimestamp || interval >= 5 * 60) { self.lastTimestamp = now; NSLog(@"Sending current location to web service."); }}@end
- 3 回答
- 0 关注
- 578 浏览
添加回答
举报
0/150
提交
取消