[ SWIFT ] - 史丹福 StandFord-CS193P-課程14-心得分享-20150914

[ SWIFT ] - 史丹福 StandFord-CS193P-課程14-心得分享-20150914
課程重點:定位,定位分2部分,分別由 Core Location 和 MapKit 組成

(1)Core Location 框架:屬於技術底層沒有UI(UserInter face)介面,只是單純管理位置信息。
         MapKit 框架:是UI層面的框架,用來把地圖上得信息呈現給用戶。

(2)用來表示位置得基本物件為CLLocation(CL:Core Location ),涵蓋高度、座標、水平、垂直、Time Stamp時間戳、速度與方向

(2.1)CLLocation屬性-CLLocationCoordinte2D:提供經緯度得信息,2D表示在地上得位置,不包含高度,高度由altitude提供。

※所提供的經緯度信息是一個近似值,因為目前並無設備可提供所處位置得精準位置。
 
(3)相關功能介紹:
var horizontalAccuracy  與 var verticalAccuracy:用來衡量水平和垂直空間的高度。

CLLocationDistance distanceFilter:設置位置更新的敏感範圍,單位:米。
CLLocationAccuracy desiredAccuracy:設置定位服務的精確度,系統参數如下:
kCLLocationAccuracyBestForNavigation:導航最高精確,,需要使用GPS。例如:汽車導航時使用。
※此狀態非常耗電,因精準度越高越耗電。
kCLLocationAccuracyBest;//高精確
kCLLocationAccuracyNearestTenMeters:10米,10米附近的精準度可能是GPS & WiFi混用
kCLLocationAccuracyHundredMeters:百米,百米附近的精準度只用 WiFi
kCLLocationAccuracyKilometer:千米
kCLLocationAccuracyThreeKilometers:三公里,1~3公里內用基地台來確認位置。

※和基地台通訊(使用通話功能)耗電非常低,使用 WiFi耗電量中等,WiFi透過三角定位來確認位置,GPS定位最精準但最耗電,在有遮蔽物或地下時無法使用。
  
 
Speed
Speed:速度,只得是瞬間速度,不是平均速度。
Course:表示方向,此為磁力器使用,用來表示方向或移動軌跡得方向來判別移動的位置
Time stamp:時間戳,當透過 GPS取得位置時,有可能因為GPS訊號不良或正在不同WiFi節點間進行切換,如此取得得位置並不是即時得,因此透過時間戳來檢查目前的位置是何時取得的。
如何取得CLLocation
透過CLLocationManager來取得CLLocation,因為CLLocation的運作方式和 Core MotionManager非常相似,
CLLocationManager 與 Core MotionManager差異點:CLLocationManager可多個,但Core MotionManager只能一個。

在模擬器中設定位置的方式:
CLLocationManager的使用方式:
(1)先檢查手機中是否有此設備
(2)創建CLLocationManager和設定代理(Delegate)
(3)確認想存取位置的方式
(4)依需求進行設置後開始發送代理信息
※發送信息時與 Core MotionManager不同的是沒有block,只是通過代理發送位置信息


位置的監控方式
(a)Accuracy-based continual updates:基於一個特定的精準度提供持續的更新,例如:持續更新目前和車站的距離。
(b)Updates only when "significant" changes in location occur:只在位置有明顯改變的時候進行通知
(c)Region-based updates:設定進入特定區域的時候通知,例如:靠近洗衣店的附近時通知記得拿衣服
(d)Heading monitoring:

CLLocationManager在存取設備信息時會用到的方法:

class func authorizationStatus() →CLAuthorizationStatus:Authorized-同意、Denied-拒絕、Restricted-等同拒絕,此為用戶不能改變的方式,由系統代為執行,例如:當公司服務不提供位置時,可以在不通知用戶的情況下透過Restricted關閉定位服務。

CLAuthorizationStatus狀態種類:
kCLAuthorizationStatusNotDetermined = 0,//用戶還沒有做選擇
kCLAuthorizationStatusRestricted,//應用拒接使用定位服務
kCLAuthorizationStatusDenied,//用戶拒絕授權
kCLAuthorizationStatusAuthorizedAlways,//8.0後可用,始終授權位置服務kCLAuthorizationStatusAuthorizedWhenInUse,//8.0後可用,只在前台授權位置服務

class func loactionServicesEnabled()→Bool:位置服務是否開啟?

class func significantLocationChangeMonitoringAvailable()→Bool:判斷設備是否支援更新位置

class func isMonitoringAvailableForClass(AnyClass!)→Bool:設備是否支持區域偵測,regionClass是地圖框架中的類。

class func isRangingAvailable()→Bool:設備是否支持藍牙測距


發出請求後就可以獲取位置信息,會返回一個帶有時間戳的 CLLocation 表示所有不同時間取得的位置。

有2種取得用戶定位授權 的方式:
(1)func requestWhenInUserAuthorization():僅在當前app活動時啟動定位服務。
(2)func requestAlwaysAuthorization():任何時候都可獲取位置,即使app在後台。
※此2種方式都是異步處理(asynchronously),在用戶尚未給予授權前,授權狀態都是NotDetermined狀態,在此狀態下不允許獲取任何關於用戶的信息。

使授權申請生效需要在Info.plist中加入 key 值(2選1),key值:(a)NSLocationWhenInUseUsageDescription(b)NSLocationAlwaysUsageDescription,沒有key就不能獲取位置信息

開始與停止更新位置
CLLocationAccuracy desiredAccuracy:設置定位服務的精確度
CLLocationDistance distanceFilter:設置位置更新的敏感範圍,單位:米,例如:當移動多少距離時進行通知或更新位置。

func startUpdatingLocation:開啟定位服務
func stopUpdatingLocation:停止定位服務
此外還有 
func startUpdatingHeading:開啟更新羅盤方向服務
func stopUpdatingHeading:停止更新羅盤方向服務
※上述服務都是透過代理信息(CLLocationManager's delegate)發送位置信息 
func locationManager(CLLocationManager,didUpdateLocations: [CLLocation])
參數:
CLLocationManager:發送人
didUpdateLocations:返回位置的陣列,不是單一值。因為在休眠狀態下仍可記錄位置,因此透過陣列方式提供不同時間記錄下的位置,這個陣列機制是制定在GPS晶片中。 

錯誤檢查
kCLErrorLocationUnknown:無法獲取位置信息
kCLErrorDenied:使用者關閉定位服務
kCLErrorHeadingFailure:因設備被干擾導致失敗,例如磁力計被影響無法提供正確位置
 App在後台時仍可以進行位置更新,更新方式有2種:顯著區域
 (1)顯著:只需要告訴系統開始監控顯著的位置變更,在未停止前會一直監控下去 (包含app沒啟動時也會監控)

(2)區域:利用基站回報位置,通常是很大的區域改變才會通知。
透過Location Manager Delegate發送訊息,而app在啟動時會調用didFinishLaunchingWithOptions,當中一個字典參數包含一個key值

UIApplicationLunchOptionsLocationKey:app啟動時由於一個顯著位置變更導致(就是開啟app時進行重新定位),會檢查當前位置並做出回應!

Region-based區域

 系統中可用的區域變數有2種:
(a)圓形區域:需定義中心、半徑與識別ID,ID為必要值,例如:地圖上的圓圈。
(b)燈塔區域:指是否靠近另外一台IOS設備,需搭配藍牙技術(燈塔指的是 ios設備)。

不管圓形區域或燈塔區域,當走進或是離開區域時下列代理方法會被調用:
(1)didEnterRegion:應該是指用戶進入區域
(2)didExitRegion:用戶離開區域
(3)monitoringDidFailForRegion:該區域無法監控(監控失敗)
※上述方法有時會異常失敗!記得進行錯誤處理。
因app不運行時也會監控區域,因此可透過CLLocation Manager的monitoredRegions屬性找到所有目前正在監控的區域,這是一個NSSet屬性。
監控的區域大小是有限制的:maxmumRegionMonitoringDistance:查詢監控區域大小 
燈塔
系統可以偵測到燈塔之間的距離,startRangingBeconsInRegion呼叫後會收到didRangeBeacons此代理方法發送的訊息會回傳與燈塔的距離是遠、中、近,但是不會提供方向。
※成為一個燈塔需有一個唯一 id,向apple註冊後取得。

Map Kit
1.MKMapView:UIView的子類,秀出一個地圖,展示在地球上的位置。
2.地圖上的注釋點(大頭針),是一個協議(Protocol)需邀三個參數:
(2.1)座標(經緯度)(2.2)標題(2.3)副標題
3.MKAnnotations(大頭針)須透過MKAnnotationView的子類來顯示,也可透過自定MKAnnotationView子類在地圖上呈現自定的效果。
4.點擊大頭針時會跳出白色視圖稱為大頭針的標註(callout),callout(標註)與MKAnnotations(大頭針)不同點在於,不能直接與標註(callout)進行互動,因為標註(callout)是點擊大頭針之後才會產生的!
5.MKAnnotations(大頭針)可以設置左右2個輔助視圖(圖片與圖示按鈕)
※使用 MKAnnotationView只能在標註(callout)中加上圖片與圖示按鈕,如果自定MKAnnotationView才可為標註(callout)中加上其他物件,例如多張圖片與多個圖示按鈕

MKMapView的產生
(1)第一種方式:由StoryBoard中拖曳MKMap
(2)第二種方式:通過 MKMapView由程式產生
※使用MKMapView實際的加上import
地圖上的大頭針實際上是一個AnyObject Array(MKAnnotation 的陣列),唯讀(get)
在MKAnnotation Protocol中只能讀取標題、副標題(2者皆為可選字串),但不能讓標題為空值,會導致異常,副標題可為空值。

加註標註(callout)
addAnnotation與addAnnotations:添加標註
removeAnnotation與 removeAnnotations:移除標註
※如果設計前就知道所有標註,建議提前添加所有標註
當點擊地圖上的大頭針時,如果有標註,會有一個canShowCallout屬性會回應:是不是跳出標註視圖,如果允許就會跳出。
另外當你點擊時調用MapView's delegate代理方法,didSelectAnnotationView系統就會知道有人點擊了哪個標註視圖

MKAnnotationView 如何加載標註點與MKAnnotation 陣列產生關連
MKAnnotationView與tableView非常類似,調用viewForAnnotation方法,提供標註,並且創建一個MKAnnotationView建置時有2個初始化參數:
(1)標註點、(2)複用標識(讓MKAnnotationView大頭針在螢幕外可以複用)

MKAnnotationView相關屬性
可設置大頭針頂部與底部的距離
輔助按鈕被按時會調用calloutAccessoryControlTapped
範例:
先檢查左邊輔助view是否是圖片view(UIImageView)如果是就加載圖片(在另外一個線程下載)

MKMapView類型
MKMapType:共有三種類型,.Standard:標準地圖.Satellite:衛星地圖.Hybrid:混和地圖
showsUserLocation:展示當前用戶位置,true表示呈現,也可限制用戶只能看特定區域或是不可滾動與縮放地圖(關閉拉伸手勢)


MKMapCamera:控制地圖視角的高度,由上往下看的角度。

MKCoordinateRegion:控制地圖顯示哪個地區
MKCoordinateSpan:圍繞點的經緯度距離

不同座標空間值轉換原因:
因為地圖有一個經緯度、地球也有一個經緯度、在view中也有一個座標系統,由於地圖是平面,而地球是立體球型,所以平面與立體的經緯度不同,因此需要進行不同座標系統間的轉換!
didChangeRegionAnimated
會回傳顯示地圖例的區域變化了,而且已完成切換動畫。
切換動畫:
例如從舊金山移至紐約,如果沒有呼叫切換動畫會變成快速移動,如果有呼叫切換動畫則會先跳至地球在往下顯示紐約!

MKLocalSearchRequest:提供地圖中地點名稱搜尋功能
OpenInMapsWithLauchOptions: 打開蘋果地圖應用程序
MKPolyline:在地圖上繪製路線
MKRoute:導航路線
2者都是異步同步

留言

熱門文章