问题描述
我正在开发GPS车辆地理位置应用程序..如果用户在应用程序设置中激活了通知,那么它必须每隔X分钟开始检查服务器以验证是否有新的车辆警报。为此,我需要一种服务,该服务在应用程序位于前台时可以运行,并且即使用户将应用程序置于后台以继续搜索通知也可以继续运行。
所以我试图这样做(AppDelegate):
public override void DidEnterBackground(UIApplication application)
{
if (Preferences.Get(nameof(App.IsNotificationsServiceRunning),false))
{
nint taskID = UIApplication.SharedApplication.BeginBackgroundTask(() => { });
new Task(() => {
DoWork();
UIApplication.SharedApplication.EndBackgroundTask(taskID);
}).Start();
}
else
{
return;
}
}
//TIMER
public void DoWork()
{
var minutes = TimeSpan.FromMinutes(2);
Device.StartTimer(minutes,() => {
//check for notifications
checkNotificationsFromServer();
// Returning true means repeat this timer
return true;
});
}
public void checkNotificationsFromServer(){
//Some code here...
}
此代码的问题是..首先,在将应用程序放置在后台之前,它将永远不会检查通知! 其次(有点怪异),但是此解决方案可在iOS模拟器上使用,但不能在物理设备(iphone 11)上使用!这意味着当应用程序在后台运行时,永远不会调用checkNotificationsFromServer()!
有什么建议吗?
解决方法
有几种方法可以实现您想要的。
-
您可以将工作委托给后端,并利用传统的远程通知(或与此相关的静默通知)
-
您可以人为迫使系统保持应用程序运行。由于您正在开发GPS应用程序,因此完全有理由继续读取用户的位置信息。它可以延长应用程序在后台的寿命。但是请注意,如果您过度使用此功能,Apple将会拒绝该应用程序。但是,无论如何,如果您使用的是用户位置信息,它应该可以使您的应用保持运行状态。