Baidu 地图 SDK 的使用(二)---一行代码实现定位

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

昨天实现了加载地图视图的功能
但是会发现一个问题, 那就是:

控制器既加载地图, 又请求定位, 今后很可能还要规划路径, 自定义大头针等等

很显然, 控制器即将沦为一个 胖控制器, 这是我们不愿意看到的

而且, 有这样一种可能, 在不同的控制器里, 都有可能要调用地图, 那么我们就可以封装一个地图管理类, 将地图相关的内容都封装到这个管理类里, 当我们需要用到地图的时候, 就去找这个管理类, 就像这样

Baidu 地图 SDK 的使用(二)---一行代码实现定位_第1张图片
地图管理类
管理类的单例代码
#import "BaiduMapManager.h"
@interface BaiduMapManager ()
@end
@implementation BaiduMapManager
#pragma mark *** 设置一个单例 ***
+ (instancetype)sharedManager
{
    static id manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[BaiduMapManager alloc]init];
    });
    return manager;
}

从上图可以看到, 我还封装了一个管理类的分类, 这样管理类的可延展性就更好了, 需要加模块的时候, 就加一个分类就可以了

我已经把昨天的加载地图的代码封装好了, 今天的重点是定位, 那么, 定位需要几个什么步骤呢?

  • info.plist 文件的配置(其实昨天就已经配置好了)

开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述

配置好了之后, 系统会在 APP 第一次启动时, 提示用户授权允许定位

Baidu 地图 SDK 的使用(二)---一行代码实现定位_第2张图片
提示用户授权允许定位
  • 初始化BMKLocationService(这是开启定位的关键类)
    • 初始化
    • 开启定位服务
- (BMKLocationService *)locationService
{
    if (!_locationService) {
        _locationService = [[BMKLocationService alloc]init];
        [_locationService startUserLocationService];
    }
    return _locationService;
}
  • 设置locationService的代理
- (void)startLoacation
{
     /* 设置代理 */
    kBaiduMapManager.locationService.delegate = self;
}
  • 完成代理的回调
    • 这个代理 API 就是当用户位置发生变化的时候调用
    • 将用户位置更新到地图视图上
    • 更改地图视图的追踪模式为跟随
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    [kBaiduMapManager.mapView updateLocationData:userLocation];
     /* 地图比例尺级别,在手机上当前可使用的级别为3-21级 */
    kBaiduMapManager.mapView.zoomLevel = 15;
    kBaiduMapManager.mapView.userTrackingMode = BMKUserTrackingModeFollow;
}
  • 我将开始定位的方法封装在BaiduMapManager+location.h中, 这样,外界在需要完成地图定位的时候,就只需要 通过地图管理类的单例 调用startLoacation这一个 API 即可
#pragma mark *** 视图的生命周期 ***
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:kBaiduMapManager.mapView];
}

#pragma mark *** 点击定位按钮触发的事件 ***
- (IBAction)locationBarButtonItemClickAction:(UIBarButtonItem *)sender {
    [kBaiduMapManager startLoacation];
}

让我们来看一下实现的效果
Baidu 地图 SDK 的使用(二)---一行代码实现定位_第3张图片
百度地图定位效果

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

你可能感兴趣的:(Baidu 地图 SDK 的使用(二)---一行代码实现定位)