有很多应用程序允许用户每月使用某个功能一定次数。当达到配额时,该功能将被阻止,直到月底。
我正在尝试做同样的事情,但我似乎遇到了一些问题。
struct Data{
var text:String
var date:Date
}
var array : [Data] = [
Data(text: "Cars", date: Date()),
Data(text: "Bikes", date: Date()),
Data(text: "Trucks", date: Date())
]
func countForCurrentMonth(date: Date) -> Int{
let currentMonth = Calendar.current.component(.month, from: date)
print(currentMonth)
var datesArray = [Int]()
for item in array{
let month = Calendar.current.component(.month, from: item.date)
if month == currentMonth{
datesArray.append(month)
}
}
let itemCount = datesArray.count
return itemCount
}
func addItem(){
if countForCurrentMonth(date:Date()) > 120{
//functionality locked
print("subscribe to unlock")
}else{
//allowed
print("allowed")
}
}
问题是,将date属性与Date()
进行比较,后者为用户提供系统日期。由于用户的系统日期可以手动设置,因此可以轻松绕过此限制。
所以我的问题是,我如何在不使用系统日期的情况下实现同样的事情,并且不需要互联网连接。
我尝试过的一件事是在设备上保留一个存储的日期,每次用户打开应用程序时,它都会检查系统日期,如果不等于存储的日期则会增加天数,并用新日期替换存储的日期。然而,只有当用户在一个月的每一天打开应用程序时,这才会起作用。
我不认为在没有互联网连接的情况下有合适的解决方案,但你也可以保存你的应用程序使用的最新注册日期。通过这种方式,你可以检查当前日期是否更早,例如锁定你的应用程序,并在可能的情况下尝试在线获取正确的时间戳。
但是,当用户旅行和更改时区时,这可能会导致其他问题,例如,但通常情况下,这种解决方案应该有效。
一种选择是存储日期,并将其作为关键组件。这样,如果一个用户作弊,与其他用户相比,这个日期在未来太远了,无法在应用程序中计入竞争对手。然后你只需要存储最新日期,任何更早的日期都会使会话无效或锁定应用程序的进度。例如,如果当前日期<项目日期。如果每隔几秒钟更新一次所有用户,这可能是个问题。但是,在这种情况下,你可能会上网。在这种情况下,你似乎想按月限制。因此,即使用户本月应用了120个更改,下个月又应用了120次更改,这些更改也只能在下个月有效。因此,他们仍然可以得到当月应用的更改数量。或者他们中的前120个。此外,在寻找有效日期时,您可能需要查看年份。