使用iOS MapKit无法获取用户位置

时间:2014-11-12 07:07:13

标签: ios objective-c xcode6 mapkit

让用户定位工作一直在扼杀我......

我已经阅读了很多线程,解释了iOS 8的新变化以及info.plist文件中必须有两个密钥(NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription)之一的顺序应用程序请求获取用户位置的权限。我做到了。

enter image description here

我还包括了我相信作为位置服务工作所需的所有代码......但它并没有。请参阅下面的mapViewController.h和mapViewController.m文件:

mapViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <MapKit/MKAnnotation.h>

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

@interface mapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property(nonatomic, retain) IBOutlet MKMapView *mapView;
@property(nonatomic, retain) CLLocationManager *locationManager;

@end

mapViewController.m

#import "mapViewController.h"

@interface mapViewController ()

@end

@implementation mapViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.mapView.delegate = self;
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER) {
        // Use one or the other, not both. Depending on what you put in info.plist
        //[self.locationManager requestWhenInUseAuthorization];
        [self.locationManager requestAlwaysAuthorization];
    }
#endif
    [self.locationManager startUpdatingLocation];

    self.mapView.showsUserLocation = YES;
    [self.mapView setMapType:MKMapTypeStandard];
    [self.mapView setZoomEnabled:YES];
    [self.mapView setScrollEnabled:YES];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];

    self.locationManager.distanceFilter = kCLDistanceFilterNone; //Whenever we move
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
    NSLog(@"%@", [self deviceLocation]);

    //View Area
    MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } };
    region.center.latitude = self.locationManager.location.coordinate.latitude;
    region.center.longitude = self.locationManager.location.coordinate.longitude;
    region.span.longitudeDelta = 0.005f;
    region.span.longitudeDelta = 0.005f;
    [self.mapView setRegion:region animated:YES];

}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 800, 800);
    [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];
}
- (NSString *)deviceLocation {
    return [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude];
}
- (NSString *)deviceLat {
    return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.latitude];
}
- (NSString *)deviceLon {
    return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.longitude];
}
- (NSString *)deviceAlt {
    return [NSString stringWithFormat:@"%f", self.locationManager.location.altitude];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

此外,如果这是相关的,mapViewController将绑定到选项卡视图控制器中的选项卡。当我单击包含包含MKMapView的视图控制器的选项卡时,我得到以下图像:

enter image description here

3 个答案:

答案 0 :(得分:0)

使用此代码并在设备中运行应用程序以获取当前位置。 如果你在模拟器中运行,那么它将显示默认位置,即Apple Inc的地址作为当前位置。

- (void)viewDidLoad
{ 
  [super viewDidLoad];
  self.locationManager = [[CLLocationManager alloc] init];
  [self.locationManager setDelegate:self ];
  self.mapView.showsUserLocation=YES;
  [self.locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation: (CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
  [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES];
  MKCoordinateRegion   region=MKCoordinateRegionMakeWithDistance(newLocation.coordinate,70000 ,70000 );
  MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
  [self.mapView setRegion:adjustedRegion animated:YES];
}

注意:  打开设备中的数据或wifi,否则您将面临位置准确性错误。

答案 1 :(得分:0)

将以下代码添加到ViewController.h类

@interface ViewController : UIViewController<CLLocationManagerDelegate>

@property(nonatomic, retain) CLLocationManager *locationManager;
@end

在ViewController.m类中,

-(void)viewWillAppear:(BOOL)animated{
self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
[super viewWillAppear:animated];



}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    CLLocationCoordinate2D zoomLocation = CLLocationCoordinate2DMake(newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}

答案 2 :(得分:0)

根据文档,[self.locationManager requestAlwaysAuthorization]是异步的。实现位置服务auth更改委托回调并仅在允许auth状态后才开始监视。