一直在研究这个主题,好奇是否有可能安排一个功能在特定时间运行,就像你可以安排本地通知在特定时间触发一样。即使应用程序已关闭或在后台运行,也需要运行此程序。
用例:
我正在开发一个应用程序,该应用程序当前每天向用户发送一条随机消息"来自一系列可能的消息"作为本地通知。在用户从datepicker指定的特定时间触发此本地通知。即使应用程序关闭,所有这一切都按预期工作。
现在,我正试图找出一种方法来显示应用内收到的最后一个随机通知的内容。我想在body.content"随机消息"中设置标签文本。当地通知...但只有在收到通知后才能通知。我不想在应用程序发布之前将其显示在应用程序中。示例:用户打开应用程序,设置要在下午3点收到的本地通知时间。用户关闭应用程序,通知在下午3点收到,他们在下午4点打开应用程序,应用程序内的标签显示他们收到的相同消息作为通知。应用程序中的消息应保持不变,直到第二天下午3点,因为本地通知设置为重复。
问题显然是您无法检索已发送的本地通知的内容。这就是为什么我想知道是否可以在特定时间安排功能。如果是这样,我可以将生成的消息保存为userdefault值,然后在5秒内触发UNTimeIntervalNotification并使用相同的保存值。当应用程序打开时,我可以使用保存的值更新label.text。这样,每次打开应用程序时,应用程序中的标签将始终与上次收到的通知相同。
我是快速语言的新手,对此问题的可能解决方案的任何其他建议将不胜感激。
答案 0 :(得分:1)
如果要在特定时间运行代码,则应使用Timer类。它非常适合以特定的时间间隔重复执行代码,但它也非常适合在您指定的确切时间运行代码。
这是使用Timer构造函数完成的,该构造函数接受计时器应该触发的Date。您可以根据需要创建此日期,这使得此方法变得如此灵活。
作为一个简单的例子,这将创建一个在五秒钟内调用runCode()方法的计时器:
let date = Date().addingTimeInterval(5)
let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(runCode), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
答案 1 :(得分:0)
您需要做一些事情列表,这取决于您希望函数执行的操作。原因是因为当应用程序处于后台时,所有进程最初都会暂停,直到应用程序再次进入前台。您可以在后台运行应用,但必须遵循苹果规则(如果您不这样做,那么您的应用将不会在应用商店中接受)。例如,您可以在应用程序在后台播放音频。 See this tutorial for an example.一旦您创建了应用程序以便它在后台运行,您将需要在特定时间调用该函数。使用通知会很好,但实际上这是你的偏好。至于你的应用程序关闭时运行一个功能,我不认为你应该这样做。
答案 2 :(得分:0)
在后台执行模式下,您可以启动计时器。
1)您需要选择使用beginBackgroundTaskWithExpirationHandler
进行后台执行。
2)在主线程上创建Timer
,或者您需要手动将其添加到mainRunLoop
RunLoop.main.add(timer, forMode: .defaultRunLoopMode)
注意:强> 关于背景模式你必须知道的事情。
已关闭状态
当app未处于活动状态时,运行计时器是没有意义的。