我想知道如何拥有一个每天执行一次的功能。在我的情况下,我希望用户回答每日问题,答案将与用户保持一天。第二天,将会问一个新问题,等等。我被告知,当用户不使用该应用程序时,您无法执行功能。所以我想知道是否有办法设置一个到期的计时器(例如24小时)并基本上删除了答案?如果你有什么方法可以解决这个问题,我真的很感激你们的学习形式。
目前我正在使用Parse.com来检索我的问题,我不确定是否应该将问题保存到解析中或将它们作为NSUserDefaults保存,因为我不知道如何处理上述问题。
答案 0 :(得分:1)
有几种方法:
本地通知:您可以安排本地通知(如果用户向应用授予通知权限)将在某个预定时间向用户显示通知。如果用户点按通知,则会打开该应用。 (但是,如果用户未点按通知,则不会打开该应用。)
后台获取:您可以拥有应用程序请求后台获取功能,其中操作系统将允许应用程序发出非常快速的网络请求,以查看是否有任何要检索的数据。您可以将其与本地通知结合使用,以便在有新问题时让用户知道。请注意,您无法控制此时间,因此无法保证每天进行,更不用说每天都在一致的时间进行。尽管如此,这是应用程序检查新数据的简便方法,用户无需自行运行应用程序。
请参阅 iOS应用编程指南中的Fetching Small Amounts of Data Opportunistically。
与本地通知相关,您还可以使用推送通知进行娱乐(当有新问题可用时,您的网络服务会主动通知用户)。此推送通知服务将在上述Local and Remote Notification Programming Guide中讨论。
当用户启动应用程序时,您可以将当前日期和时间与与上次已知问题相关联的日期和时间进行比较,以查看您是否提出最后一个问题,或者您是否发起网络请求以获取下一个。
关于在哪里存储答案,NSUserDefaults
几乎肯定是错误的地方。如果要在本地保存它,请将其保存到永久存储(存档等)或使用Core Data。但是,将其保存回网络有一个好处,即可以跨设备同步应用程序的问题和答案的状态。
答案 1 :(得分:0)
你可以这样做(将其保存在Parse或NSUserDefaults
中)。至于每天提出一个问题,你需要首先确保每次用户回答一个问题时给你一个时间戳,然后检查你的上一个时间戳是否超过24小时。
所以,你(粗略地)说出这样的话:
<强>的OBJ-C:强>
const uint DAY_IN_SECONDS = 24 * 60 * 60;
if (fabs([lastTimeTheUserAnsweredTimestamp timeIntervalSinceNow]) > DAY_IN_SECONDS) {
// present today's question.
} else {
// you've already answered today's question.
}
<强>夫特:强>
let DAY_IN_SECONDS = 24 * 60 * 60;
if (fabs(lastTimeTheUserAnsweredTimestamp.timeIntervalSinceNow()) > DAY_IN_SECONDS) {
// present today's question.
} else {
// you've already answered today's question.
}
这当然假设lastTimeTheUserAnsweredTimestamp
是NSDate。