Нужно знать, как убить фоновый процесс в Xamarin.iOS - PullRequest
1 голос
/ 08 апреля 2019

Я создаю фоновый процесс в 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 голосов
/ 09 апреля 2019

Добавьте следующий код

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

RequestWhenInUseAuthorization работает только тогда, когда основной режим работы переключен в режим фонового управления.Например, если приложение переключается в фоновый режим работы, метод агента didUpdateLocations не будет продолжаться.

И не забудьте добавить конфиденциальность в info.plist

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