背景
服务器接口做了时间校验,App时间与服务器时间相差超过2分钟的话访问将无效。然而有时测试服务器时间会经常更改,而且考虑到有可能用户手机时间会设置不准确。故而,准备App启动的时候获取服务器时间,矫正手机与服务器之间的时间差。
第一种方案:
后台提供接口,这个需要后台配合,实现比较简单。不多说
第二种方案:
了解HTTP协议的应该知道,HTTP的Response Headers里面有Date字段,自动包含了服务期时间。基于这个原理,无需后台新增接口就可以获取服务器时间。

使用AFNetworking
//直接使用afnet的单例调用get请求访问服务器地址
[netManger GET:DO_MAIN parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
//万一成功的话可从 task.response 中取出Response Headers里面有Date字段
} failure:^(NSURLSessionTask *operation, NSError *error) {
//一般请求肯定失败,从operation中取出Response Headers里面有Date字段
NSHTTPURLResponse *response = (NSHTTPURLResponse *)operation.response;
NSDictionary *allHeaders = response.allHeaderFields;
//这里的时间格式是:@"EEE, d MMM yyyy HH:mm:ss zzz"。不会转换的自己百度
NSDate *date = [NSDate dateFromRFC822String:allHeaders[@"Date"]];
//计算与服务器时间差。可能会有几秒误差,不影响使用。
self->_serverTimeDiff = [[NSDate date] timeIntervalSinceDate:date]*1000;
}];
验证结果:

时间转换代码借用:NSDate+InternetDateTime.m
+ (NSDate *)dateFromRFC822String:(NSString *)dateString {
// Keep dateString around a while (for thread-safety)
NSDate *date = nil;
if (dateString) {
NSLocale *en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:en_US_POSIX];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
@synchronized(dateFormatter) {
// Process
NSString *RFC822String = [[NSString stringWithString:dateString] uppercaseString];
if ([RFC822String rangeOfString:@","].location != NSNotFound) {
if (!date) { // Sun, 19 May 2002 15:21:36 GMT
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21 GMT
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21:36
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm"];
date = [dateFormatter dateFromString:RFC822String];
}
} else {
if (!date) { // 19 May 2002 15:21:36 GMT
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm:ss zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21 GMT
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21:36
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm:ss"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm"];
date = [dateFormatter dateFromString:RFC822String];
}
}
if (!date) NSLog(@"Could not parse RFC822 date: \"%@\" Possible invalid format.", dateString);
}
}
// Finished with date string
return date;
}
网友评论