地图篇-01.获取用户位置
地圖篇-01.獲取用戶位置
今天把地圖整理了一下,共享出來和大家一起分享,希望幫助到不了解的朋友,當然很精通的朋友希望指正小生的不足.
1.說到地圖,首先要接觸一個framework -CoreLocation.framework
創建一個項目
點擊"+"號之后,跳轉到下個界面
導入完畢
2.原理:
大家平時在使用iPhone時,每下載一個App,第一次打開的時候,都會有這樣的提示
?
是吧,這時候我們如果選擇了不允許的話,這個App是獲取不了我們的位置的,相應的App里面涉及到位置的功能我們都用不了(比如微信和QQ的"附近的人")
所以每次我都被App的意志強奸,選擇允許
那么,如果選擇了不允許之后,又想選擇允許怎么辦呢?下圖
可以到設置->隱私->定位服務里面去打開定位服務,所有的App,只要有定位功能的都會在這里面顯示,還可以選擇性打開自己想要打開的App定位
所以,在我們寫代碼的時候,第一步就要判斷用戶是否打開了定位服務.
接下來看下圖
?
?
大家會從上圖右側看到,有的App是"使用期間",有的又是"始終",有的是"永不"
對,這是一個定位的狀態,或者說模式,就是說你希望什么時候用這個App的定位服務,或者是不使用
點進去會看到如下圖示
和下圖
大家又會發現在以上兩張圖片中,微博比手機淘寶多了一個字段,這是為什么呢?
首先,在iOS8之后,獲取用戶位置需要在info.plist文件中添加字段,下圖
常用字段:NSLocationAlwaysUsageDescription(始終)和NSLocationWhenInUseUsageDescription(使用期間),如果只添加一個,就會像上圖那樣有的只有使用期間,或者有的只有始終,亦或者有的App兩者都有
所以,在判斷用戶打開定位服務之后,我們要判斷用戶的授權狀態
3.在寫代碼之前,先來理理邏輯:
大家都知道在日常生活中,我們使用地圖的時候,基本都是用經緯度來表示位置(要是不知道這個的話可以問問科學家),在iOS編碼中也一樣,也是用經緯度來表示用戶位置,大家看到的地址名字不過是地理編碼后顯示的文本.
上述步驟完成之后,我們就可以開始定位了.
4.代碼
?
1 // 2 // ViewController.m 3 // 地圖 4 // 5 // Created by admin on 16/5/21. 6 // Copyright ? 2016年 鄧駒. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 //導入頭文件(也可以創建一個pch文件,在pch文件中導入下面頭文件) 12 #import <CoreLocation/CoreLocation.h> 13 14 @interface ViewController ()<CLLocationManagerDelegate> 15 16 @property (nonatomic, strong) CLLocationManager *manager; 17 18 @end 19 20 @implementation ViewController 21 22 - (void)viewDidLoad { 23 [super viewDidLoad]; 24 //1.判斷用戶是否開啟定位服務 25 if (![CLLocationManager locationServicesEnabled]) { 26 NSLog(@"請開啟定位服務"); 27 return; 28 } 29 //2.判斷用戶授權狀態 30 if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) { 31 //請求用戶授權 32 //后臺可以定位 33 // [self.manager requestAlwaysAuthorization]; 34 //允許在前臺使用GPS描述,后臺不能定位 35 [self.manager requestWhenInUseAuthorization]; 36 } 37 //3.開始定位 38 [self.manager startUpdatingLocation]; 39 } 40 41 -(CLLocationManager *)manager { 42 if (!_manager) { 43 _manager = [[CLLocationManager alloc] init]; 44 //定位精度(誤差) 45 _manager.desiredAccuracy = kCLLocationAccuracyBest; 46 //位置更新的最小距離(如果不設置這個屬性,程序會一直獲取用戶當前位置,是非常耗電的) 47 _manager.distanceFilter = 100; 48 _manager.delegate = self; 49 } 50 return _manager; 51 } 52 53 /** 54 * 當獲取到用戶位置的時候調用 55 * 56 * @param manager 當前manager 57 * @param locations 用戶的位置 58 */ 59 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { 60 //獲取用戶的最新位置 61 CLLocation *userLocal = [locations lastObject]; 62 //停止定位 63 [self.manager stopUpdatingHeading]; 64 //通過經緯度來獲取用戶位置 65 //緯度 66 CLLocationDegrees latitude = userLocal.coordinate.latitude; 67 //經度 68 CLLocationDegrees longtitude = userLocal.coordinate.longitude; 69 NSLog(@"緯度:%f,經度:%f",latitude,longtitude); 70 } 71 72 - (void)didReceiveMemoryWarning { 73 [super didReceiveMemoryWarning]; 74 // Dispose of any resources that can be recreated. 75 } 76 77 @end打印結果:
1 2016-05-21 19:40:37.242 地圖[2172:76214] 緯度:37.785834,經度:-122.406417東經為正數,西經為負數
取值范圍:-180~180
北緯為正數,南緯為負數
取值范圍:-90~90
注意:
CLLocationManager創建對象,必須要用強引用,不然可能會提前釋放.
5.計算兩點間的距離
1 /** 2 * 計算兩點間的距離 3 */ 4 -(void)calculateDistance{ 5 CLLocation *beijing = [[CLLocation alloc] initWithLatitude:39.54 longitude:116.28]; 6 CLLocation *chengdu = [[CLLocation alloc] initWithLatitude:30.67 longitude:104.06]; 7 //計算距離(單位是米) 8 CLLocationDistance distance = [beijing distanceFromLocation:chengdu]; 9 NSLog(@"北京到成都的距離是:%f米",distance); 10 }打印結果:
1 2016-05-21 19:50:06.315 地圖[2201:79784] 北京到成都的距離是:1483882.846655米本節內容到這就完了,下一節是地理編碼,望大家指正,不明白的可以評論或者留言,我會第一時間回復.謝謝
轉載于:https://www.cnblogs.com/Xebdison/p/5515453.html
總結
以上是生活随笔為你收集整理的地图篇-01.获取用户位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3,SQL语句及数据库优化
- 下一篇: java工具类去掉字符串String中的