Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有标准代码的跨平台地理定位编译器问题_C#_Ios_Plugins_Xamarin_Geolocation - Fatal编程技术网

C# 带有标准代码的跨平台地理定位编译器问题

C# 带有标准代码的跨平台地理定位编译器问题,c#,ios,plugins,xamarin,geolocation,C#,Ios,Plugins,Xamarin,Geolocation,我正在努力将集成到我的Xamarin.Forms应用程序中。我已将nuget软件包安装到.core、.droid和.ios中。我没有将它添加到解决方案中的其他项目中,因为我在mac上,它们不受支持 我添加了示例代码段(少了打印到控制台的行),但它抛出了编译器错误。我使用地理定位器添加了位于顶部,但var位置行抛出错误-仅当其包含方法标记为“async”修饰符时才能使用“await”运算符--我做错了什么 我在下面附上了一个屏幕截图: [![编译器错误][1][1] 任何想法都将不胜感激 更新 我

我正在努力将集成到我的Xamarin.Forms应用程序中。我已将nuget软件包安装到.core、.droid和.ios中。我没有将它添加到解决方案中的其他项目中,因为我在mac上,它们不受支持

我添加了示例代码段(少了打印到控制台的行),但它抛出了编译器错误。我使用地理定位器添加了
位于顶部,但
var位置
行抛出错误-
仅当其包含方法标记为“async”修饰符时才能使用“await”运算符-
-我做错了什么

我在下面附上了一个屏幕截图:

[![编译器错误][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;
    }
}
名称空间MyApp
{
公共部分类主页:ContentPage
{
//类定义
公共主页(IAdapter适配器)
{
初始化组件();
this.adapter=适配器;
var LocManager=new CLLocationManager();
LocManager.AuthorizationChanged+=(发送方,参数)=>{
Debug.WriteLine(“授权更改为:{0}”,args.Status);
};
if(UIDevice.CurrentDevice.CheckSystemVersion(8,0))
LocManager.RequestAlwaysAuthorization();
NewDeviceButton.Clicked+=async(发送方,e)=>{
//我希望能够使用GetLatitude的代码。
}
}
异步任务GetLongitude()
{
var定位器=CrossGeolocator.Current;
locator.DesiredAccuracy=50;
var position=await locator.GetPositionAsync(timeout毫秒:10000);
var经度=位置经度;
返回经度;
}
}
但是,我收到以下错误消息。
在iOS 8.0及更高版本上,您必须在Info.plist文件中设置nsLocationWhenInUsageDescription或NSLocationAlwaysUsageDescription以启用位置更新的授权请求!
我最初只有异步方法,但在看到错误消息并阅读应用程序说明后,我在顶部添加了附加代码以尝试并授权位置服务。但是,我现在收到一条错误消息,提示
错误CS0246:找不到类型或命名空间名称“CLLocationManager”。是否缺少程序集引用?(CS0246)
这显示在var LocManager行上。这是为什么?我应该做些什么来修复它?

在异步方法中运行等待方法是正常的

因此,您需要在OS项目中调用您的方法

以下是使用geolocator插件的步骤:

在xamarin表单项目上创建接口:

public interface ILocation
    {
        Task<Position> GetLocation();
    }
公共接口ILocation
{
任务GetLocation();
}
在操作系统项目(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;
        }
    }
公共类位置\u Android:活动,ILocation
{
公共异步任务GetLocation()
{
返回等待GetPosition();
}
私有异步任务GetPosition()
{
位置结果=空;
尝试
{
var定位器=CrossGeolocator.Current;
locator.DesiredAccuracy=50;
if(locator.IsListening!=true)
{
定位器。惊人监听(minTime:1000,minDistance:0);
}
var position=wait locator.GetPositionAsync(10000);
//您可以使用Xamarin.Forms.Maps.Position
//这里我使用personnal类
结果=新位置(位置.经度,位置.纬度);
}
捕获(例外e)
{
Debug(“geologitorError”,例如ToString());
}
返回结果;
}
}
在你的课堂上调用这样的方法

var position = await DependencyService.Get<ILocation>().GetLocation();
var position=wait DependencyService.Get().GetLocation();

希望这能对您有所帮助。

请不要将代码片段作为图像发布。它们很难阅读,并且使搜索引擎无法索引。@Jason抱歉,我只是做了一件额外的事情,因为我发现它有时会有所帮助。我还引用了搜索引擎代码中的错误。但我不明白为什么github上的教程代码会这样pages没有按它所说的那样工作?这些代码只是一个小片段——它假设您理解足够的C语言,可以将该片段包含在您自己的项目中。示例中的问题源于基本的C语言问题——试图在方法之外执行代码,以及不正确地使用Wait。GetLocationAsync是一个方法,必须从中调用在另一个用async关键字标记的方法中。OrcusZ在这里提到的内容对于真正需要的内容来说有点过分。您只需要从isntance的某个方法内部调用GetLocationAsync单击处理程序:@JamesMontemagno在iOS 8.0及更高版本上如何绕过
,您必须设置NSLocationWhenUsageDescripti或NSLocationWhenUsageDescriptiOption或NSLocationAlwaysUsageDescription在您的Info.plist文件中启用位置更新的授权请求!
响应?我已经在问题中列出了我的问题。在iOS 8中,您现在必须在位置管理器上调用RequestWhenUseAuthorization或RequestAlwaysAuthorization(插件会自动为您执行此操作,但是,您需要将名称简洁的NSLocationWhenInUsageDescription或NSLocationAlwaysUsageDescription添加到您的Info.plist。转到您的Info.plist并在源代码下添加以下标志之一:有关更多信息: