创建iOS服务以保持后台运行

问题描述

我正在开发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()!

有什么建议吗?

解决方法

有几种方法可以实现您想要的。

  1. Background Modes (deprecated in iOS 13.0)

  2. Background Tasks (iOS 13.0+)

  3. 您可以将工作委托给后端,并利用传统的远程通知(或与此相关的静默通知)

  4. 您可以人为迫使系统保持应用程序运行。由于您正在开发GPS应用程序,因此完全有理由继续读取用户的位置信息。它可以延长应用程序在后台的寿命。但是请注意,如果您过度使用此功能,Apple将会拒绝该应用程序。但是,无论如何,如果您使用的是用户位置信息,它应该可以使您的应用保持运行状态。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...