6

私のiPhoneアプリケーションでは、を介してインターネットファイルの最終変更日を照会する必要がありますが、ダウンロード.m4aしたくありません。HTTP

NSURLRequestとについてのAppleのドキュメントを読んNSHTTPURLResponseでいますが、それはすべてファイルのダウンロードに関連しているようで、最初にクエリを実行するのではないようです。たぶん私は間違っています。

ダウンロードせず.m4aファイルの最終変更日を知るにはどうすればよいですか?HTTP

ありがとう!

4

2 に答える 2

9

この回答は、サーバーがサポートしていることを前提としていますが、ファイルURLに「HEAD」リクエストを送信すると、ファイルヘッダーのみが返されます。次に、通常は日付形式の「Last-Modified」と呼ばれるヘッダーを検査できます@"EEE',' dd MMM yyyy 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");
}

もちろん、これをバックグラウンドで非同期的に実行したい場合もありますが、このコードは正しい方向を示しているはずです。

よろしくお願いします。

于 2012-06-01T19:56:25.877 に答える
4

以下のメソッドは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.
    });
});

私はこれについてここに記事を書きました:

Objective-Cを使用してサーバー上のファイルの最終変更日を取得します。

于 2014-04-20T12:52:14.467 に答える