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