需要知道如何在Xamarin.iOS中杀死后台进程

时间:2019-04-08 15:19:51

标签: c# ios xamarin background-service

我正在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停止后台进程,并且在测试中可以正常运行,但是当我实际尝试使用该应用程序一段时间后,似乎会“忘记”后台进程,而不会正确杀死它。有谁对这是为什么/如何解决这个问题有建议?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

添加以下代码

if(CLLocationManager.LocationServicesEnabled)
    {
        locationManager.DesiredAccuracy = 10;
        locationManager.RequestWhenInUseAuthorization();
        locationManager.AllowsBackgroundLocationUpdates = false;
        locationManager.StartUpdatingLocation();
        //...
    }

RequestWhenInUseAuthorization 仅在前台操作模式切换到后台操作模式时有效。例如,如果应用切换到后台操作模式,则代理方法didUpdateLocations将不会继续。

别忘了在info.plist中添加隐私

<key>NSLocationWhenInUseUsageDescription</key>
<string>xxxx</string>