Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在模型中存储数据,以便在Swift中进行比较_Ios_Swift - Fatal编程技术网

Ios 在模型中存储数据,以便在Swift中进行比较

Ios 在模型中存储数据,以便在Swift中进行比较,ios,swift,Ios,Swift,刷新令牌时,我从后端获得一个expires\u inInt 我需要存储令牌到期的日期,并在进行API调用之前进行检查 因此,我的模型如下所示: struct-TokenModel:Codable{ var-access\u令牌:字符串 var刷新\u令牌:字符串 变量标记类型:字符串 变量在:Int中过期 变量作用域:字符串 var到期:日期{ 让我们现在=日期() 让calendar=calendar.current 返回calendar.date(通过添加:.second,值:expires

刷新令牌时,我从后端获得一个
expires\u in
Int

我需要存储令牌到期的日期,并在进行API调用之前进行检查

因此,我的模型如下所示:

struct-TokenModel:Codable{
var-access\u令牌:字符串
var刷新\u令牌:字符串
变量标记类型:字符串
变量在:Int中过期
变量作用域:字符串
var到期:日期{
让我们现在=日期()
让calendar=calendar.current
返回calendar.date(通过添加:.second,值:expires\u in,to:now)
}
}
然后根据当前日期检查过期日期

让我担心的是日历参数。用户是否可以更改设备或日历上的日期/时间,然后逻辑将不起作用


我想转换为ISO8601格式,但似乎无法轻松转换为日期…

这里有一个缺陷<代码>过期不会返回真实的过期日期。它总是在秒后立即返回+
expires\u。那个日期永远是在未来

解决此问题的一种可能方法是标记实例的创建时间

struct-TokenModel:Codable{
var-access\u令牌:字符串
var刷新\u令牌:字符串
变量标记类型:字符串
变量在:Int中过期
变量作用域:字符串
让startingDate=日期()
var到期:日期{
让calendar=calendar.current
返回calendar.date(通过添加:.second,值:expires\u in,to:startingDate)
}
}
这也有问题。不小心处理
TokenModel
实例可能会导致其他缺陷


如果服务器提供了过期时间,那么您可能会遇到时间漂移问题。如果服务器离开标准时间几秒钟,或者客户端离开标准时间几秒钟,则过期时间将关闭


我使用过几次的解决方案是分担责任。创建一个单独的授权管理器

struct-TokenModel:Codable{
让我们访问\u令牌:字符串
让我们刷新\u令牌:字符串
让令牌类型为:字符串
让我们输入:Int
让作用域:字符串
}
类授权管理器{
var accessToken:字符串?
变量:字符串?
变量类型:字符串?
var到期日期?
变量范围:字符串?
延迟变量日历:日历=.current
func更新(令牌:令牌模型){
如果让tokenexpirement=calendar.date(通过添加:.second,value:token.expires\u in,to:date()){
accessToken=token.access\u token
refreshToken=token.refresh\u token
令牌类型=令牌。令牌类型
过期=令牌过期
scope=token.scope
}
}
}

日历更改是不相关的,因为日期是绝对时间点,与当前日历无关。通过订阅通知,可以检测设备上的日期/时间更改但是我们在谈论什么时间跨度呢?你能简单地启动一个计时器,在令牌过期时触发吗?令牌将存储在钥匙链中,因此可能在应用程序关闭时过期。时间跨度为
applicationsignificantimechange:
在应用程序中,当您的应用程序被挂起,然后再次进入前台时,也会调用委托但这值得麻烦吗?如果用户将设备时间设置回原来的时间,那么如果令牌过期,下一个API可能仍然会失败,您可以请求一个新的API。