高德使用中的问题

定位和地图几乎是每个软件要用到得,在百度和高德直接,小编今天用到的是高德。在使用中也遇到了很多问题,现在就把整个过程和遇到的问题都罗列出来。

1.首先得下载他的SDK,就需要自己注册下载,其次就是得配置KEY。这里要用到Bundle identifie,有两种方式:一是,直接到工程的Gener下面看,二是通过代码,

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

2.就是导入SDK,也有两种方式:一是直接Pod,省去一些麻烦的操作。二是通过手动,这里就自己在文档里看咯。

3.导入成功后就#import头文件到工程了,在Appdelegate里添加KEY,[AMapLocationServices sharedServices].apiKey = MAPKEY;(注:别忘了在info里配置几个东西哦,NSLocationWhenInUseUsageDescription,NSLocationAlwaysUsageDescription,NSAppTransportSecurity

这里小编就自嘲一下了,这几部只是导入SDK并没进行定位的操作,小编就开始运行了,进到界面并没定位的提醒,小编很纠结,到处找错误,结果最后发现都没进行操作咋可能有东西呢,哎,,,,,,

4.所以继续操作了,开始定位了,定位这里有几种方式,分别是:持续定位,一次性定位和后台定位。

(1)持续定位

实现持续定位的步骤如下:

1.初始化 AMapLocationManager 对象,并设置代理。

1
2
3
4
5
- (void)viewDidLoad
{
    self.locationManager = [[AMapLocationManager alloc] init];
    self.locationManager.delegate = self;
}

2.调用 AMapLocationManager 的 startUpdatingLocation 开启持续定位。

1
[self.locationManager startUpdatingLocation];

若想停止持续定位,调用 AMapLocationManager 的 stopUpdatingLocation 方法,代码如下:

1
[self.locationManager stopUpdatingLocation];

3.实现 AMapLocationManagerDelegate 代理中的 amapLocationManager:didUpdateLocation: 方法,处理位置更新。

1
2
3
4
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location
{
    NSLog(@"location:{lat:%f; lon:%f; accuracy:%f}", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);
}

    

 (2)一次定位

iOS 定位 SDK 提供了适配 iOS6 - iOS9 系统的一次定位功能,并在联网的情况下,可返回该定位点的位置信息(包括:省、市、区/县以及详细地址),是相当全面的一次定位功能。

一次定位功能采用 block 形式,区别于连续定位的方法,无需设置代理和实现代理方法,用起来更容易。

步骤如下:

1.设置定位精度。

提示:采用默认的定位精度(kCLLocationAccuracyBest),获取到的定位点偏差较小,但是请求耗时较多(10s左右),建议按照业务需求设置定位精度,推荐:kCLLocationAccuracyHundredMeters,偏差在100米以内,耗时在2-3s。

1
2
// 带逆地理信息的一次定位(返回坐标和地址信息)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];

2.调用 AMapLocationManager 的 requestLocationWithReGeocode:completionBlock: 方法,请求一次定位。您可以选择是否在一次定位时,是否返回地址信息(需要联网)。

以请求带逆地理信息的一次定位为例,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 带逆地理(返回坐标和地址信息)
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
         
        if (error)
        {
            NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
             
            if (error.code == AMapLocatingErrorLocateFailed)
            {
                return;
            }
        }
         
        NSLog(@"location:%@", location);
         
        if (regeocode)
        {
            NSLog(@"reGeocode:%@", regeocode);
        }
    }];

提示:将以上代码中的YES改成NO,则不会返回地址信息

(3)后台定位

iOS 定位 SDK提供后台持续定位的能力,即便你的app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。

该功能适用于记轨迹录或者出行类App司机端。

步骤:

1.将 info.plist 的字段改成 NSLocationAlwaysUsageDescription 字段。

2.配置工程,依次执行:

a)左侧目录中选中工程名,开启 TARGETS->Capabilities->Background Modes

b)在 Background Modes中勾选 Location updates,如下图所示:

backgroundlocation

3.保持程序持续定位状态,代码如下:

1
2
3
4
5
6
7
//设置允许后台定位参数,保持不会被系统挂起
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
 
[self.locationManager setAllowsBackgroundLocationUpdates:YES];//iOS9(含)以上系统需设置
 
//开始持续定位
[self.locationManager startUpdatingLocation];

4.在回调函数中,获取定位坐标,进行业务处理。

1
2
3
4
5
6
- (void)amapLocationManager:(MALocationManager *)manager didUpdateLocation:(CLLocation *)location
{
    NSLog(@"location:{lat:%f; lon:%f; accuracy:%f}", location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);
 
     //业务处理
}

注意:别忘了在定位的时候开启模拟器的locatio中得custom哟,不然一直没反应额。。。。。。。

 

 

posted @ 2015-12-05 16:31  哈哈你叫  阅读(7093)  评论(0编辑  收藏  举报