CLLocationManager 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
管理將位置、區域和標題事件傳遞至您的應用程式。
[Foundation.Register("CLLocationManager", true)]
public class CLLocationManager : Foundation.NSObject
type CLLocationManager = class
inherit NSObject
- 繼承
- 屬性
備註
要求授權
從 iOS 8 開始,想要要求存取位置資訊的開發人員必須要求使用者的許可權才能接收事件。 這是藉由呼叫 RequestWhenInUseAuthorization() 或 RequestAlwaysAuthorization() 方法來完成。 叫用這些方法時,系統會提示使用者進行授權,而且如果授與授權, AuthorizationChanged 則會在設定 (或如果您使用委派慣用語時引發事件, AuthorizationChanged(CLLocationManager, CLAuthorizationStatus) 則會叫用 方法。
此外,開發人員必須在其應用程式的 中新增一或兩個金鑰 NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
。 info.plist
這些索引鍵是字串,可用來描述應用程式需要位置存取的原因。
開發人員應該使用如下的語法:
var manager = new CLLocationManager();
manager.AuthorizationChanged += (sender, args) => {
Console.WriteLine ("Authorization changed to: {0}", args.Status);
};
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
manager.RequestWhenInUseAuthorization();
追蹤裝置的位置
最常見的使用案例 CLLocationManager 是在應用程式位於前景時追蹤裝置。 (另請參閱下方的「背景更新和延後模式」。)
應用程式開發人員可以使用 C#樣式事件或 Apple 的委派物件模式來追蹤前景位置更新。 針對 C#樣式事件,開發人員可以使用 LocationsUpdated 事件:
var mgr = new CLLocationManager();
mgr.LocationsUpdated += (sender, e) => {
foreach(var loc in e.Locations)
{
Console.WriteLine(loc);
}
};
mgr.StartUpdatingLocation();
let mgr = new CLLocationManager()
mgr.LocationsUpdated.Add( fun e ->
e.Locations |> Seq.map Console.WriteLine |> ignore )
mgr.StartUpdatingLocations()
雖然 C#樣式事件更簡潔,但必須針對特定 (行為使用委派物件模式, CLLocationManager 例如延遲更新) ,而且即使 C#樣式事件可用,應用程式還是可能會更一致地使用委派物件模式。 委派物件模式包含將自訂 CLLocationManagerDelegate 物件指派給 Delegate 的 CLLocationManager 屬性:
var mgr = new CLLocationManager();
mgr.Delegate = new MyLocationDelegate();
mgr.StartUpdatingLocation();
//...etc...
public class MyLocationDelegate : CLLocationManagerDelegate {
public override void LocationsUpdated (CLLocationManager manager, CLLocation[] locations) {
foreach(var loc in locations) {
Console.WriteLine(loc);
}
}
}
let mgr = new CLLocationManager()
mgr.Delegate <- new MyLocationDelegate()
mgr.StartUpdatingLocation()
//...etc...
type MyLocationDelegate () = inherit CLLocationManagerDelegate()
override this.LocationsUpdated ( manager : CLLocationManager, locations : CLLocation[] ) =
locations
|> Seq.map Console.WriteLine
|> ignore
地區監視 (地理柵欄)
CLLocationManager可以追蹤裝置的進入和離開地理區域, (地理柵欄) 。 區域會是 的子類型 CLRegion : CLCircularRegion 或與 iBeacon 相關聯的區域,類型為 CLBeaconRegion 。
CLRegion 只有透過 Identifier 屬性來比較身分識別。 區域會在作業系統層級受到監視,而具有指定之 的新 CLRegion 物件可能會在裝置進入或存在區域時由系統具現化;這些 CLRegion 會是不同的物件 myExpectedRegion != myReceivedRegion
() ,但會有相同的 Identifier () myExpectedRegion.Identifier.Equals(myReceivedRegion.Identifier, StringComparison.Ordinal)
。 Identifier
應用程式開發人員可以使用 C#樣式事件或 Apple 的 delegate-object 模式:
var rgn = new CLCircularRegion(new CLLocationCoordinate2D(latitude, longitude), 50, "target");
mgr = new CLLocationManager();
mgr.RegionEntered += (s,e) => Console.WriteLine("Entered region " + e.Region.Identifier);
mgr.RegionLeft += (s,e) => Console.WriteLine("Left region " + e.Region.Identifier);
mgr.StartMonitoring(rgn);
let rgn = new CLCircularRegion(new CLLocationCoordinate2D(latitude, longitude), 50, "target")
let mgr = new CLLocationManager()
mgr.RegionEntered.Add( fun e -> Console.WriteLine("Entered region " + e.Region.Identifier))
mgr.RegionLeft.Add( fun e -> Console.WriteLine("Left region " + e.Region.Identifier))
mgr.StartMonitoring(rgn)
var rgn = new CLCircularRegion(new CLLocationCoordinate2D(latitude, longitude), 50, "target");
mgr = new CLLocationManager();
var del = new MyLocationDelegate();
mgr.Delegate = del;
mgr.StartMonitoring(rgn);
//...etc...
public class MyLocationDelegate : CLLocationManagerDelegate {
public override void RegionEntered (CLLocationManager mgr, CLRegion rgn) {
Console.WriteLine ("Entered region " + rgn.Identifier);
}
public override void RegionLeft (CLLocationManager mgr, CLRegion rgn) {
Console.WriteLine ("Left region " + rgn.Identifier);
}
}
let rgn = new CLCircularRegion(new CLLocationCoordinate2D(latitude, longitude), 50, "target")
let mgr = new CLLocationManager()
mgr.Delegate <- new MyLocationDelegate()
mgr.StartMonitoring(rgn)
//...etc...
type MyLocationDelegate () = inherit CLLocationManagerDelegate()
override this.RegionEntered ( mgr : CLLocationManager, rgn : CLRegion ) =
Console.WriteLine ("Entered region " + rgn.Identifier)
override this.RegionLeft ( mgr : CLLocationManager, rgn : CLRegion ) =
Console.WriteLine ("Left region " + rgn.Identifier)
iBeacon Ranging
在 iOS 7 中,Apple 引進了 iBeacons,其會使用伺服器和 GPS 服務結合區域處理,以及使用藍牙 Low-Energy (BLE) 訊號的範圍。
一旦在 (看到上一 CLBeaconRegion 節) ,應用程式可能會追蹤與裝置與鄰近 iBeacons 之間距離的細微變更相關的「範圍」事件。 iBeacon 範圍主要是無線電訊號強度的功能,可能會根據環境、電力雜訊等而大幅改變。應用程式開發人員不應嘗試估計或屬性的 Proximity 精確距離。
範圍是使用類似下列的程式碼來完成:
iBeacons 也支援「範圍」,以更精確的 Proximity 屬性來判斷實體鄰近性。 下列範例顯示範圍如何當做定性量值使用:
locationManager.DidRangeBeacons += (lm, rangeEvents) => {
switch(rangeEvents.Beacons[0].Proximity){
case CLProximity.Far :
Console.WriteLine("You're getting colder!");
break;
case CLProximity.Near :
Console.WriteLine("You're getting warmer!");
break;
case CLProximity.Immediate :
Console.WriteLine("You're red hot!");
break;
locationManager.DidRangeBeacons.Add(fun rangeEvents ->
let s = match rangeEvents.Beacons.[0].Proximity with
| CLProximity.Far -> "You're getting colder!"
| CLProximity.Near -> "You're getting warmer!"
| CLProximity.Immediate -> "You're red hot!"
| CLProximity.Unknown -> "I can't tell"
| _ -> raise(ArgumentOutOfRangeException("Unknown argument"))
Console.WriteLine(s)
)
locationManager.StartRangingBeacons(beaconRegion)
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
耗電量是所有背景案例的重要考慮。 在位置資料的情況下,已啟用 GPS 的硬體可能會記錄並快取精確的位置,但延遲傳遞至應用程式一段時間。 這個「延後模式」有數個條件約束:
- GPS 硬體必須可供使用
- 屬性 Delegate 必須指派給類別實作 LocationsUpdated(CLLocationManager, CLLocation[]) 方法的物件。
- DesiredAccuracy 屬性必須設為 AccuracyBest 或 AccurracyBestForNavigation。
如果滿足這些條件,應用程式可以在呼叫 AllowDeferredLocationUpdatesUntil(Double, Double) 方法的背景時要求延後傳遞。
Delegate 物件的重要性
一般而言,使用 Xamarin.iOS 時,開發人員可以選擇是否要使用 C# event
或 Apple 樣式的「委派物件」來回應物件生命週期事件。 不過,有數 CLLocationManager 種方法需要委派物件模式。 例如,如果 Delegate 屬性未設定為類別實作 LocationsUpdated(CLLocationManager, CLLocation[]) 方法的物件, AllowDeferredLocationUpdatesUntil(Double, Double) 則會引發執行時間例外狀況。
建構函式
CLLocationManager() |
預設建構函式,這個建構函式會初始化這個類別的新實例,不含任何參數。 |
CLLocationManager(IntPtr) |
建立 Unmanaged 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
CLLocationManager(NSObjectFlag) |
在衍生類別上呼叫的建構函式,以略過初始化,並只配置 物件。 |
屬性
ActivityType |
用來提供作業系統線索,以取得更佳的耗電量/精確度。 |
AllowsBackgroundLocationUpdates |
取得或設定 Boolean 值,控制應用程式是否會在暫停時回應位置更新。 |
Class |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
ClassHandle |
這個類別的控制碼。 |
DebugDescription |
此物件的開發人員有意義描述。 (繼承來源 NSObject) |
DeferredLocationUpdatesAvailable |
是否可以使用背景產生的延遲位置資料。 |
Delegate |
CoreLocation.ICLLocationManagerDelegate 模型類別的實例,做為類別委派。 |
Description |
物件的描述,ToString 的 Objective-C 版本。 (繼承來源 NSObject) |
DesiredAccuracy |
應用程式慣用的精確度。 (粗略的協助工具耗用較少的電源。) |
DistanceFilter |
裝置必須在發出位置更新之前移動最小水準距離,以公尺為單位。 |
Handle |
處理 unmanaged 物件標記法) (指標。 (繼承來源 NSObject) |
Heading |
裝置) 移動的最近標題 (方向。 |
HeadingAvailable |
屬性是否 Heading 不是 |
HeadingFilter |
產生位置更新所需的標題最小變更,以度為單位。 |
HeadingOrientation |
用來判斷標題計算的方向。 |
IsDirectBinding |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
IsProxy |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
IsRangingAvailable |
取得布林值,指出裝置是否可以範圍藍牙指標。 |
Location |
最近擷取的 CLLocation 。 |
LocationServicesEnabled |
位置服務是否可用。 |
MaximumRegionMonitoringDistance |
可以指派給區域的最大界限距離,以公尺為單位。 |
MaxTimeInterval |
表示與常數 CLTimeInternalMax 相關聯的值 |
MonitoredRegions |
應用程式正在監視的 CLRegion 集合。 |
PausesLocationUpdatesAutomatically |
例如,如果裝置未在一) 段時間內移動,系統是否允許暫停位置更新 (。 |
Purpose |
開發人員不應該使用此已被取代的屬性。 |
RangedRegions |
使用範圍來追蹤的 CLRegion 集合。 |
RegionMonitoringAvailable |
應用程式開發人員應該使用 IsMonitoringAvailable(Type) ,而不是這個已被取代的方法。 |
RegionMonitoringEnabled |
應用程式開發人員應該使用 IsMonitoringAvailable(Type) ,而不是這個已被取代的方法。 |
RetainCount |
傳回物件的目前 Objective-C 保留計數。 (繼承來源 NSObject) |
Self |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
ShouldDisplayHeadingCalibration |
由 物件叫用的委派以取得值。 |
ShowsBackgroundLocationIndicator |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
SignificantLocationChangeMonitoringAvailable |
是否可以使用「重大位置變更」監視 (例如,透過資料格塔交換器) 。 |
Status |
應用程式授權狀態 (例如,如果應用程式拒絕存取位置服務) 。 |
Superclass |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
SuperHandle |
用來表示這個 NSObject 基類中方法的控制碼。 (繼承來源 NSObject) |
WeakDelegate |
物件,可回應此類型的委派通訊協定 |
Zone |
管理將位置、區域和標題事件傳遞至您的應用程式。 (繼承來源 NSObject) |
方法
事件
AuthorizationChanged |
物件引發的事件。 |
DeferredUpdatesFinished |
物件引發的事件。 |
DidDetermineState |
物件引發的事件。 |
DidRangeBeacons |
物件引發的事件。 |
DidStartMonitoringForRegion |
物件引發的事件。 |
DidVisit |
物件引發的事件。 |
Failed |
物件引發的事件。 |
LocationsUpdated |
物件引發的事件。 |
LocationUpdatesPaused |
物件引發的事件。 |
LocationUpdatesResumed |
物件引發的事件。 |
MonitoringFailed |
物件引發的事件。 |
RangingBeaconsDidFailForRegion |
物件引發的事件。 |
RegionEntered |
物件引發的事件。 |
RegionLeft |
物件引發的事件。 |
UpdatedHeading |
物件引發的事件。 |
UpdatedLocation |
物件引發的事件。 |
擴充方法
ObjectDidBeginEditing(NSObject, INSEditor) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
ObjectDidEndEditing(NSObject, INSEditor) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
GetValidModes(NSObject, NSFontPanel) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
ValidateToolbarItem(NSObject, NSToolbarItem) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
GetDebugDescription(INSObjectProtocol) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
AcceptsPreviewPanelControl(NSObject, QLPreviewPanel) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
BeginPreviewPanelControl(NSObject, QLPreviewPanel) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
EndPreviewPanelControl(NSObject, QLPreviewPanel) |
管理將位置、區域和標題事件傳遞至您的應用程式。 |
GetAccessibilityCustomRotors(NSObject) |
取得物件適用的 |
SetAccessibilityCustomRotors(NSObject, UIAccessibilityCustomRotor[]) |
設定適用于 |