在iOS開發中,經常會使用到定位和地圖,Apple自帶的定位和地圖應付一般的場景綽綽有餘,但是也缺少一些功能,如POI搜尋、不夠接地氣等。因此作者選擇了高德地圖,這篇文正主要介紹定位功能的整合。
環境:Xcode7.3.1 + iOS 9.3 + 能訪問網路
1、註冊開發者,建立應用
首先註冊成為開發者,成為開發者以後,登入並進入控制檯,然後建立一個iOS應用,注意這一定要填寫好你的 Bundle identifier
,不知道的後文有說明怎麼查詢。
-
進入控制檯
-
填寫key的資訊
-
生成一個key
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之前和之後的做法也不同。