2016-11-06 105 views
5

我正在为我的学校创建一个应用程序,如果网站上有新标记,应每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是任务。

提前致谢!

+0

当应用程序终止时无法执行此操作。请检查我的答案。随意问任何疑问:) – KrishnaCA

+0

你打算在后台运行的应用程序的无限时间或只是当应用程序被终止? –

+0

我的理解是,你想在后台无限期地运行它,并且每当计数器得到更新的标记数,你想发送通知,那你打算怎么做? –

回答

9

你有两个选择

  1. 后台应用刷新
  2. 无声推送通知

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

+0

我读过应用程序(_:performFetchWithCompletionHandler :)不会每n分钟执行一次任务。是不是? –

+0

是的。 iOS会安排此调用,并且您无法知道它何时会被调用。然而,越多的应用程序使用,更多的iOS将调用这个处理程序。没有推送通知,在n分钟内没有可靠的方式来唤醒应用程序。 – Meanteacher

+0

根据这个问题,这个答案不应该被接受。 – RamGrg

3

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

应用程序终止

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

挂起的应用程序在终止时不会收到通知;系统杀死进程并回收相应的内存。如果应用程序当前正在后台运行并且未挂起,系统会在终止之前调用其应用程序委托的applicationWillTerminate:。设备重新引导时,系统不会调用此方法。

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

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

编辑:

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

+0

谢谢,我该怎么办?因为有很多离线游戏发送通知,例如,即使应用程序与多任务管理器手动关闭,此建筑也会终止.. –

+0

这是PushNotification或LocalNotification。如果这是需要的,那么我会在答案中加上这一点。等等.. – KrishnaCA

+0

是的,这就是我指的..但是当应用程序关闭时,发送localNotification的任务只会被调用一次 –

相关问题