CLLocationManager 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
管理位置、区域和标题事件到应用程序的传递。
[Foundation.Register("CLLocationManager", true)]
public class CLLocationManager : Foundation.NSObject
type CLLocationManager = class
inherit NSObject
- 继承
- 属性
注解
请求授权
从 iOS 8 开始,想要请求访问位置信息的开发人员必须请求用户的权限才能接收事件。 这是通过调用 RequestWhenInUseAuthorization() 或 RequestAlwaysAuthorization() 方法完成的。 调用这些方法时,系统将提示用户进行授权,如果他授予授权, AuthorizationChanged 则将在设置 (或如果使用委托成语时引发事件, AuthorizationChanged(CLLocationManager, CLAuthorizationStatus) 将调用该方法。
此外,开发人员必须在其应用的 info.plist
中添加一个或两个密钥NSLocationWhenInUseUsageDescription
和 NSLocationAlwaysUsageDescription
。 这些键是可用于描述应用需要位置访问权限的原因的字符串。
开发人员应使用如下所示的成语:
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对象myExpectedRegion != myReceivedRegion
;这些 CLRegion对象 () 但具有相同 Identifier (myExpectedRegion.Identifier.Equals(myReceivedRegion.Identifier, StringComparison.Ordinal)
) 。Identifier
应用程序开发人员可以使用 C#样式事件或 Apple 的委托对象模式:
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) 方法请求延迟传递。
委托对象的重要性
通常,使用 Xamarin.iOS 时,开发人员可以自由选择是使用 C# event
还是 Apple 样式的“委托对象”来响应对象生命周期事件。 但是,有几种 CLLocationManager 方法需要委托对象模式。 例如, AllowDeferredLocationUpdatesUntil(Double, Double) 如果未将 Delegate 属性设置为类实现 LocationsUpdated(CLLocationManager, CLLocation[]) 方法的对象,则会引发运行时异常。
构造函数
CLLocationManager() |
不带参数初始化此类的新实例的默认构造函数。 |
CLLocationManager(IntPtr) |
创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。 |
CLLocationManager(NSObjectFlag) |
用于调用派生类的构造函数,以跳过初始化并仅分配 对象。 |
属性
ActivityType |
用于提供操作系统线索,以提高功耗/准确性。 |
AllowsBackgroundLocationUpdates |
获取或设置一个布尔值,该值控制应用程序在挂起时是否会响应位置更新。 |
Class |
管理位置、区域和标题事件到应用程序的传递。 (继承自 NSObject) |
ClassHandle |
此类的句柄。 |
DebugDescription |
此对象的开发人员有意义的说明。 (继承自 NSObject) |
DeferredLocationUpdatesAvailable |
后台生成的延迟位置数据是否可用。 |
Delegate |
充当类委托的 CoreLocation.ICLLocationManagerDelegate 模型类的实例。 |
Description |
对象的说明,即 ToString 的 Objective-C 版本。 (继承自 NSObject) |
DesiredAccuracy |
应用首选的准确性。 (粗略精度消耗更少的功率。) |
DistanceFilter |
设备在发出位置更新之前必须移动的最小水平距离(以米为单位)。 |
Handle |
处理指向非托管对象表示形式的 (指针) 。 (继承自 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[]) |
设置适用于 |