iOS 7 到 iOS 8 中当前位置纬度和经度的不同行为
Posted
技术标签:
【中文标题】iOS 7 到 iOS 8 中当前位置纬度和经度的不同行为【英文标题】:different behaviour for current location latitude and longitude in iOS7 to IOS8 【发布时间】:2014-09-20 21:51:02 【问题描述】:使用 xamarin 获取当前位置 currentLocation example 我使用上面的链接来获取当前位置的纬度和经度。 在升级到 ios 8 之前的 IOS 7 中,它会在模拟器和设备上显示我当前的位置纬度和经度。(在模拟器中获取当前位置纬度和经度对我来说看起来很奇怪)。
升级到 iOS 8 后运行相同的代码
在模拟器中:(始终开启wifi无sim卡定位服务App。)
Result:
latitude = 37.785834.
longitude = -122.406517.
在设备 iPhone5c 上(始终打开 wifi 无 sim 卡定位服务应用程序。)
Result:
latitude = 37.785834.
longitude = -122.406517.
(但我预计我当前位置的经纬度)
升级后它不会询问,该应用程序喜欢使用您当前的位置 GPS。带有是、否选项的警报消息。
如何获取我当前所在位置的经纬度?
【问题讨论】:
我从来没有让模拟器返回除通过调试设置的位置或模拟器中的位置菜单之外的任何位置。检查您是否没有在 Xcode 调试中强制模拟位置 - 这将适用于模拟器和设备 在模拟器上运行应用程序时显示结果:纬度 = 37.785834。经度 = -122.406517。当在设备 (Iphone5c) 位置服务 Location.IOS(应用程序名称)上运行时,选中检查始终允许位置访问并打开应用程序结果:纬度:[lat] 经度:[lon].... 它不起作用不显示当前位置纬度和经度。 我猜 locationManger 出了点问题。无法获取当前位置的经纬度。请让我知道如何获取当前位置的纬度和经度。为 IOS 使用 LocationManager xamarin。 您好,亲爱的,您在模拟器中发现这个问题了吗? 【参考方案1】:您需要从 iOS 8.0 开始明确请求权限。这样做的步骤:
-
更新您的 Info.plist 文件。插入一个新键:NSLocationAlwaysUsageDescription 或 NSLocationWhenInUseUsageDescription 键,并编写将在您的应用请求权限时显示的自定义消息。
必须在您的 plist 文件中包含这两个键中的任何一个,否则将不会显示权限请求!如果您不想在警报视图中显示自定义说明文本,请将键的值字符串留空,但您仍然必须在 Info.plist 文件中包含该键!
在开始跟踪之前,请检查您是否在 iOS8 上,然后从 CLLocationManager 实例发送 RequestAlwaysAuthorization 或 RequestWhenInUseAuthorization。示例:
var locationManager = new CLLocationManager();
if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0))
locationManager.RequestAlwaysAuthorization();
在这种情况下,请在 Info.plist 文件中使用 NSLocationAlwaysUsageDescription 键。请注意,Xamarin Studio 目前不会从下拉列表中自动为您提供此密钥,您必须在此处手动输入/复制粘贴此密钥。
【讨论】:
要考虑的另外 2 件事:如果您使用 Xamarin.Mobile(而不是直接使用 CLLLocationManager),则只需确保您对 Xamarin.Mobile 组件进行了最新(ios8 后)更新,替换步骤 #2也。现有项目不会自动更新到它。然后,只需在 Geolocator 上调用 StartListening 即可启动提示。我还发现地图应用程序甚至没有获得我为模拟器设置的自定义坐标。因此,必须通过将自定义位置设置为“无”,然后再返回自定义位置,将模拟器位置恢复到工作状态。 不适合我。这些我都做了。我得到相同的位置(纬度 = 37.785834。经度 = -122.406517)【参考方案2】:使用 iOS 模拟器时,您需要为模拟器硬件设置自定义位置。转到调试,选择位置,自定义位置,然后设置首选坐标。
【讨论】:
我相信你是对的! : ) 事实上,我正在学习的课程中的讲师甚至明确表示,Apple 总部坐标是正在使用的模拟器的预期返回值(可能是默认值),并且这些是她所期望的值。跨度> 【参考方案3】:为方法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 空字符串。
然后清理构建并运行应用程序。它显示了我当前所在位置的纬度和经度。
【讨论】:
【参考方案4】:我尝试了上述解决方案,但没有奏效。问题是当您的目标是 IOS >= 9.0 时,位置管理器会更改一些权限变量,这些变量应该在 info.pList 中明确提及。
<key>NSLocationWhenInUseUsageDescription</key>
<string>Why you need Location</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Why you need Location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Why you need Location</string>
<key>NSLocationWhileInUsage</key>
<string>Why you need Location</string>
如果您想针对 9.0 之前和之后的所有版本,请使用这四个键。
还要注意,这条线表示用户是在前台还是后台使用位置(苹果不鼓励这样做,因为它有隐私的潜力)check documentation here
[locationManager requestAlwaysAuthorization];
这意味着,
[locationManager requestWhenInUseAuthorization];
仅在应用处于前台时使用check documentation here
【讨论】:
以上是关于iOS 7 到 iOS 8 中当前位置纬度和经度的不同行为的主要内容,如果未能解决你的问题,请参考以下文章