美文网首页
使用AFNetworking同步服务器时间,无需另加接口

使用AFNetworking同步服务器时间,无需另加接口

作者: 木_穆 | 来源:发表于2019-03-06 10:17 被阅读0次
背景

服务器接口做了时间校验,App时间与服务器时间相差超过2分钟的话访问将无效。然而有时测试服务器时间会经常更改,而且考虑到有可能用户手机时间会设置不准确。故而,准备App启动的时候获取服务器时间,矫正手机与服务器之间的时间差。

第一种方案:

后台提供接口,这个需要后台配合,实现比较简单。不多说

第二种方案:

了解HTTP协议的应该知道,HTTP的Response Headers里面有Date字段,自动包含了服务期时间。基于这个原理,无需后台新增接口就可以获取服务器时间。


3826155-2d8bad3baed18b91.jpg
使用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;
 
    }];

验证结果:


WeChatba7bb9eb3354a7ed7392283afdd58798.png

时间转换代码借用: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;
}

相关文章

网友评论

      本文标题:使用AFNetworking同步服务器时间,无需另加接口

      本文链接:https://www.haomeiwen.com/subject/jvwzuqtx.html