【问题标题】:Create iOS service to keep working in the background创建 iOS 服务以继续在后台工作
【发布时间】:2020-12-27 17:03:40
【问题描述】:

我正在开发 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() 永远不会被调用!

有什么建议吗?

【问题讨论】:

  • 我的建议是先搜索再提问,因为到目前为止我已经看到了至少十几个完全相同的问题。这样一来,您既浪费了自己的时间,也浪费了其他人的时间。
  • @IvanIčin 这不是我想要的,我正在尝试找到一个解决方案来启动一项任务(当应用程序在前台时)并让它在后台运行!
  • 我在该问题中没有看到任何阻止您尝试找到的解决方案的答案。此外,为了为您的用例提供一些帮助,您需要通过推送通知来完成。

标签: ios xamarin.forms xamarin.ios background-service


【解决方案1】:

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

  1. Background Modes (deprecated in iOS 13.0)

  2. Background Tasks (iOS 13.0+)

  3. 您可以将工作委托给您的后端并利用经典的远程通知(或静默通知)

  4. 您可以人为地强制系统保持应用运行。由于您正在开发 GPS 应用程序,因此继续读取用户位置是完全合理的。它应该在后台延长应用程序的生命周期。但请注意,如果您过度使用此功能,Apple 将拒绝该应用程序。但是,如果您仍然使用用户位置信息,它应该让您的应用程序保持运行。

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2017-10-12
    • 2020-08-17
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-07-27
    相关资源
    最近更新 更多