iOS開發之整合高德地圖(一)

YungFan發表於2017-12-13

在iOS開發中,經常會使用到定位和地圖,Apple自帶的定位和地圖應付一般的場景綽綽有餘,但是也缺少一些功能,如POI搜尋、不夠接地氣等。因此作者選擇了高德地圖,這篇文正主要介紹定位功能的整合。

環境:Xcode7.3.1 + iOS 9.3 + 能訪問網路


1、註冊開發者,建立應用

首先註冊成為開發者,成為開發者以後,登入並進入控制檯,然後建立一個iOS應用,注意這一定要填寫好你的 Bundle identifier,不知道的後文有說明怎麼查詢。

  • 進入控制檯

    獲取Key.gif

  • 填寫key的資訊

    填寫key的資訊.png

  • 生成一個key

    申請Key.JPG

2、通過CocoaPods匯入需要的SDK

platform :ios, '9.0' #手機系統版本
target '整合高德地圖' do #新建的Xcode工程名
     pod 'AMapLocation'  #定位 SDK
end

複製程式碼

3、配置Info.plist,新增前後臺定位的授權資訊,到時候會彈出一個對話方塊讓使用者選擇是否同意(iOS8以後必須要新增),可以先只設定NSLocationWhenInUseUsageDescription

NSLocationWhenInUseUsageDescription  表示應用在前臺的時候可以搜到更新的位置資訊。
NSLocationAlwaysUsageDescription  表示應用在前臺和後臺(suspend 或 terminated)都可以獲取到更新的位置資料。
複製程式碼

4、在AppDelegate中初始化key

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//    不知道Bundle identifier的通過如下方式查詢
//    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];  
//    NSLog(@"%@", bundleIdentifier);
    
    [AMapServices sharedServices].apiKey =@"註冊產生的key";
    
    
    return YES;
}
複製程式碼

5、UIViewController程式碼,註釋非常詳細

通過官方文件,我們知道一共有三種定位方式,分別是一次定位、持續定位和後臺定位,分別用三個獨立的方法分開寫了。

#import "ViewController.h"
#import <AMapFoundationKit/AMapFoundationKit.h>

#import <AMapLocationKit/AMapLocationKit.h>

@interface ViewController ()<AMapLocationManagerDelegate>

//定位管理器
@property(nonatomic, strong) AMapLocationManager *locationManager;
//定位回撥次數統計
@property(nonatomic, assign) NSInteger count;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.count = 0;
    
    [self onceLoaction];
    [self alwaysLoaction];
    [self backgroundLoaction];
    
    
}

#pragma mark - 持續定位
-(void)backgroundLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    // 設定代理物件
    self.locationManager.delegate = self;
    // 設定反地理編碼
    self.locationManager.locatingWithReGeocode = YES;
    //iOS9設定後臺定位
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
        self.locationManager.allowsBackgroundLocationUpdates = YES;
    }
    //開啟持續定位
    [self.locationManager startUpdatingLocation];
    
}


#pragma mark - 持續定位
-(void)alwaysLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    // 設定代理物件
    self.locationManager.delegate = self;
    // 設定反地理編碼
    self.locationManager.locatingWithReGeocode = YES;
    //開啟持續定位
    [self.locationManager startUpdatingLocation];
    
}


#pragma mark - 單次定位
-(void)onceLoaction{
    
    //初始化定位管理器
    self.locationManager = [[AMapLocationManager alloc]init];
    //單次定位
    [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        
        NSLog(@"%@", regeocode);
        
    }];
}


#pragma mark - 2個代理方法
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location{
    
    NSLog(@"我是個倒黴蛋,我不會被呼叫");
    
}

//若實現了下面的回撥,將不會再回撥amapLocationManager:didUpdateLocation:方法。
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{
    
    if (reGeocode)
    {
        NSLog(@"reGeocode:%@", reGeocode);
    }
    
    self.count++;
    
    if (self.count == 10) {
        // 超過10次停止定位
        [self.locationManager stopUpdatingLocation];
    }
    
}

@end
複製程式碼

總結

三種不同的定位,都可以實現定位,開發時請根據不同的需求選擇不同的定位方式:

  • 單次定位:使用簡單,只需要一個方法就可以搞定,無需設定代理
  • 持續定位:需要設定代理,通過startUpdatingLocation方法獲取定位資訊,代理回撥函式會被呼叫多次
  • 後臺定位:除了持續定位需要做的以外,還需要設定NSLocationAlwaysUsageDescription欄位,否則退出後臺會有大藍條提示,而且iOS9之前和之後的做法也不同。

相關文章