在 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 中在计时器/定期更新背景中的位置的主要内容,如果未能解决你的问题,请参考以下文章

iOS解决应用进入后台后计时器和位置更新停止的问题

IOS - 如何在滚动元素时更新元素的界面?

在 iOS 后台更新位置

iOS 8 后台应用程序位置

在 iOS 上不断跟踪用户位置

当应用程序进入和退出后台时更新ios中的计时器