CLLocation Manager startUpdatingLocation第二次调用时无法正常工作

时间:2013-11-29 13:27:40

标签: ios iphone objective-c cllocationmanager cllocation

您好我正在我的应用中实施位置服务。首先,我必须知道我的坐标,以获得列表中的某些地方与设备之间的距离。然后,如果我进入一个地方,我可以办理登机手续,所以,我需要再次获得坐标,问题就在这里。第二次尝试获取坐标时,方法-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations未被调用..我无法获得新的坐标。

我的经理位于NSObject sublcass中,代码如下:

(id)init {
    if ( self = [super init] ) {
        if ([CLLocationManager locationServicesEnabled])
        {
            locationManager = [[CLLocationManager alloc] init];
            locationManager.delegate = self;
             [locationManager startUpdatingLocation];
        }
    }
    return self;
}

-(void) checkLongLatitudeAgain {
    [locationManager startUpdatingLocation];
}

#pragma mark Delegates de CLLocationManager
//
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
     NSLog(@"LON%f",  manager.location.coordinate.longitude);
    NSLog(@"LAT:%f", manager.location.coordinate.latitude);
    NSTimeInterval howRecentNewLocation = [newLocationeventDate timeIntervalSinceNow];

    if (manager.location.horizontalAccuracy <= 100.0 && howRecentNewLocation < -0.0 && howRecentNewLocation > -20.0){
        //Usar coordenada
        [self.delegate getLocationForCheckIn:manager.location];
        [self stopUpdatingLocation:@"Fins"];
    }
}
// ---------------------------------------------------------------------------------------------------------------------
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    //
    if ([error code] != kCLErrorLocationUnknown) {
        [self stopUpdatingLocation:NSLocalizedString(@"Error", @"Error")];
    }
    //
}
// ---------------------------------------------------------------------------------------------------------------------
- (void)stopUpdatingLocation:(NSString *)state {
    //Detenemos la lectura del GPS
    [locationManager stopUpdatingLocation];
    locationManager.delegate = nil;
    NSLog(@"Stop gps");
    //
}

我在打开地点列表时调用该类,并且当在一个地方内部时,用户按下checkIn按钮。这两次都是用这段代码完成的:

WPLocationManager *location = [[WPLocationManager alloc]init];
[location checkLongLatitudeAgain];

4 个答案:

答案 0 :(得分:4)

您每次都在创建新经理:

WPLocationManager *location = [[WPLocationManager alloc]init];
[location checkLongLatitudeAgain];

新经理未分配给任何代表。

您需要使用您创建并分配给代理人的上一个管理员,例如:

[locationManager checkLongLatitudeAgain];

答案 1 :(得分:0)

您可以查看http://developer.apple.com - https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html

上的文档

您可以查看启动标准位置服务启动重要更改位置服务部分。您必须使用CLLocationManager的startMonitoringSignificantLocationChanges或startUpdatingLocation方法,在某处缓存您的位置并仅在收到新位置时更新它,否则就像文档中所述:“如果已经提供了位置更新,您还可以获得直接来自CLLocationManager对象的最新位置数据,无需等待传递新事件“。

答案 2 :(得分:0)

我不知道你为什么再次启动你的位置经理,即使你有一些如何设法解决当前的问题,但这不是处理基于位置管理的应用程序的正确方法。我以前在工作时遇到了麻烦基于位置的应用程序。基于位置的应用程序的最佳方法是单例。 apple forum discussion

你可以找到 this  和this非常有帮助。

只是一个建议,:) 感谢。

答案 3 :(得分:0)

在iOS8中对我来说,我必须在致电[locationManager stopUpdatingLocation];之前致电[locationManager startUpdatingLocation]以便第二次开始获取更新,这对我有用。