Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在特定时间在颤振应用程序中运行任务_Android_Ios_Swift_Flutter_Scheduled Tasks - Fatal编程技术网

Android 在特定时间在颤振应用程序中运行任务

Android 在特定时间在颤振应用程序中运行任务,android,ios,swift,flutter,scheduled-tasks,Android,Ios,Swift,Flutter,Scheduled Tasks,你好,Flitter/移动开发者 我手头有一个特别的问题,我需要一些建议。我需要创建一个应用程序,将在一天中的特定时间执行特定任务。时间每天都会改变,它会在午夜(或非高峰时间)通过REST呼叫获得更新的时间。无论发生什么情况,任务都必须在预定的时间完成,即使是在设备重新启动后,等等。我已经深入研究了这一点,并且我感到Flatter不能很好地处理预定的任务,特别是在iOS中,它可以以任何原因终止应用程序 我研究过的选项有: workmanager():这似乎是最有希望的,如果不是15分钟的最低频率

你好,Flitter/移动开发者

我手头有一个特别的问题,我需要一些建议。我需要创建一个应用程序,将在一天中的特定时间执行特定任务。时间每天都会改变,它会在午夜(或非高峰时间)通过REST呼叫获得更新的时间。无论发生什么情况,任务都必须在预定的时间完成,即使是在设备重新启动后,等等。我已经深入研究了这一点,并且我感到Flatter不能很好地处理预定的任务,特别是在iOS中,它可以以任何原因终止应用程序

我研究过的选项有:


  • workmanager():这似乎是最有希望的,如果不是15分钟的最低频率,这对我来说是不够的。我需要每分钟检查一下是否是完成任务的时间。有办法绕过这个限制吗

  • 本机解决方案。我对本机iOS和Android编码几乎没有经验,所以我不喜欢这个解决方案。但通过一些研究,我看到了一些可以通过这种方法安排任务的例子

  • 服务器端通知。从表面上看,这似乎是一个很好的解决方案,我需要这方面的建议。是否该运行任务的计算将在服务器端进行,并且可以向设备发送通知(例如,通过Firebase),从而触发要运行的任务。这是否可行,设备在收到通知时是否会实际运行代码


  • 这就是我的选择。你认为哪个最可行?如果有比我更有移动经验的人能帮助我,我将不胜感激,也许有一个比我提出的三个更好的解决方案。谢谢。

    您可以通过Firebase发送数据通知,并通过
    onBackgroundMessage
    回调处理这些通知。请看这里:

    Future\u firebaseMessagingBackgroundHandler(RemoteMessage)异步{
    //如果要在后台使用其他Firebase服务,例如Firestore,
    //确保在使用其他Firebase服务之前调用'initializeApp'。
    等待Firebase.initializeApp();
    打印(“处理背景消息:${message.messageId}”);
    }
    void main(){
    FirebaseMessagingBackgroundMessage(_firebaseMessagingBackgroundHandler);
    runApp(MyApp());
    }
    
    从文档(Android/Apple)中:

  • 它不能是匿名函数
  • 它必须是顶级函数(例如,不是需要初始化的类方法)

  • 您可以通过Firebase发送数据通知,并使用
    onBackgroundMessage
    回调来处理它们。请看这里:

    Future\u firebaseMessagingBackgroundHandler(RemoteMessage)异步{
    //如果要在后台使用其他Firebase服务,例如Firestore,
    //确保在使用其他Firebase服务之前调用'initializeApp'。
    等待Firebase.initializeApp();
    打印(“处理背景消息:${message.messageId}”);
    }
    void main(){
    FirebaseMessagingBackgroundMessage(_firebaseMessagingBackgroundHandler);
    runApp(MyApp());
    }
    
    从文档(Android/Apple)中:

  • 它不能是匿名函数
  • 它必须是顶级函数(例如,不是需要初始化的类方法)
  • 时间每天都会改变,它会在午夜(或非高峰时间)通过REST呼叫获得更新的时间

    这闻起来像是糟糕的建筑。为什么?

    • 您正在午夜对更新服务器进行DDOS攻击(如果您在同一时区有多个用户)。你可以在几秒钟内错开你的HTTP请求来修复这个问题,但这是一个创可贴,而不是长期解决方案。
    • 因为您正在反转依赖关系:听起来时间是服务器的责任(因此您的客户机打电话询问最新时间)。您的客户机不应该是请求服务器更新的客户机,因为现在您的客户机有两个作业:计划更新,同时为用户计划计划任务。让客户机询问服务器是错误的方向。您应该从服务器发送消息以更新设备上的计划
    • 即使您确实轮询服务器以获取计划更新,您也应该在需要的时候发出移动应用程序计划通知/警报。使用静默通知是一种已知的解决iOS后台调度限制的方法。在Android上,WorkManager是,您应该使用
      AlarmManager
    • 下面是另一个StackOverflow如何考虑使用本地通知来解决这个问题:used
    回答要点
  • 在Android上,不要使用WorkManager,而是使用AlarmManager,或者更好的是,使用计划通知。已经说过Android上存在一些特定于制造商的怪癖,请参阅文档:
  • 因此,当应用程序位于某些设备(如小米、华为)的后台时,计划通知可能不起作用。如果你遇到这样的问题,这就是原因。由于这是操作系统强加的限制,因此插件无法解决这一问题

  • 不必使用本机代码,通知是一种标准功能
  • 您可以暂时保留轮询架构,因为它更简单(但更脏)。即使您希望使用服务器端架构,我也会将消息从服务器发送到客户端,只更新客户端计划,不触发工作/用户警报,,否则,当听起来不需要互联网时,您的应用程序依赖于互联网(与社交媒体通知不同)。这将导致连接不良设备的用户体验不佳
  • 时间每天都会改变,它会在午夜(或非高峰时间)通过REST呼叫获得更新的时间

    这个中小企业