使用苹果原生MapKit定位

使用地图控件

新建项目,在StoryBoard中拖入一个MapKit View

直接运行,会报错

'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named MKMapView'

原因:没有导入MapKit框架
点击项目->General->Targets->Linked Framework and Libraries
加入 MapKit.framework框架,运行成功

MapKit默认使用高德地图

使用苹果原生MapKit定位_第1张图片

显示用户的位置

显示用户的信息,需要设置追踪模式
三种追踪模式:

typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
    MKUserTrackingModeNone = 0, // 不追踪
    MKUserTrackingModeFollow, // 追踪              
    MKUserTrackingModeFollowWithHeading, // 追踪位置和方向
} NS_ENUM_AVAILABLE(NA, 5_0);

viewController.m

#import "ViewController.h"
#import 

@interface ViewController () 

// 地图
@property (weak, nonatomic) IBOutlet MKMapView *mapKit;

// 这个属性主要用来请求权限
@property (strong, nonatomic) CLLocationManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 设置追踪模式
    self.mapKit.userTrackingMode = MKUserTrackingModeFollow;
    
    // 请求权限
    // 这个方法是ios8推出的,ios7没有这个方法,在ios7上执行这个方法会出错!
    // 通过检查是否存在这个方法就可以判断是ios7还是ios8
    if ([self.mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.mgr requestAlwaysAuthorization];
    }
}

#pragma mark - 懒加载
- (CLLocationManager *)mgr {
    if (_mgr == nil) {
        _mgr = [[CLLocationManager alloc] init];
    }
    return _mgr;
}
@end

运行,会出现以下提示:

Trying to start MapKit location updates without prompting for location authorization. Must call [CLLocationManager requestWhenInUseAuthorization] or [CLLocationManager requestAlwaysAuthorization] first.

原因:ios8访问用户的位置信息,需要用户的授权。
在info.plist中,添加一个字段NSLocationAlwaysUsageDescription,它的值就是请求授权时候的描述信息,可以设置也可以为空。
当程序请求用户授权时,会显示的相应的描述信息。

使用苹果原生MapKit定位_第2张图片

点击允许,就开始定位了!

使用苹果原生MapKit定位_第3张图片

显示位置信息

设置代理,实现代理方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    
    // 反地理编码;根据经纬度查找地名
    [geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {
        if (placemarks.count == 0 || error) {
            NSLog(@"找不到该位置");
            return;
        }
        
        // 当前地标
        CLPlacemark *pm = [placemarks firstObject];
        
       // 区域名称
        userLocation.title = pm.locality;
       // 详细名称
        userLocation.subtitle = pm.name;
    }];
}

使用苹果原生MapKit定位_第4张图片

你可能感兴趣的:(使用苹果原生MapKit定位)