IOS-地圖之CLLocation的使用

簡述

  • 1.在移動互聯(lián)網(wǎng)時代,移動app能解決用戶的很多生活瑣事,比如
    ● 周邊:找餐館、找KTV、找電影院等等
    ● 導(dǎo)航:根據(jù)用戶設(shè)定的起點和終點,進(jìn)行路線規(guī)劃,并指引用戶如何到達(dá)
    ● 在上述應(yīng)用中,都用到了定位和地圖功能,在iOS開發(fā)中,要想加入這2大功能,必須基于2個框架進(jìn)行開發(fā)
    ● CoreLocation :用于地理定位,地理編碼,區(qū)域監(jiān)聽等(著重功能實現(xiàn))
    ● MapKit :用于地圖展示,例如大頭針,路線、覆蓋層展示等(著重界面展
    示)

  • 2個熱門專業(yè)術(shù)語
    ● LBS :Location Based Service
    ● SoLoMo :Social Local Mobile(索羅門)

1 CoreLocation框架的使用

導(dǎo)入主頭文件
#import <CoreLocation/CoreLocation.h>

● CoreLocation框架使用須知
● CoreLocation框架中所有數(shù)據(jù)類型的前綴都是CL
● CoreLocation中使用CLLocationManager對象來做用戶定位

2 CLLocationManager

CLLocationManager的常用操作
 //開始更新用戶位置
 - (void)startUpdatingLocation;
 //停止更新用戶位置
 - (void) stopUpdatingLocation;
// 當(dāng)調(diào)用了startUpdatingLocation方法后,就開始不斷地請求、刷新用戶的位置,一旦請求到用戶位置就會調(diào)用代理的下面方法
 - (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations;
// locations參數(shù)里面裝著CLLocation對象
為了嚴(yán)謹(jǐn)起見,最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用
//CLLocationManager有個類方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
@property(assign, nonatomic) CLLocationDistance
 distanceFilter;
//每隔多少米定位一次
@property(assign, nonatomic) CLLocationAccuracy
 desiredAccuracy;
//定位精確度(越精確就越耗電)

3 CLLocation

CLLocation用來表示某個位置的地理信息,比如經(jīng)緯度、海拔等等@property(readonly,nonatomic)CLLocationCoordinate2D
coordinate;
// 經(jīng)緯度
@property(readonly,nonatomic)CLLocationDistancealtitude;
//海拔 
@property(readonly,nonatomic)CLLocationDirectioncourse;
//路線,航向(取值范圍是0.0°~359.9°,0.0°代表真北方向) @property(readonly,nonatomic)CLLocationSpeedspeed;
// 移動速度(單位是m/s)

4 iOS8以后的定位適配

問題:iOS 8.0開始,蘋果進(jìn)一步加強(qiáng)了對用戶隱私的保護(hù)。
當(dāng)APP想訪問用戶的隱私信息時,系統(tǒng)不再自動彈出一個對話框讓用戶授權(quán)
解決方法:
(1)調(diào)用iOS 8.0的API,主動請求用戶授權(quán)
● - (void)requestAlwaysAuthorization // 請求允許在前后臺都能獲取用戶位置的授權(quán)
● - (void)requestWhenInUseAuthorization // 請求允許在前臺獲取用戶位置的授權(quán)

(2)務(wù)必在info.plist文件中配置對應(yīng)的鍵值, 否則以上請求授權(quán)的方法不生效
● NSLocationAlwaysUsageDescription : 允許在前后臺獲取GPS的描述
● NSLocationWhenInUseDescription : 允許在前臺獲取GPS的描述

5 iOS 9.0 定位補充

iOS 9.0 如果當(dāng)前處于前臺授權(quán)狀態(tài),默認(rèn)是不可以后臺獲取用戶位置。但可以設(shè)置以下屬性為YES,就可以繼續(xù)獲取后臺位置,但是會出現(xiàn)藍(lán)條
解決:allowsBackgroundLocationUpdates屬性設(shè)置為YES
使用注意:必須設(shè)置對應(yīng)的后臺模式:location updates

1 iOS 9.0 可以單次請求用戶位置

  • (void)requestLocation
    -(void)locationManager:(nonnull CLLocationManager *)manager
    didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations // 成功調(diào)用

-(void)locationManager:(nonnull CLLocationManager *)manager
didFailWithError:(nonnullNSError *)error // 失敗調(diào)用

6 CLLocationCoordinate2D

CLLocationCoordinate2D是一個用來表示經(jīng)緯度的結(jié)構(gòu)體,定義如下
typedef struct {
CLLocationDegrees latitude; // 緯度
CLLocationDegrees longitude; // 經(jīng)度
} CLLocationCoordinate2D;
● 一般用CLLocationCoordinate2DMake函數(shù)來創(chuàng)建CLLocationCoordinate2D

my gold ! forget save,just store a little data.

7 經(jīng)緯度

屏幕快照 2016-09-04 下午12.04.29.png
](http://upload-images.jianshu.io/upload_images/2471265-d6d8c767633377a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

8 天朝經(jīng)緯度

天朝經(jīng)緯度

9 模擬位置

  • 如果是模擬器,需要設(shè)置模擬位置(經(jīng)緯度)
  • 天朝帝都的經(jīng)緯度是:北緯40°,東經(jīng)116°
設(shè)置模擬器經(jīng)緯度模式

10 CLGeocoder

1.使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
2.地理編碼:根據(jù)給定的地名,獲得具體的位置信息(比如經(jīng)緯度、地址的全稱等)
3.反地理編碼:根據(jù)給定的經(jīng)緯度,獲得具體的位置信息

  • 地理編碼方法:
    -(void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
  • 反地理編碼方法
    -(void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;

11 CLGeocodeCompletionHandler

● 當(dāng)?shù)乩韁反地理編碼完成時,就會調(diào)用CLGeocodeCompletionHandler
● typedef void (^CLGeocodeCompletionHandler)(NSArray
*placemarks, NSError *error);
● 這個block傳遞2個參數(shù)
? error :當(dāng)編碼出錯時(比如編碼不出具體的信息)有值? placemarks :里面裝著CLPlacemark對象

12 CLPlacemark

● CLPlacemark的字面意思是地標(biāo),封裝詳細(xì)的地址位置信息
●@property(nonatomic,readonly)CLLocationlocation;
? 地理位置
●@property(nonatomic,readonly)CLRegion
region;
? 區(qū)域
●@property(nonatomic,readonly)NSDictionaryaddressDictionary;
? 詳細(xì)的地址信息
● @property(nonatomic,readonly)NSString
name;
? 地址名稱
●@property(nonatomic,readonly)NSString*locality;? 城市

CLPlacemark和CLLocation關(guān)系圖

代碼例子:
practice1
practice2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容