gpt4 book ai didi

iphone - CLLocationmanager 有时会卡住

转载 作者:行者123 更新时间:2023-11-28 17:37:45 25 4
gpt4 key购买 nike

我正在开发一个定期获取用户位置的应用程序。最大的问题是有时应用程序会卡住,不再提供更新。即使我(终止并)重新启动我的应用程序,也没有任何改变。 (为位置管理器设置的精度值接近 100-200 米。)但是,当我启动谷歌地图应用程序时,它会在几秒钟内获得一个非常准确的位置(如果我切换回来,它会传送到我的应用程序)。为什么 ?以下是一些相关的代码部分:

timerFiredAction 由定时器周期性调用。

-(void) timerFiredAction
{
if (isStillWaitingForUpdate)
{
successiveTimerActivationCount ++;
// force LM restart if value too big , e.g. 30 ( stop + start )
return;
}
successiveTimerActivationCount = 0 ;
isStillWaitingForUpdate = YES;
/* isRecordingX is always true */
if (isSignificant && isRecordingSig) [self startSignificant ];
if (isGPS && isRecordingGPS) [self startGps];
}

// this is called in delegate method only
-(void) timerStopLocationServices
{
isStillWaitingForUpdate = NO;
if (isGPS) [ self stopGps] ;
if (isSignificant) [self stopSignificant];
}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// verify accuracy and stuff
if ( isStillWaitingForUpdate && _other_validations_ )
{
// store it
[self timerStopLocationServices] ;

}

}

start 和 stop 方法简单地验证 locationmanager 是否为 nil,如果是,它们调用 createManager 然后调用 start & stopUpdatingLocation。

LM 的创建看起来像这样:

-(void)createManager
{
@synchronized (self)
{
if (locationManager != nil) {
[self releaseManager]; // stop timer, stop updating , reelase previous if exists
}
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
double desired;
// accuracy is an init param, snap to one smaller constant
// generally 100-200
if (accuracy >= kCLLocationAccuracyThreeKilometers) desired = kCLLocationAccuracyThreeKilometers; else
if (accuracy >= kCLLocationAccuracyKilometer) desired = kCLLocationAccuracyKilometer; else
if (accuracy >= kCLLocationAccuracyHundredMeters) desired = kCLLocationAccuracyHundredMeters; else
if (accuracy >= kCLLocationAccuracyNearestTenMeters) desired = kCLLocationAccuracyNearestTenMeters; else
if (accuracy >= kCLLocationAccuracyBest) desired = kCLLocationAccuracyBest; else
if (accuracy >= kCLLocationAccuracyBestForNavigation) desired = kCLLocationAccuracyBestForNavigation;

locationManager.desiredAccuracy = desired;
locationManager.distanceFilter = distanceFilter;
}
}

有人遇到过这样的事情吗?欢迎任何想法:)谢谢!

最佳答案

我至少可以确认“被屏蔽的位置管理器”,尽管在稍微不同的上下文中:

根据我的经验,如果您创建了两个具有不同精度设置的位置管理器,同时为两者启动更新,然后仅停止对精度要求更高的一个的更新,那么另一个将不再接收任何更新。

您显然只使用了一个管理器,但您的管理器卡住的方式似乎是相同的:在上述情况下,也可以使用 map 应用程序(或任何类似应用程序)重新启动更新。

我的解决方法如下:每当我停止一个管理器时,我也会重置所有其他管理器的距离过滤器(存储在名为 myCLLocationManagersNSSet 中),如下所示:

   CLLocationManager * lm; 
CLLocationDistance tmp;
for (lm in myCLLocationManagers){
tmp=lm.distanceFilter;
lm.distanceFilter=kCLDistanceFilterNone;
lm.distanceFilter=tmp;
}

这似乎比我之前的解决方法(停止并重新启动管理器)更可靠。

请注意 kCLLocationAccuracyBestForNavigationkCLLocationAccuracyBest 是(当前)负值,一般来说,您不应该依赖所有这些常量的特定值 - 没有保证 kCLLocationAccuracyHundredMeters==100(尽管目前为真)。我之所以提到这一点,是因为您似乎是在直接比较以米为单位的“精度”变量与这些常量。

关于iphone - CLLocationmanager 有时会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9309238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com