簡述
1.在移動互聯(lián)網(wǎng)時代,移動app能解決用戶的很多生活瑣事,比如
● 周邊:找餐館、找KTV碉纳、找電影院等等
● 導航:根據(jù)用戶設定的起點和終點,進行路線規(guī)劃,并指引用戶如何到達
● 在上述應用中,都用到了定位和地圖功能,在iOS開發(fā)中,要想加入這2大功能,必須基于2個框架進行開發(fā)
● CoreLocation :用于地理定位,地理編碼,區(qū)域監(jiān)聽等(著重功能實現(xiàn))
● MapKit :用于地圖展示,例如大頭針,路線梅忌、覆蓋層展示等(著重界面展
示)2個熱門專業(yè)術語
● LBS :Location Based Service
● SoLoMo :Social Local Mobile(索羅門)
1 CoreLocation框架的使用
導入主頭文件
#import <CoreLocation/CoreLocation.h>
● CoreLocation框架使用須知
● CoreLocation框架中所有數(shù)據(jù)類型的前綴都是CL
● CoreLocation中使用CLLocationManager對象來做用戶定位
2 CLLocationManager
CLLocationManager的常用操作
//開始更新用戶位置
- (void)startUpdatingLocation;
//停止更新用戶位置
- (void) stopUpdatingLocation;
// 當調用了startUpdatingLocation方法后,就開始不斷地請求、刷新用戶的位置,一旦請求到用戶位置就會調用代理的下面方法
- (void)locationManager:(CLLocationManager *)managerdidUpdateLocations:(NSArray *)locations;
// locations參數(shù)里面裝著CLLocation對象
為了嚴謹起見,最好在使用定位功能之前判斷當前應用的定位功能是否可用
//CLLocationManager有個類方法可以判斷當前應用的定位功能是否可用
+ (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開始,蘋果進一步加強了對用戶隱私的保護痕惋。
當APP想訪問用戶的隱私信息時,系統(tǒng)不再自動彈出一個對話框讓用戶授權
解決方法:
(1)調用iOS 8.0的API,主動請求用戶授權
● - (void)requestAlwaysAuthorization // 請求允許在前后臺都能獲取用戶位置的授權
● - (void)requestWhenInUseAuthorization // 請求允許在前臺獲取用戶位置的授權
(2)務必在info.plist文件中配置對應的鍵值, 否則以上請求授權的方法不生效
● NSLocationAlwaysUsageDescription : 允許在前后臺獲取GPS的描述
● NSLocationWhenInUseDescription : 允許在前臺獲取GPS的描述
5 iOS 9.0 定位補充
iOS 9.0 如果當前處于前臺授權狀態(tài),默認是不可以后臺獲取用戶位置卷谈。但可以設置以下屬性為YES,就可以繼續(xù)獲取后臺位置,但是會出現(xiàn)藍條
解決:allowsBackgroundLocationUpdates屬性設置為YES
使用注意:必須設置對應的后臺模式:location updates
1 iOS 9.0 可以單次請求用戶位置
- (void)requestLocation
-(void)locationManager:(nonnull CLLocationManager *)manager
didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations // 成功調用
-(void)locationManager:(nonnull CLLocationManager *)manager
didFailWithError:(nonnullNSError *)error // 失敗調用
6 CLLocationCoordinate2D
CLLocationCoordinate2D是一個用來表示經(jīng)緯度的結構體,定義如下
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)緯度
8 天朝經(jīng)緯度
9 模擬位置
- 如果是模擬器,需要設置模擬位置(經(jīng)緯度)
- 天朝帝都的經(jīng)緯度是:北緯40°,東經(jīng)116°
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
● 當?shù)乩韁反地理編碼完成時,就會調用CLGeocodeCompletionHandler
● typedef void (^CLGeocodeCompletionHandler)(NSArray
*placemarks, NSError *error);
● 這個block傳遞2個參數(shù)
? error :當編碼出錯時(比如編碼不出具體的信息)有值? placemarks :里面裝著CLPlacemark對象
12 CLPlacemark
● CLPlacemark的字面意思是地標,封裝詳細的地址位置信息
●@property(nonatomic,readonly)CLLocationlocation;
? 地理位置
●@property(nonatomic,readonly)CLRegionregion;
? 區(qū)域
●@property(nonatomic,readonly)NSDictionaryaddressDictionary;
? 詳細的地址信息
● @property(nonatomic,readonly)NSStringname;
? 地址名稱
●@property(nonatomic,readonly)NSString*locality;? 城市