gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:56:21 25 4
gpt4 key购买 nike

我正在 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();
//...
}

RequestWhenInUseAuthorization仅在前台操作模式切换到后台操作模式时有效。比如App切换到后台运行模式,代理方法didUpdateLocations就不会继续。

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

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

关于c# - 需要知道如何在 Xamarin.iOS 中终止后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com