当 iphone 在后台时使用 CLLocationManager 将位置发送到服务器
Posted
技术标签:
【中文标题】当 iphone 在后台时使用 CLLocationManager 将位置发送到服务器【英文标题】:Sending location to server with CLLocationManager when iphone is in background 【发布时间】:2011-11-21 14:44:19 【问题描述】:当应用程序位于后台时,我无法发送我的位置。我正在使用 CLLocationManager 和 startMonitoringSignificantLocationChanges。位置 didUpdateToLocation 委托方法执行一次,但不会更多。我试着四处走走,但没有新的位置发送到服务器。
我在 info.plist 文件中设置了“必需的后台模式”->“应用程序注册位置更新”。
有人知道可能出了什么问题吗?
跟踪开始的代码:
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = appDelegate;
[appDelegate setLocationManager:locationManager withDistanceFilter:kCLDistanceFilterNone];
[appDelegate.theLocationManager startMonitoringSignificantLocationChanges];
代码(来自 CLLocationManagerDelegate):
- (void)setLocationManager:(CLLocationManager*)locationManager withDistanceFilter:(CLLocationDistance)distanceFilter
// create a new manager and start checking for sig changes
self.theLocationManager.delegate = nil;
[theLocationManager release];
self.theLocationManager = locationManager;
self.theLocationManager.delegate = self;
self.theLocationManager.distanceFilter = distanceFilter;
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *oldLocationTimestamp = oldLocation.timestamp;
int locationUpdateInterval = 15;//15 sec
if (!([newLocationTimestamp timeIntervalSinceDate:oldLocationTimestamp] < locationUpdateInterval))
//NSLog(@"New Location: %@", newLocation);
[self updateToLocation:newLocation];
- (void)updateToLocation:(CLLocation *)newLocation
NSLog(@"update location!!");
NSString *latitude = [NSString stringWithFormat:@"%f", [newLocation coordinate].latitude];
NSString *longitude = [NSString stringWithFormat:@"%f", [newLocation coordinate].longitude];
[currentUser updatePositionWithLongitude:longitude andLatitude:latitude];
【问题讨论】:
你走了多远?根据您所在的位置,您可能需要走更远的距离 嗯,不远了..我会尝试通过走得更远来测试它。 1公里左右就足够了? 也许只是将startMonitoringSignificantLocationChanges
换成startUpdatingLocation
看看它是否按预期运行......然后你将排除其他地方的问题
根据我的阅读,一个很大的依赖是手机信号塔的密度,所以如果你在市区,1公里可能就足够了,但如果你在更偏远的地区,这可能还不够
好的,我会尝试走更长的时间......
【参考方案1】:
就像 Bill Brasky 所说,您设置位置管理器的准确度可能没有记录您步行的距离。尝试将您的位置管理器准确度设置得更高,看看是否有效,然后将其调回准确度和电池效率之间的满意中间值。只是为了测试,一路向上:
[appDelegate.theLocationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
然后代替:
[appDelegate.theLocationManager startMonitoringSignificantLocationChanges];
尝试:
[appDelegate.theLocationManager startUpdatingLocation];
【讨论】:
谢谢,我现在正在使用 startUpdatingLocation,它按预期工作。由于电池效率的原因,我仍然需要稍微调整一下,但我最终会做对的 :)【参考方案2】:-startMonitoringForSignificantLocationChanges 与手机信号塔连接直接相关。您可能需要行驶数英里才能连接到新塔并触发位置更改事件。我知道区域监控更准确,因为它使用来自 Wifi、手机信号塔甚至其他查询位置的应用程序的位置更新。您将需要弄清楚您需要应用程序的准确性和频率。您可能需要在后台主动监控位置(这肯定是电池杀手)。希望这会有所帮助。
【讨论】:
以上是关于当 iphone 在后台时使用 CLLocationManager 将位置发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章
在iphone应用程序方面,当后台应用程序恢复活动时自动重新加载显示页面的方式
如何在后台应用程序和iphone重启时使用ibeacon[关闭]