2013年8月6日 星期二

CoreLocation

練習程式

一開始先設置 CLLocationManager
locManager = [[CLLocationManager alloc] init];
我試著把它宣告為L.var, 不過這樣Delegate都不會呼叫了, 看來是會被釋放掉, 還是得宣告成I.var

然後設置一些參數, 代理
[locManager setDelegate:self]; //代理
[locManager setDistanceFilter:kCLDistanceFilterNone]; //距離過濾
[locManager setDesiredAccuracy:kCLLocationAccuracyBest]; //精確度

然後再來就啓用需要的服務, 例如:
[locManager startUpdatingLocation]; //位置
[locManager startUpdatingHeading]; //方向

[locManager startMonitoringSignificantLocationChanges];
這應該是要有比較大的變動才會呼叫, 而且會忽略CLLocationManager設置的距離及精確度, 下面是官方註解
The behavior of this service is not affected by the desiredAccuracy or distanceFilter properties.

[locManager startMonitoringForRegion:_region];
這不太好測試, 我從代理方法名稱以及官方註解來看, 這應該是區域偵測
會此方法給一組region(包含經緯度以及範圍大小), 然後有代理可以實作判斷進入這區域或是離開這區域


至於這些服務的代理實作就不解釋了, 就只是一些回應給坐標, 要怎樣實作就看自己


比較值得提到一點是
App第一次啟用時, 會詢問User是否要啓用定位服務, 且會呼叫對應的Delegate locationManager:didChangeAuthorizationStatus:
一開始跳出AlertView時的CLAuthorizationStatus為kCLAuthorizationStatusNotDetermined, 亦即還未確認User是否授權
當User按下授權, CLAuthorizationStatus變為kCLAuthorizationStatusAuthorized
當User拒絕授權, CLAuthorizationStatus變為kCLAuthorizationStatusDenied
若是拒絕授權, 除非App重裝, 否則不會再跳出AlertView詢問User是否要啓用GPS, 需要User自己去設定開啓服務

至於kCLAuthorizationStatusRestricted, 這情況沒遇過, 下面是官方說明
This application is not authorized to use location services. The user cannot change this application’s status, possibly due to active restrictions such as parental controls being in place.

沒有留言:

張貼留言