Pergunta

Preciso verificar se um URL (representado por um NSURL) está disponível ou retorna 404. Qual é a melhor maneira de conseguir isso?

Eu preferiria uma maneira de verificar isso sem um delegado, se possível. Preciso bloquear a execução do programa até saber se o URL é acessível ou não.

Foi útil?

Solução

Como você já deve saber, o erro geral pode capturar pelo método DidFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

Mas para 404 "não encontrado" ou 500 ", erro de servidor interno" deve capturar o método DidReCeoResponse dentro:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}

Outras dicas

Eu precisava de uma solução que também não usasse um delegado, então peguei peças de código mostradas em outras respostas aqui e criei um método simples que funciona bem no meu caso (e pode ser o que você está procurando também):

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }

Usei a resposta da Woodmantech acima, mas mudei com base no que vi em outras perguntas semelhantes aqui, para que não baixe o arquivo inteiro para ver se existe.

eu mudei NSURLRequest para NSMutableURLRequest, e acrescentou:

[request setHTTPMethod:@"HEAD"];

Isso parece funcionar bem. Estou trabalhando no meu primeiro aplicativo, então ainda não há experiência real. Obrigado a todos.

 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse* response = nil;
    NSError* error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"statusCode = %d", [response statusCode]);

Você pode obter uma conexão síncrona ligando:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Seu tópico será bloqueado até que a solicitação seja feita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top