CLLocationManager startUpdatingLocation不调用locationManager:didUpdateLocations:或locationManager:didFailWithError:

时间:2014-09-18 15:32:11

标签: ios objective-c cllocationmanager

我尝试在我的iOS项目中使用CLLocationManager框架来访问用户的位置,但是当我打电话时

[locationManager startUpdatingLocation]

locationManager:didUpdateLocations:locationManager:didFailWithError:都没有被调用。

//myViewController.h
@interface myViewController : UITableViewController <CLLocationManagerDelegate>
@end

//myViewController.m
@implementation myViewController{
    CLLocationManager *locationManager;
}

//edit
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
}
//finish edit

-(void)getLocation
{
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
UIAlertView *errorAlert = [[UIAlertView alloc]
                           initWithTitle:@"Error" 
                                 message:@"Failed to Get Your Location"              
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                      otherButtonTitles:nil];
[errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations[[locations count] -1];
    CLLocation *currentLocation = newLocation;
    NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];

if (currentLocation != nil) {
   NSLog(@"latitude: %@", latitude);
   NSLog(@"longitude: @"%@", longitude);
}else {
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" 
                                                     delegate:nil 
                                            cancelButtonTitle:@"OK" 
                                            otherButtonTitles:nil];
    [errorAlert show];
}

}
@end

尽管在文档中说明了,但是没有调用委托方法:

&#34;此方法立即返回。调用此方法会导致位置管理器获取初始位置修复(可能需要几秒钟)并通过调用其locationManager:didUpdateLocations:方法[...]通知您的委托除了实现{{1}的委托对象之外方法,它还应该实现locationManager:didUpdateLocations:方法来响应潜在的错误。&#34;

不知道如何调试此问题。

谢谢,

JA

8 个答案:

答案 0 :(得分:89)

enter image description here只需在info.plist

中添加

NSLocationAlwaysUsageDescription ---我需要位置

NSLocationWhenInUseUsageDescription ---我需要位置

隐私 - 位置使用说明---我需要位置

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate=self;
  locationManager.desiredAccuracy=kCLLocationAccuracyBest;
  locationManager.distanceFilter=kCLDistanceFilterNone;
  [locationManager requestWhenInUseAuthorization];
  [locationManager startMonitoringSignificantLocationChanges];
  [locationManager startUpdatingLocation];

现在它肯定会调用你的didUpdateToLocation。

了解更多详情click here

答案 1 :(得分:13)

从iOS 8开始,位置服务的工作方式略有不同。

主要是,您需要在 Info.plist 文件中添加密钥NSLocationWhenInUseUsageDescription,并添加说明您的应用需要定位的原因,例如“需要的位置...”

请注意,您可能还需要检查iOS版本。只有iOS 8及更高版本才能让位置管理员收听requestWhenInUseAuthorization电话。

以下链接显示了更多详细信息: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

祝你好运!

答案 2 :(得分:10)

您需要检查是否在主线程上初始化CLLocationManager。 在其他情况下,您将无法获得updateLocation事件。

我无法在Apple文档中找到此类信息,但无论如何它都适用于我。

答案 3 :(得分:5)

使用iOS 8.0,您需要先致电-[CLLocationManager requestWhenInUseAuthorization ]-[CLLocationManager requestAlwaysAuthorization],以便系统要求用户授予您的应用使用该位置的权限。

答案 4 :(得分:4)

您需要在项目中添加以下内容,

  1. 在项目的plist中添加以下内容:

    1. Key: NSLocationAlwaysUsageDescription Type:String
    2. Key: NSLocationWhenInUseUsageDescription Type:String
  2. [locationManager startUpdatingLocation]的.m文件中添加以下条件:

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
         [locationManager requestAlwaysAuthorization];`
    
  3. 然后只会调用您的CLLocationManager委托方法。

答案 5 :(得分:1)

我认为您应该检查此链接。在声明时,您没有保留位置管理器对象。

请给你物业物 @property(非原子,强)

Why the CLLocationManager delegate is not getting called in iPhone SDK 4.0?

答案 6 :(得分:0)

我的代码库中有以下内容:

<div ng-show='show'>
    <div>Visible element</div>

</div>

<div ng-hide='show'>
    <div>Hidden Element</div>
</div>
<button ng-click='toggle()'> Toggle </button>

事实证明这是在无限循环中调用的,因为初始化一个locationManager由于某种原因触发了这个方法?我没有意识到这一点。当授予权限时,我已经把它放在那里。相反,我设置了一个位置管理器并开始更新位置,但随后将其触发并将其替换为不更新位置的位置管理器,并且一遍又一遍地循环。

我的解决方案就是将-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if( status == kCLAuthorizationStatusAuthorizedAlways ) { _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; _locationManager.distanceFilter = 200; } } 添加到if条件中。

答案 7 :(得分:0)

因此,如果您在模拟器中运行,请不要忘记在模拟器菜单中设置位置。看起来好像是否将其设置为none,那么在委托中什么也不会被调用...我不确定这是否也可以在真实设备上发生,但可能是特定于模拟器的。