【问题标题】:Xam.Plugin.Geolocator never returns on first run iOS 14Xam.Plugin.Geolocator 在首次运行 iOS 14 时永远不会返回
【发布时间】:2021-02-10 17:42:47
【问题描述】:

我正在我的 xamarin 应用程序中使用 CrossGeolocator.Current.StartListeningAsync 方法,以便能够在 iOS 的后台收听位置更新。

我正在使用 Essentials 请求权限。

在第一次运行时,我们获得位置许可(仅限应用程序)和使用要素的位置,然后我们使用 StartListeningAsync for ios 来跟踪应用程序在后台或前台的位置。

当回调被点击时,我们会收到一个弹出窗口,说这个应用程序使用后台位置,并为您提供使用它或更改回仅在应用程序中使用选项的选项。在选择任何选项时,回调永远不会完成并且后续代码不会运行。

这是我获得使用时的权限然后开始收听后得到的弹出窗口:

Popup on ios

在手动设置权限后的后续运行中,回调起作用。

Xamarin 表单版本:5.0.0.1931 Xamarin 基本版本:1.6.1 地理定位器插件版本:4.6.2-beta 代码示例:

    private async Task StartListening()
    {
        if (CrossGeolocator.Current.IsListening)
            return;

        try
        {
            var settings = new ListenerSettings
            {
                ActivityType = ActivityType.Other,
                DeferLocationUpdates = true,
                DeferralDistanceMeters = 15,
                DeferralTime = TimeSpan.FromSeconds(10),
                ListenForSignificantChanges = false,
                PauseLocationUpdatesAutomatically = false,
                AllowBackgroundUpdates = true,
            };
            
            await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(15), 5, true, settings);
            
            CrossGeolocator.Current.PositionChanged += PositionChanged;
            CrossGeolocator.Current.PositionError += PositionError;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

【问题讨论】:

  • 您好,在开始收听位置更新之前,您需要获得许可。如果权限好,则调用StartListening方法。

标签: xamarin xamarin.forms xamarin.ios


【解决方案1】:

在开始收听位置更新之前,您需要确保权限正常。试试下面的代码:

public async Task GetLocationAsync()
{
    var status = await CheckAndRequestPermissionAsync(new Permissions.LocationAlways());
    if (status != PermissionStatus.Granted)
    {
        // Notify user permission was denied
        return;
    }else{
        await StartListening();
    }
}

public async Task<PermissionStatus> CheckAndRequestPermissionAsync<T>(T permission)
            where T : BasePermission
{
    var status = await permission.CheckStatusAsync();
    if (status != PermissionStatus.Granted)
    {
        status = await permission.RequestAsync();
    }

    return status;
}

【讨论】:

  • 您好,感谢您的回复。在我开始收听时,我已经获得了使用时间的许可。我认为问题出现是因为我要求允许后台更新。因此,在调用 CrossGeolocator.Current.StartListeningAsync 时,我会从系统中弹出另一个弹出窗口,即您是否应该继续使用带有是/否选项的后台位置。我将在答案中附上屏幕截图,似乎无法在评论中这样做。
  • 原始问题中的图片。
  • @user2641023 好吧,你的意思是后台位置的共享选项中断了监听器的回调。如果是这样,您可以要求:Permissions.CheckStatusAsync&lt;Permissions.LocationAlways&gt;(); 以检查该弹出窗口是否稍后会显示。
  • 是的,很抱歉绕道而行。我不知道为什么它会问这个?好的,只有在我知道我总是有位置之后,我才会开始听。如果可行,我们会尽快提供反馈。
  • 好的,在我的情况下是的,确保在收听之前我有 LocationAlways 是正确的解决方案。谢谢@JuniorJiang。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2019-11-15
  • 2011-07-25
  • 1970-01-01
  • 2012-10-02
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多