当 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 App:当App在后台运行时发送警报消息?

当应用程序在 iPhone sdk 中进入后台时加载根视图

如何在后台应用程序和iphone重启时使用ibeacon[关闭]

当应用程序处于后台模式时,是不是可以在 iPhone 中闪烁手电筒?

iPhone:当应用程序移至后台时播放声音