Я создаю фоновый процесс в 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 остановит фоновый процесс, и в тестировании он работает нормально, но когда я на самом деле пытаюсь какое-то время использовать приложение, кажется, что оно "забудет" о фоновом процессе, а не убей это правильно. У кого-нибудь есть предложение, почему это / как это исправить? Любая помощь приветствуется.