如何在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 关注
- 708 浏览
添加回答
举报
0/150
提交
取消
