在 iOS 8 中在计时器/定期更新背景中的位置
Posted
技术标签:
【中文标题】在 iOS 8 中在计时器/定期更新背景中的位置【英文标题】:updating location in background on a timer/periodically in iOS 8 【发布时间】:2014-09-22 18:25:54 【问题描述】:如果应用程序处于后台状态或前台状态,我希望每 5 分钟更新一次用户的位置。这是一个对位置非常敏感的应用程序,因此随时了解位置至关重要。
在 SO 上有很多与这个问题相关的答案,但其中很多都是针对 ios 6 及更早版本的。在 iOS 7 之后,很多后台任务都发生了变化,我很难找到在后台实现定期位置更新的方法。
【问题讨论】:
【参考方案1】:您需要使用 CoreLocation 的委托。获得坐标后,立即停止 CoreLocation,设置一个计时器以在 5 分钟内重新启动它。
在 iOS 8 中,您需要为 NSLocationWhenInUseUsageDescription 和/或 NSLocationAlwaysInUseDescription 设置一个 plist 条目。
Apple 文档非常清楚地说明了如何执行所有这些操作。
-(void)startUpdating
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[self.locationManager startUpdatingLocation];
-(void)timerFired
[self.timer invalidate];
_timer = nil;
[self.locationManager startUpdatingLocation];
// CLLocationDelegate
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
if(locations.count)
// Optional: check error for desired accuracy
self.location = locations[0];
[self.locationManager stopUpdatingLocation];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60 * 5 target:self selector:@selector(timerFired) userInfo:nil repeats:NO];
【讨论】:
应用进入后台后是否还能继续工作? 有些模式是的。阅读文档。 我注意到[self.locationManager stopUpdatingLocation]
出现了两次,timerFired 方法应该是[self.locationManager startUpdatingLocation]
吗?我相信self.location = [locations lastObject]
更合适,因为最后一个对象总是最新的。最后,你能解释一下为什么会调用定时器失效逻辑吗?
是的,这是一个错字(开始/停止),现在已编辑/修复。计时器无效阻止它再触发。这只是清理。由于该参数设置为 NO,因此它不会执行任何操作,因为它是在计时器触发后调用的。您可能会删除它。 lastObject 可以正常工作。这个委托经常触发,我怀疑你在 [0] 和 [last] 之间会有很大的区别。
当应用程序进入后台并被iOS挂起时,定时器将暂停,位置管理器不会唤醒应用程序并提供位置更新,是这样吗?【参考方案2】:
apple documentation 上有很多关于此的信息。
此外,还有一些额外的答案 here 和 here 以及来自 *** 的先前答案。里面似乎有足够的信息可以帮助你!
【讨论】:
这两个答案都在 iOS 8 之前,其中一些方法已被弃用。 它们旨在帮助您朝着正确的方向前进。当您有问题时,文档应该在那里帮助您提供您需要的任何信息。 Apple 的文档中有大量关于后台运行的应用程序的信息,您应该阅读这些信息。以上是关于在 iOS 8 中在计时器/定期更新背景中的位置的主要内容,如果未能解决你的问题,请参考以下文章