• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - Xamarin iOS - CLLocationManager 在后台以设定的时间间隔获取位置

[复制链接]
菜鸟教程小白 发表于 2022-12-13 09:49:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试向我的应用程序添加一项功能,该功能需要以设定的时间间隔获取用户的当前位置。问题是每当我使用 System.Threading.Timer 时,创建一个新的 System.Threading.Thread 并使用 Thread.Sleep(),或使用 NSTimer.CreateScheduledTimer 当应用程序在后台时,应用程序将停止 CLLocationManager 运行。

LocationManager.cs

public class LocationManager
{
    protected CLLocationManager locationManager;
    /// <summary>
    /// Time in milliseconds between location checking.
    /// </summary>
    private int serviceMillisecondTimeout = 10000;

    public LocationManager()
    {
        this.locationManager = new CLLocationManager();

        // iOS 8 additional permissions requirements
        if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
        {
            locationManager.RequestAlwaysAuthorization();
        }

        locationManager.LocationsUpdated += onLocationUpdated;
        locationManager.DistanceFilter = 1;
        locationManager.DesiredAccuracy = 1;
    }

    public CLLocationManager LManager
    {
        get { return locationManager; }
    }

    public void startLocationUpdates()
    {
        if (CLLocationManager.LocationServicesEnabled)
        {
            locationManager.StartUpdatingLocation();
        }
    }

    public void stopLocationUpdates()
    {
        locationManager.StopUpdatingLocation();
    }

    public void onLocationUpdated(object sender, CLLocationsUpdatedEventArgs e)
    {
        // stop location updates until timer calls StartUpdatingLocation
        locationManager.StopUpdatingLocation();

        var coordinate = e.Locations[e.Locations.Length - 1].Coordinate;
        double lat = coordinate.Latitude;
        double lon = coordinate.Longitude;

        // do stuff with coordinates

        // This will work until the application goes into the background.
        // The same thing seems to happen whenever I try creating
        // new threads, or any other form of a timer.
        //
        // Without any sort of timer or new thread, it will call
        // StartUpdatingLocation in the background and will
        // continue to run indefinitely.
        NSTimer t = NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(serviceMillisecondTimeout), delegate
        {
            if (CLLocationManager.LocationServicesEnabled)
            {
                locationManager.StartUpdatingLocation();
            }
        });
    }
}

如何设置明确的时间间隔并仍然能够在后台运行位置更新?



Best Answer-推荐答案


平台不支持此功能。您可以在后台或离开设置的地理围栏时订阅重要的位置更改,但您不能强制您的代码在后台以特定间隔获取位置修复。这是 iOS 平台的限制/限制,您对此无能为力。

最接近你想要的可能是Getting Location Events in the Background .

关于ios - Xamarin iOS - CLLocationManager 在后台以设定的时间间隔获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949539/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap