应用程序终止时执行后台任务

Sel*_*mpi 10 ios swift

我正在为我的学校创建一个应用程序,如果网站上有新标记,应该每隔n分钟检查一次.要在用户首次登录时执行此操作,实际标记的编号将保存在"UserDefaults"中.当应用程序终止时,在n分钟后,重新标记标记的数量并与之前的标记进行比较,并在数量发生变化时发送通知.

如果有办法执行此任务,我想知道什么.我试图在-applicationWillTerminate中创建一个计时器 - 但它只被触发一次.这是我试过的:

func applicationWillTerminate(_ application: UIApplication) {
    DispatchQueue.main.async {
        self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.findMark), userInfo: nil, repeats: true)
        self.timer.fire()
    }
}
Run Code Online (Sandbox Code Playgroud)

选择器findMark是任务.

提前致谢!

Mea*_*her 11

你有两个选择

  1. 后台程序刷新
  2. 无声推送通知

最简单的一个是后台应用刷新.因为后来需要服务器来发送通知.您可以查看以下API以了解用法.基本上,您可以在应用的功能/背景模式上设置背景提取功能.然后,iOS会不时唤醒您的应用并呼叫application(_:performFetchWithCompletionHandler:)代表.您将有大约30-45秒来调用您的函数并调用完成处理程序.如果您没有按时完成,iOS将会终止您的应用.如果您不遵守规则,iOS将减少唤醒的机会.有关背景模式的更详细用法,您可以查看以下教程

  • 是的。iOS 安排了这个调用,你无法知道它什么时候会被调用。然而,使用的应用程序越多,iOS 调用此处理程序的次数就越多。如果没有推送通知,就没有可靠的方法可以在 n 分钟内唤醒应用程序。 (2认同)
  • 错了 静默推送通知仅在后台模式下有效,而在应用终止时不起作用。请参阅[this](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_updates_to_your_app_silently)和[this](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application)。静默推送会触发委托方法,该方法的文档显示“但是,如果用户强制退出应用程序,系统不会自动启动您的应用程序。”另外,我亲自测试了该行为。 (2认同)
  • @funct7这也是错误的,(至少在iOS 13中)无声的(“content_available”:true)推送通知实际上会启动应用程序,即使它被用户完全杀死而不是在应用程序切换器中。但在这种情况下,您无法执行长时间的后台任务。来源:刚刚测试过这一点。 (2认同)