如何使用NSHTTPURLResponse在iPhone上通过HTTP查询文件的最后修改日期?

如何使用NSHTTPURLResponse在iPhone上通过HTTP查询文件的最后修改日期?,iphone,objective-c,ios,cocoa-touch,nsurlrequest,Iphone,Objective C,Ios,Cocoa Touch,Nsurlrequest,在我的iPhone应用程序中,我需要通过HTTP查询互联网.m4a文件的最后修改日期,但我不想下载它 我正在阅读苹果公司关于NSURLRequest和NSHTTPURLResponse的文档,但似乎都与下载文件有关,而不是先查询文件。也许我错了 如何通过HTTP,知道.m4a文件的上次修改日期而不下载它 谢谢 这个答案假设您的服务器支持它,但您要做的是向文件URL发送一个“HEAD”请求,然后只返回文件头。然后,您可以检查名为“Last Modified”的标题,该标题通常具有日期格式“EEE”

在我的iPhone应用程序中,我需要通过
HTTP
查询互联网
.m4a
文件的最后修改日期,但我不想下载它

我正在阅读苹果公司关于
NSURLRequest
NSHTTPURLResponse
的文档,但似乎都与下载文件有关,而不是先查询文件。也许我错了

如何通过
HTTP
知道
.m4a
文件的上次修改日期而不下载它


谢谢

这个答案假设您的服务器支持它,但您要做的是向文件URL发送一个“HEAD”请求,然后只返回文件头。然后,您可以检查名为“Last Modified”的标题,该标题通常具有日期格式“EEE”、“dd-MMM-yyy-HH”:“mm”:“ss-GMT”

下面是一些代码:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
if ([response respondsToSelector:@selector(allHeaderFields)]) 
{
  NSDictionary *dictionary = [response allHeaderFields];
  NSString *lastUpdated = [dictionary valueForKey:@"Last-Modified"];
  NSDate *lastUpdatedServer = [fileDateFormatter dateFromString:lastUpdated];

  if (([localCreateDate earlierDate:lastUpdatedServer] == localCreateDate) && lastUpdatedServer) 
  {
    NSLog(@"local file is outdated: %@ ", localPath);
    isLatest = NO;
  } else {
    NSLog(@"local file is current: %@ ", localPath);
  }

} else {
  NSLog(@"Failed to get server response headers");
}
当然,您可能希望在后台异步完成此操作,但此代码应该为您指明正确的方向


致以最诚挚的问候。

下面的方法执行
HEAD
请求,仅获取带有
Last Modified
字段的标头,并将其转换为
NSDate
对象

- (NSDate *)lastModificationDateOfFileAtURL:(NSURL *)url
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

    // Set the HTTP method to HEAD to only get the header.
    request.HTTPMethod = @"HEAD";
    NSHTTPURLResponse *response = nil;
    NSError *error = nil;

    [NSURLConnection sendSynchronousRequest:request
                          returningResponse:&response
                                      error:&error];

    if (error)
    {
        NSLog(@"Error: %@", error.localizedDescription);
        return nil;
    }
    else if([response respondsToSelector:@selector(allHeaderFields)])
    {
        NSDictionary *headerFields = [response allHeaderFields];
        NSString *lastModification = [headerFields objectForKey:@"Last-Modified"];

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];

        return [formatter dateFromString:lastModification];
    }

    return nil;
}
您应该在后台异步运行此方法,以便主线程在等待响应时不会被阻塞。使用几行
GCD
即可轻松完成此操作

下面的代码执行一个调用,以获取后台线程中的最后一个修改日期,并在检索日期时调用主线程上的完成块

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
    // Perform a call on the background thread.
    NSURL *url = [NSURL URLWithString:@"yourFileURL"];

    NSDate *lastModifDate = [self lastModificationDateOfFileAtURL:url];

    dispatch_async(dispatch_get_main_queue(), ^
    {
        // Do stuff with lastModifDate on the main thread.
    });
});
我在这里写了一篇文章:


我真的不认为不下载文件就可以查询此类数据,我认为在iphone或任何其他sdk中都不可行。当然!它帮助了我很多,现在我将努力使它异步!当然,如果服务器不支持HEAD,您可以在收到提示的响应消息后立即取消连接,但在我的情况下,服务器确实支持HEAD。