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

时间:2016-11-06 13:03:09

标签: 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()
    }
}

选择器findMark是任务。

提前致谢!

3 个答案:

答案 0 :(得分:10)

您有两个选择

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

答案 1 :(得分:4)

在应用终止后,无法执行问题中描述的任务。如文档中所述:

  

应用终止

     

应用程序必须随时准备终止,并且不应等待保存用户数据或执行其他关键任务。系统启动的终止是应用程序生命周期的正常部分。系统通常会终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可能会终止行为不当或未及时响应事件的应用程序。

     

暂停的应用在终止时不会收到通知;系统终止进程并回收相应的内存。如果某个应用当前正在后台运行且未暂停,则系统会在终止之前调用其应用委托的applicationWillTerminate :.当设备重新启动时,系统不会调用此方法。

     

除了终止您的应用程序的系统之外,用户还可以使用多任务UI显式终止您的应用程序。用户启动的终止与终止暂停的应用程序具有相同的效果。应用程序的进程被终止,并且没有通知应用程序。

链接:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

修改

应用程序终止后,您无法执行任何任务。您可以做的是从服务器端完成计算并将Push Notification发送到设备。

答案 2 :(得分:0)

准确地说,答案是肯定的。但是你不应该。 我们可以使用位置来存档您的目标。 在以下位置添加为正式文档:https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW10

  

注意:如果您的应用被用户或系统终止,则   新位置时系统不会自动重新启动您的应用   更新到达。用户必须先明确重新启动您的应用,然后才能   恢复位置更新。拥有您的应用程序的唯一方法   自动重新启动是使用区域监视或   重大更改位置服务。

因此,我们可以使用启动重要更改位置服务对其进行存档:

  

如果您保持重大更改位置服务的运行状态,并且   iOS应用随后被暂停或终止,该服务   当新的位置数据到来时,系统会自动唤醒您的应用。在   唤醒时间,该应用程序将进入后台,并且会为您提供   少量时间(约10秒)以手动重启位置   服务并处理位置数据。 (您必须手动重启   在任何待处理位置之前在后台提供位置服务   如知道何时启动中所述,可以交付更新   位置服务。)由于您的应用程序在后台运行,因此必须   减少工作量,避免执行任何其他任务(例如查询网络)   可能会阻止它在分配的时间到期之前返回。如果   否,您的应用将被终止。如果iOS应用程序需要更多   时间处理位置数据,它可以请求更多背景   执行时间使用   beginBackgroundTaskWithName:expirationHandler:的方法   UIApplication类。

willFinishLaunchingWithOptions和applicationDidBecomeActive中的呼叫位置更新然后,您可以在

之后执行自己的代码
[_locationManager startUpdatingLocation];

但是会耗尽电池电量,可能会被应用商店拒绝。