iOS7到IOS8中当前位置纬度和经度的不同行为

使用xamarin作为当前位置currentLocation示例我使用上面的Link获取当前位置的纬度和经度。
在升级到IOS 8之前的IOS 7中它在模拟器和设备上显示我当前的位置纬度和经度。(在模拟器中看起来很奇怪,获取当前位置的纬度和经度)。

升级到iOS 8并运行相同的代码后,它会给出

在模拟器中:(开启wifi无SIM卡定位服务应用程序总是。)

Result: latitude = 37.785834. longitude = -122.406517. 

在设备IPhone5c上(打开wifi无SIM卡定位服务应用程序总是。)

 Result: latitude = 37.785834. longitude = -122.406517. 

(但我预计我目前的位置纬度和经度)

升级后它没有问,该应用程序就像使用你的当前位置GPS。 带有YES,NO选项的警报消息。

如何获取我当前的位置纬度和经度?

您需要从iOS 8.0开始明确请求权限。 这样做的步骤:

  1. 更新Info.plist文件。 插入新密钥: NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription密钥,并编写将在您的应用请求权限时显示的自定义消息。

必须在plist文件中包含这些键中的任何一个,否则将不会显示权限请求! 如果您不想在alertview中显示自定义说明文本,请将键的值字符串留空,但仍必须在Info.plist文件中显示该键!

  1. 在开始跟踪之前,请检查您是否在iOS8上,然后从CLLocationManager实例发送RequestAlwaysAuthorization或RequestWhenInUseAuthorization。 例:

     var locationManager = new CLLocationManager(); if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) { locationManager.RequestAlwaysAuthorization(); } 

在这种情况下,请使用Info.plist文件中的NSLocationAlwaysUsageDescription键。 请注意,Xamarin Studio目前不会从下拉列表中自动为您提供此密钥,您必须在此处手动输入/复制粘贴此密钥。

为方法LocationManager添加LocationManger.cs文件

 if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) { this.locMgr.RequestAlwaysAuthorization(); } 

改变之后

 public LocationManager () { this.locMgr = new CLLocationManager(); LocationUpdated += PrintLocation; if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) { this.locMgr.RequestAlwaysAuthorization(); } } 

手动添加Info Plist NSLocationAlwaysUsageDescription空字符串。

然后清理构建并运行应用程序。 它显示了我当前的位置纬度和longtidu。

我试过上面的解决方案但是没有用。 问题是当您定位IOS> = 9.0时,位置管理器会更改一些权限变量,这些变量应该在info.pList中明确提及。

 NSLocationWhenInUseUsageDescription Why you need Location NSLocationAlwaysAndWhenInUseUsageDescription Why you need Location NSLocationAlwaysUsageDescription Why you need Location NSLocationWhileInUsage Why you need Location 

如果要在9.0之前和之后定位所有版本,请使用这四个键。

另请注意,此行表示用户是在前台还是后台使用位置(苹果不鼓励这样做,因为它有潜在的隐私)

 [locationManager requestAlwaysAuthorization]; 

这意味着,

 [locationManager requestWhenInUseAuthorization]; 

仅在app处于前台检查文档时使用此处

使用iOS模拟器时,您需要为模拟器硬件设置自定义位置。 转到“调试”,选择位置,自定义位置,然后设置首选坐标。