标准代码的跨平台 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

JS新API标准 地理定位(navigator.geolocation

Android平台无法调用geolocation插件

使用 Geolocation 插件编译时出错

如何让 HTML5 Geolocation 更准确?