【问题标题】:Run a task at fixed time everyday每天固定时间运行一个任务
【发布时间】:2018-07-02 12:10:57
【问题描述】:

我想在每天的固定时间运行一个函数(进行 api 调用),比如每天上午 10 点和晚上 10 点。 swift 中的 cronjob 等价物是什么?

我尝试将 Timer 实现为:

var dateComponents = DateComponents()

dateComponents.timeZone = TimeZone(abbreviation: "NPT") 
dateComponents.hour = 10
dateComponents.minute = 00

let userCalendar = Calendar.current
let myTime = userCalendar.date(from: dateComponents)

let timer = Timer(fireAt: myTime!, interval: 0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

选择器功能:

@objc func updateTimer() {
    print("Hello")
}

选择器函数不是在指定时间运行,而是在我每次运行应用程序时执行,而不是在指定时间执行。我该如何解决这个问题?

编辑:我也需要从后台运行它。我将在我的应用中使用定位服务。

【问题讨论】:

  • 我已经编辑了问题:我也需要在后台
  • iOS 没有等效的 cron。您可以安排本地通知,但如果应用程序不在前台,则它不会运行。唯一支持的用于定期获取数据的后台模式是 Background Fetch,但 iOS 决定运行它的频率,而不是您
  • @NishuPriya “应用程序未打开”和“应用程序在后台”是不同的东西,请区分一下。
  • @Scriptable 我正在使用标准位置服务在应用程序中获取位置更新(应用距离过滤器,禁用暂停位置更新)并启用后台模式。定时器不是继续在后台运行吗?

标签: ios swift timer repeat


【解决方案1】:

如果不使用推送通知,就无法实现您的目标。 Timer 正在使用运行循环,因此不在后台工作。也没有用于定期调用 API 的后台模式。

唯一的选择是每天在指定时间从您的服务器发送推送通知,并响应在您的应用中接收到推送通知,进行 API 调用。当然,您需要互联网连接才能使推送通知正常工作,但是由于您要进行 API 调用,这不会有什么不同,因为无论如何您都需要互联网连接才能使 API 调用成功。

【讨论】:

  • 我将闹钟设置为每天运行并在闹钟响起时调用我的函数如何?只是一个想法,不确定它是否会起作用。对此有何建议?
  • 您不能使用警报来触发函数调用。这就是Timer 的用途,但正如我所说,它们不能在后台运行,或者当您的应用程序根本没有运行时。正如我所说,推送通知解决方案没有真正的替代方案。
  • 好的,知道了。我想知道的一件事是,如果我启用位置更新并允许 backgroundLocationUpdates,那么在这种情况下,计时器是否仍不会无限期地运行?每次我有位置更新时,我都会运行计时器,计时器会持续几分钟并且工作正常。
  • @Sujal 不,一旦您的应用程序终止,Timer 将停止工作。位置更新不会阻止您的应用程序被终止,如果更新已终止,它们只会在更新到达时重新启动您的应用程序。但是,这意味着 Timer 在这种情况下将不起作用。您实际上是在使用位置更新来跟踪用户的位置,还是仅仅作为后台模式来做其他事情?如果是后者,您的应用可能会被 Apple 拒绝。
  • 我使用位置更新来进行位置跟踪,而不是做其他事情。应用程序终止是完全由 ios 决定的,还是我们可以确定应用程序不会终止的时间限制?
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 2015-05-09
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
相关资源
最近更新 更多