簡介
定位,顧名思義,就是確定你所在的位置驳规。
一、介紹
? 定位使用CoreLocation框架
?功能
1署海、基礎定位
2吗购、地理編碼反編碼
? iOS8 iOS9之后的改變
1医男、定位服務的目的
(1)NSLocationAlwaysUsageDescription
(2)NSLocationWhenInUseUsageDescription
注意:如果忘記寫就不能使用定位功能,沒有提示信息
2捻勉、請求用戶授權
(1)requestAlwaysAuthorization
(2)requestWhenInUseAuthorization
注意:如果和描述的目的不匹配镀梭,也不能使用
3、iOS9 按Home鍵進入后臺踱启,如果需要繼續(xù)定位
(1)需要在info.plist文件里添加Required background modes->App registers for location updates 如果不添加這對鍵值 卻使用后臺定位功能 會直接崩潰
(2)allowsBackgroundLocationUpdates 這個屬性需要同時設置為YES
二报账、使用
#import "ViewController.h"
#import<CoreLocation/CoreLocation>
@interface ViewController (){
CLLocationManager *locationManager;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// 判斷用戶是否在設置里面打開了位置服務功能
if (![CLLocationManager locationServicesEnabled]) {
// 1、跳彈出框 提示用戶打開步驟
// 2禽捆、通過代碼跳到設置頁面
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:@"請在設置中打開定位功能" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:action];
[self presentViewController:alertController animated:YES completion:nil];
}
// openURL:用于跳轉APP 跳到iOS允許跳到的頁面
// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
// if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]) {
// 跳轉到設置頁面
// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
// }
// [self respondsToSelector:@selector(selector)];//判斷方法是否響應
// 1笙什、創(chuàng)建管理者的對象
locationManager = [[CLLocationManager alloc]init];
// 多少米,去更新一次位置信息
locationManager.distanceFilter = 100;
// 設置定位的精準度
locationManager.desiredAccuracy = 10;
// 2胚想、info中添加描述使用定位的目的 并向用戶申請授權
[locationManager requestWhenInUseAuthorization];
// 3琐凭、 掛上代理 并實現(xiàn)代理方法
locationManager.delegate = self;
// 4、如果需要使用后臺定位服務需要在info 中添加Required background modes 這個KEY 以及它里邊的元素App registers for location updates
locationManager.allowsBackgroundLocationUpdates = YES;
// 5浊服、開始定位
[locationManager startUpdatingLocation];
}
//定位成功的代理方法
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"定位成功");
}
//定位失敗的代理方法
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error{
NSLog(@"定位失敗");
if (error.code == kCLErrorDenied) {
// 提示用戶出錯原因统屈,可按住Option鍵點擊 KCLErrorDenied的查看更多出錯信息,可打印error.code值查找原因所在
}
}
如果想要獲取定位城市的名字牙躺,可在定位成功的代理方法里邊添加如下代碼:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"定位成功");
//此處locations存儲了持續(xù)更新的位置坐標值愁憔,取最后一個值為最新位置,如果不想讓其持續(xù)更新位置孽拷,則在此方法中獲取到一個值之后讓locationManager stopUpdatingLocation
CLLocation *currentLocation = [locations lastObject];
NSLog(@"locations===%@",[locations lastObject]);
// 獲取當前所在的城市名
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
//根據(jù)經(jīng)緯度反向地理編譯出地址信息
[geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *array, NSError *error)
{
if (array.count > 0)
{
CLPlacemark *placemark = [array objectAtIndex:0];
NSLog(@"%@",placemark.name);
//獲取城市
NSString *city = placemark.locality;
if (!city) {
//四大直轄市的城市信息無法通過locality獲得吨掌,只能通過獲取省份的方法來獲得(如果city為空,則可知為直轄市)
city = placemark.administrativeArea;
}
NSLog(@"%@",city);
}
else if (error == nil && [array count] == 0)
{
NSLog(@"No results were returned.");
}
else if (error != nil)
{
NSLog(@"An error occurred = %@", error);
}
}];
//系統(tǒng)會一直更新數(shù)據(jù)脓恕,直到選擇停止更新膜宋,因為我們只需要獲得一次經(jīng)緯度即可,所以獲取之后就停止更新
[manager stopUpdatingLocation];
}