标准代码的跨平台 GeoLocation 编译器问题
Posted
技术标签:
【中文标题】标准代码的跨平台 GeoLocation 编译器问题【英文标题】:Cross Platform GeoLocation compiler issue with standard code 【发布时间】:2015-09-18 12:38:58 【问题描述】:我正在努力将 geolocator plugin 集成到我的 Xamarin.Forms 应用程序中。我已将 nuget 包安装到 .core、.droid 和 .ios 中。我没有将它添加到解决方案中的其他项目,因为我在 mac 上并且不支持它们。
我已经添加了示例 sn-p(少打印到控制台行),但它会引发编译器错误。我在顶部添加了using Geolocator;
,但var position
行抛出错误-the 'await' operator can only be used when its containing method is marked with the 'async' modifier
-我做错了什么?
我在下面添加了一个屏幕截图:
[![编译器错误][1]][1]
任何想法将不胜感激。
更新
我的代码现在运行,我的结构如下:
namespace MyApp
public partial class HomePage : ContentPage
// Class Definitions
public HomePage(IAdapter adapter)
InitializeComponent();
this.adapter = adapter;
var LocManager = new CLLocationManager();
LocManager.AuthorizationChanged += (sender, args) =>
Debug.WriteLine ("Authorization changed to: 0", args.Status);
;
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
LocManager.RequestAlwaysAuthorization();
NewDeviceButton.Clicked += async (sender, e) =>
//Code which I would like to be able to use GetLatitude.
async Task<double> GetLongitude()
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000);
var longitude = position.Longitude;
return longitude;
但是,我收到以下错误消息。
On iOS 8.0 and higher you must set either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription in your Info.plist file to enable Authorization Requests for Location updates!
我原本只有异步方法,但是看到错误信息并阅读了您的应用说明,我在顶部添加了附加代码以尝试授权定位服务。但是,我现在收到一条错误消息,指出 Error CS0246: The type or namespace name 'CLLocationManager' could not be found. Are you missing an assembly reference? (CS0246)
这显示在 var LocManager 行上。为什么会这样,我应该怎么做才能解决它?
【问题讨论】:
请不要将代码 sn-ps 发布为图像。它们难以阅读,使搜索引擎无法编制索引。 @Jason 道歉,只是作为额外的事情,因为我发现它有时会有所帮助。我还引用了搜索引擎代码中的错误。 【参考方案1】:async 方法中需要运行 await 方法是正常的。
因此,您需要在 OS 项目中调用您的方法。
使用地理定位器插件的步骤如下:
在您的 xamarin 表单项目上创建一个界面:
public interface ILocation
Task<Position> GetLocation();
在您的 OS 项目(android、IOS 或 WP)中创建一个类
这里是 Android 的示例
public class Location_Android : Activity, ILocation
public async Task<Position> GetLocation()
return await GetPosition();
private async Task<Position> GetPosition()
Position result = null;
try
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
if (locator.IsListening != true)
locator.StartListening(minTime: 1000, minDistance: 0);
var position = await locator.GetPositionAsync(10000);
//You can use Xamarin.Forms.Maps.Position
//Here I use a personnal class
result = new Position(position.Longitude, position.Latitude);
catch (Exception e)
Log.Debug("GeolocatorError", e.ToString());
return result;
在你的课堂上调用这样的方法
var position = await DependencyService.Get<ILocation>().GetLocation();
希望对你有帮助。
【讨论】:
但是我不明白为什么 github 页面上的教程代码不能像它说的那样工作? 该代码只是一个小的 sn-p - 它假定您了解足够的 C# 以将该 sn-p 包含在您自己的项目中。您示例中的问题源于基本的 C# 问题 - 尝试在方法之外执行代码,以及不正确地使用 await。 GetLocationAsync 是一种方法,必须从另一个标有 async 关键字的方法中调用。 OrcusZ 在这里提到的对于真正需要的东西来说有点多。您只需要从某个方法内部调用 GetLocationAsync 即可获得点击处理程序:github.com/jamesmontemagno/Xamarin.Plugins/blob/master/… @JamesMontemagno 如何绕过On iOS 8.0 and higher you must set either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription in your Info.plist file to enable Authorization Requests for Location updates!
响应?我已经在问题中写下了我的问题。
在 iOS 8 中,您现在必须在位置管理器上调用 RequestWhenInUseAuthorization 或 RequestAlwaysAuthorization(插件会自动为您执行此操作,但是,需要将简洁命名的 NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription 添加到您的 Info.plist . 转到您的 info.plist 并在源下添加以下标志之一:screencast.com/t/YEeuAYMBBJ 更多信息:motzcod.es/post/97662738237/scanning-for-ibeacons-in-ios-8以上是关于标准代码的跨平台 GeoLocation 编译器问题的主要内容,如果未能解决你的问题,请参考以下文章
JS新API标准 地理定位(navigator.geolocation)
JS新API标准 地理定位(navigator.geolocation)/////////zzzzzzzzzzz