我正在为我的学校创建一个应用程序,如果网站上有新标记,应该每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 :(得分:10)
您有两个选择
答案 1 :(得分:4)
在应用终止后,无法执行问题中描述的任务。如文档中所述:
应用终止
应用程序必须随时准备终止,并且不应等待保存用户数据或执行其他关键任务。系统启动的终止是应用程序生命周期的正常部分。系统通常会终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可能会终止行为不当或未及时响应事件的应用程序。
暂停的应用在终止时不会收到通知;系统终止进程并回收相应的内存。如果某个应用当前正在后台运行且未暂停,则系统会在终止之前调用其应用委托的applicationWillTerminate :.当设备重新启动时,系统不会调用此方法。
除了终止您的应用程序的系统之外,用户还可以使用多任务UI显式终止您的应用程序。用户启动的终止与终止暂停的应用程序具有相同的效果。应用程序的进程被终止,并且没有通知应用程序。
修改强>
应用程序终止后,您无法执行任何任务。您可以做的是从服务器端完成计算并将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];
但是会耗尽电池电量,可能会被应用商店拒绝。