token保活机制。
如何查看用户是否是活跃状态?这里我们可能就会用到token,比如后台给token设置的存活时间为10分钟,那么我们就可以在后台开个线程每5分钟去更新下token,从而一直保活。当app在后台的时候,杀死计时器,这样当token失效的时候,用户也就变为了不活跃状态。
对于刷新token的接口的调用要考虑下面几种情况,才能写的更加全面。
1. 在app处于后台的时候杀死计时器,在app处于活跃状态的时候再打开计时器。
2.我们需要保存上一次刷新token的时间,并拿上一次的时间跟这次调用接口的时间进行比较,如果时间大于300秒则去调用接口。
3.在我们打开计时器之前,需要判断上一次记录的时间与当前时间,如果小于300秒,则记录下距离300秒差多少,比如差30秒,则开启一个30秒执行一次的计时器。当计时器执行了一次,关闭之前的计时器,再重新开启一个300秒的计时器,去轮询app。
4.我们需要还需要注意的是,当用户登录的时候,要重新开始计时器轮询,并开始时间从0开始算,不能用之前的计时器。
上面就是我考虑到的所有情况。
下面是对计时器操作的代码部分,
- (void)startRefrershTokenWithFire:(BOOL)immediately {//开始刷新token 重启计时器
NSInteger timeInterval = kToken_Refresh_Time;
if ([TVMTokenVerifyModel getCheckTimeSeconds]>0) {//这种情况是针对在进程被杀死或者是e切换到后台去,由于计时器被销毁,重新开启计时器如果还按300秒不合理,应该按d300秒减去当前时间距离上次执行时间的时间差
timeInterval = [TVMTokenVerifyModel getCheckTimeSeconds];
}
if (self.timer_refresh_token) {
[self.timer_refresh_token invalidate];
self.timer_refresh_token = nil;
}
NSDictionary *userInfo = @{@"timeInterval":[NSString stringWithFormat:@"%ld",timeInterval]};
self.timer_refresh_token = [MSWeakTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(refrershTokenAction:) userInfo:userInfo repeats:YES dispatchQueue:dispatch_get_main_queue()];
if (immediately == YES&&timeInterval == kToken_Refresh_Time) {//当第一进入app或者当时间为300秒时,立刻执行计时器
[self.timer_refresh_token fire];
}
}
- (void)stopRefrershToken {//关闭计时器
if (self.timer_refresh_token) {
[self.timer_refresh_token invalidate];
self.timer_refresh_token = nil;
}
}
#pragma mark --算出在杀死进程或者暂停计时器的情况下,重新从开始计时器,计时时间 如果300-时间差大于0代表需要重置时间计时器
+(NSInteger)getCheckTimeSeconds{
NSUserDefaults *muserdef = [NSUserDefaults standardUserDefaults];
id lasttime = [muserdef valueForKey:kToken_Check_LastTime_KEY];
NSString *currenttime = [NSString stringWithFormat:@"%0.f", [[NSDate date] timeIntervalSince1970]];
NSInteger SurplusSeconds = kToken_Refresh_Time-(currenttime.integerValue - [lasttime integerValue]);
return SurplusSeconds;
}
网友评论