定位和地圖幾乎是每個軟件要用到得,在百度和高德直接,小編今天用到的是高德。在使用中也遇到了很多問題,現在就把整個過程和遇到的問題都羅列出來。
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,如下圖所示:

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喲,不然一直沒反應額。。。。。。。
