Search code examples
iphoneobjective-cioscocoa-touchnsurlrequest

How to query the last modification date of a file via HTTP on the iPhone using NSHTTPURLResponse?


In my iPhone application I need to query the last modification date of an internet .m4a file via HTTP, but I DON'T want to downloading it.

I'm reading Apple's documentation about NSURLRequest and NSHTTPURLResponse, but it seems to be all related to downloading the file and not querying it first. Maybe I'm wrong.

How can I know the last modification date of a .m4a file, via HTTP, WITHOUT downloading it?

Thanks!


Solution

  • This answer assumes your server supports it, but what you do is send a "HEAD" request to the file URL and you get back just the file headers. You can then inspect the header called "Last-Modified" which normally has the date format @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'".

    Here's some code:

    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");
    }
    

    Of course, you probably want this to be done asynchronously in the background, but this code should point you in the right direction.

    Best Regards.