CLLocation Manager代表未被调用?

时间:2017-03-09 11:40:35

标签: ios objective-c cllocation

我制作了一个获取当前位置的演示。 我已将.GPX文件用于我当前的位置。 我使用了CLLocation Method的Delegates方法。

我也使用Key"隐私 - 使用时的位置使用说明"在我的plist文件中。

我知道这个问题已经问了很多次但是无法得到结果。

代码是

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

@interface ViewController ()<CLLocationManagerDelegate,MKMapViewDelegate>

@property (nonatomic,assign)CLLocationCoordinate2D cordinateLocation;
@property (nonatomic,strong)MKPointAnnotation *point;
@property (nonatomic,weak)IBOutlet MKMapView *mapView;

@end

@implementation ViewController
CLLocationManager *locationManager;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
locationManager = [[CLLocationManager alloc]init];
  locationManager.delegate = self;
    self.mapView.delegate = self;
    [self updateCurrentLocation];
}

- (void)updateCurrentLocation {

    locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;

    if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [locationManager requestWhenInUseAuthorization];
    }

    [locationManager startUpdatingLocation];
}

//-(void)getCurrentLocation
//{
//    [locationManager requestWhenInUseAuthorization];
//    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//    [locationManager startUpdatingHeading];
//    [locationManager startUpdatingLocation];
//
//}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);

    UIAlertController *errorAlert =[UIAlertController alertControllerWithTitle:@"Error" message:@"error reported" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *alertStyle = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];

    [errorAlert addAction:alertStyle];

}


- (void)locationManager:(CLLocationManager *)manager  didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    CLLocation *updatedLocation  = [locations lastObject];
    if(updatedLocation != nil)
    {
        self.cordinateLocation=CLLocationCoordinate2DMake(updatedLocation.coordinate.latitude, updatedLocation.coordinate.longitude);
        [manager stopUpdatingLocation];
          [self setCurrentLocationFocus];
    }
    else{
        NSLog(@"Can't access desire location");
    }
}

-(void)setCurrentLocationFocus{

    MKCoordinateRegion region;
    region.center = self.cordinateLocation;
    //Adjust span as you like
    MKCoordinateSpan span;
    span.latitudeDelta  = 1;
    span.longitudeDelta = 1;
    region.span = span;
    [self.mapView setRegion:region animated:YES];

    ///Drop the pin on Current Locatio ////
    self.point = [[MKPointAnnotation alloc] init];
    self.point.coordinate = self.cordinateLocation;
    self.point.title = @"FlockStation";
    self.point.subtitle = @"It Department";
    [self.mapView addAnnotation:self.point];

    //set a new camera angle
    MKMapCamera *newCamera=[[MKMapCamera alloc] init];
    [newCamera setCenterCoordinate:self.cordinateLocation];
    [newCamera setPitch:60.0];    ///For zooming purpose///
    [newCamera setHeading:90];    ///For Compass Purpose ///
    [newCamera setAltitude:100.0]; ///On which height you want to see your map ///
    [self.mapView setCamera:newCamera animated:YES];
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *viewController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"NewViewController"];
    [self presentViewController:viewController animated:YES completion:nil];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
  //  self.updatedHeading.text = [NSString stringWithFormat:@"%f",newHeading.magneticHeading];
}

帮助我们找不到位置。因为委托方法没有调用。

每次调用此方法。

- (void)locationManager:(CLLocationManager *)manager didFailWithError:`(NSError *)error

2 个答案:

答案 0 :(得分:1)

您需要检查位置许可。然后你可以调用委托方法。

   - (void)viewDidLoad {

    [super viewDidLoad];

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

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        [locationManager requestWhenInUseAuthorization];
    }
    if ([CLLocationManager locationServicesEnabled]){

        NSLog(@"Location Services Enabled");

        if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied){
            alert = [[UIAlertView alloc] initWithTitle:@"Permission Denied"
                                               message:@"To re-enable, please go to Settings and turn on Location Service for this app."
                                              delegate:nil
                                     cancelButtonTitle:@"OK"
                                     otherButtonTitles:nil];
            [alert show];
        }
    }
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CLLocation *currentLocation = newLocation;
    txtlocations.text = [NSString stringWithFormat:@"%f & %f",currentLocation.coordinate.latitude, currentLocation.coordinate.longitude];
}

答案 1 :(得分:0)

尝试使用您的代码进行少量更改并且工作正常。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self updateCurrentLocation];
}

- (void)updateCurrentLocation {

    if([CLLocationManager locationServicesEnabled] &&
       [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied) {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate=self;
        locationManager.desiredAccuracy=kCLLocationAccuracyBest;
        locationManager.distanceFilter=kCLDistanceFilterNone;
        [locationManager requestWhenInUseAuthorization];
        [locationManager startMonitoringSignificantLocationChanges];
        [locationManager startUpdatingLocation];
        // show the map
    } else {
        // show error



    }
}