C# 需要知道如何在Xamarin.iOS中终止后台进程

C# 需要知道如何在Xamarin.iOS中终止后台进程,c#,ios,xamarin,background-service,C#,Ios,Xamarin,Background Service,我在iOS中创建了一个后台进程来向服务器发送位置更新,但是我在从主应用程序控制它时遇到了问题。大多数情况下,我很难终止服务。我的应用程序使用一个按钮来启动/停止后台进程,并确定进程是否仍在运行 我在一个类中使用了两个方法,StartListening使用一个计时器来启动位置更新,而StopListening则会终止计时器。但我不能总是终止后台进程,尤其是在应用程序关闭的情况下。我没有Android的问题,因为API负责启动和停止定位过程,但是iOS,我必须手动完成 public void

我在iOS中创建了一个后台进程来向服务器发送位置更新,但是我在从主应用程序控制它时遇到了问题。大多数情况下,我很难终止服务。我的应用程序使用一个按钮来启动/停止后台进程,并确定进程是否仍在运行

我在一个类中使用了两个方法,StartListening使用一个计时器来启动位置更新,而StopListening则会终止计时器。但我不能总是终止后台进程,尤其是在应用程序关闭的情况下。我没有Android的问题,因为API负责启动和停止定位过程,但是iOS,我必须手动完成

    public void StartListening()
    {
         //class setup here

        if(CLLocationManager.LocationServicesEnabled)
        {
            locationManager.DesiredAccuracy = 10;
            locationManager.StartUpdatingLocation();
            taskId = UIApplication.SharedApplication.BeginBackgroundTask(() =>
           {
               this.timer.Dispose();
           });

            timer = new Timer(async (o) => 
            {
                CLLocation location = null;
                while(location == null)
                {
                    location = locationManager.Location;
                }
                if (location != null)
                {
                    //handle location

                }


            }, null, TimeSpan.Zero, TimeSpan.FromSeconds(UpdateInterval));
            UIApplication.SharedApplication.EndBackgroundTask(taskId);
        }
    }

    public void StopListening()
    {

        this.locationManager.StopUpdatingLocation();
        if(taskId != 0)
        {
            if (this.timer != null)
            {
                this.timer.Change(Timeout.Infinite, Timeout.Infinite);
                this.timer.Dispose();
            }

        }
    }

我希望StopLocation停止后台进程,在测试中,它工作得很好,但当我实际尝试使用应用程序一段时间时,它似乎会“忘记”后台进程,而不会正确地终止它。是否有人对这是为什么/如何解决这一问题提出了建议?感谢您的帮助。

添加以下代码

if(CLLocationManager.LocationServicesEnabled)
    {
        locationManager.DesiredAccuracy = 10;
        locationManager.RequestWhenInUseAuthorization();
        locationManager.AllowsBackgroundLocationUpdates = false;
        locationManager.StartUpdatingLocation();
        //...
    }
RequestWhenUseAuthorization仅在前台操作模式切换到后台操作模式时有效。例如,如果应用程序切换到后台操作模式,代理方法
didUpdateLocations
将不会继续

不要忘记在info.plist中添加隐私

<key>NSLocationWhenInUseUsageDescription</key>
<string>xxxx</string>
n不使用时的位置说明
xxxx

添加以下代码

if(CLLocationManager.LocationServicesEnabled)
    {
        locationManager.DesiredAccuracy = 10;
        locationManager.RequestWhenInUseAuthorization();
        locationManager.AllowsBackgroundLocationUpdates = false;
        locationManager.StartUpdatingLocation();
        //...
    }
RequestWhenUseAuthorization仅在前台操作模式切换到后台操作模式时有效。例如,如果应用程序切换到后台操作模式,代理方法
didUpdateLocations
将不会继续

不要忘记在info.plist中添加隐私

<key>NSLocationWhenInUseUsageDescription</key>
<string>xxxx</string>
n不使用时的位置说明
xxxx

iOS上没有“后台进程”。只有当应用程序即将挂起(即已处于后台状态)并且需要一些额外时间(最多180秒)时,才应调用
beginBackgroundTask
。你也不需要定时器。当您开始位置更新时,将定期调用
didUpdateLocations
delegate方法。在这里,您可以将数据发送到服务器。如果不想每秒钟发送一次,可以检查自上次更新以来的间隔。@user2850818您可以在此处找到答案。请检查链接-Xamarin相关问题请在iOS上询问,没有“后台流程”。只有当应用程序即将挂起(即已处于后台状态)并且需要一些额外时间(最多180秒)时,才应调用
beginBackgroundTask
。你也不需要定时器。当您开始位置更新时,将定期调用
didUpdateLocations
delegate方法。在这里,您可以将数据发送到服务器。如果不想每秒钟发送一次,可以检查自上次更新以来的间隔。@user2850818您可以在此处找到答案。请检查链接-Xamarin相关问题请在