快速计算当前条纹

时间:2017-06-09 11:07:27

标签: ios swift

我想计算用户使用该应用的连续天数。

它根据条纹更新标签,如果用户在一天内没有使用该应用程序,则该数字会回到零。

我怎样才能做到这一点?我搜索过但找不到任何来源。 enter image description here

4 个答案:

答案 0 :(得分:6)

为此您需要考虑以下几点:

何时报告上次使用情况?

  • 您的应用创意可能包括之前需要执行某些操作 考虑完整用法。例如,在屏幕上加载或呈现内容后,检索数据并执行某些操作等后

  • 只是打算打开应用程序。唯一的目的是让用户点击你的应用程序的图标来启动应用程序,如果他之前将其设置为关闭状态,请不要担心甚至通过你的加载屏幕。

  

这可能有点不可预测

  • 将应用发送到后台时
  

重要的是要注意iOS可以随时杀死你的进程   应用程序被发送到后台,所以最好在用户之后立即执行   动作。

此外,用户无法再次打开您的应用。

如果要将数据保存到iPhone之外,您可以订阅后台功能,让您的应用暂停一段时间,同时转换到暂停/关闭状态。

您正在寻找的功能是applicationDidEnterBackground(_:)

  

此方法的优点

     

您上次使用的应用实际

有关应用程序生命周期以及如何正确处理它的更多信息,请访问apple documentation about this topic

我是否需要在安装和安装之间提供此信息?在哪里保存?

  • 如果您关心此计数器是稳定的并且在安装之间保持不变,则无法将其保存在任何本地数据库或NSUserDefaults中。在这种情况下,您应该通过用户创建和实施方式实现某种在线存储。在您的服务器中处理或使用 iCloud 替代方案。
  • 如果您的信息是敏感的(假设您要为您的用户提供一些奖励用于打开您的应用 1000 次),那么您无法存储它在NSUserDefaults中,因为它没有被编入并且可以被修改。

为了连续计算天数需要保存什么?

在处理存储数据时,简单性是最重要的,有很多方法可以实现这一特定任务。

我会选择:

  • 存储第一个日期(如果您正在处理日历日,则忽略时间,但如果您将24小时工作作为一天而不是那么将其包括在内)
  • 存储上次访问日期(同样的注意事项)。
  

您可以保存完整的时间戳,以便以后能够改变主意; - )

在我的应用程序中,我会在进行任何更改之前使用当前日期数据(now = NSDate())进行数学计算。

  1. 如果nowlast visit date之间的时间间隔更大”,然后使用first visit date更新now
  2. now个数据保存到last visit date存储空间。
  3.   

    您的计数器将永远是nowfirst visit date之间“”的差异。

    总结

    如果您的数据不敏感,请将其存储在NSUserDefaults,否则,如果这会影响您的收入将其存储在其他位置。如果它很敏感,但您不关心用户是否丢失了计数器,请将其保存在本地数据库中( CoreData Realm 等)

    存储新数据的最佳时间(据我考虑)将是关闭意图(包括暂停状态来电 )通知您的应用程序。

    您可以通过多种方式保存此数据,为您提供一些操作空间,只需上次访问以及首次访问该行的日期,然后执行数学。当然,根据需要进行更新并在之前解释过。

答案 1 :(得分:0)

只需在UserDefaultCoreData中保存最后一个日期,然后在下一个日期,使用timeIntervalSinceDate获取timeInterval,如果该值大于24,则除以3600 ,重置号码

答案 2 :(得分:0)

我没有检查但是这个想法会起作用,只需将当前日期(DD-MM-YYYY)存储到Array或list&使用任何Data Persistence Options保存。在添加日期之前(每当启动应用程序 - 您可以使用didFinishLauchingOptions)进入列表检查它是否已经存在。要显示连续的天数,请使用已保存列表的数组计数。

要重置零,只需检查上次日期是否可用。

答案 3 :(得分:0)

private extension Sequence where Element == Date {
    
    var streaks: Int {
        let oneDayInSeconds: Double = 60*60*24
        let days = self.compactMap { Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: $0) }
        let uniq = Set(days).sorted(by: >)
        
        var count = 0
        guard var lastStreak = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date()) else { return count }
        
        for date in uniq {
            guard date > lastStreak.advanced(by: -oneDayInSeconds - 1) else { break }
            count += 1
            lastStreak = date
        }
        
        return count
    }
    
}