Как я могу обойти эту ошибку NSURLConnection?

В настоящее время я создаю приложение для iOS, которое использует REST-клиент Obma-C от Kosmaczewski для подключения к общедоступному API.

Этот публичный API использует базовую аутентификацию через HTTPS.

Проблема, с которой я столкнулся, заключается в том, что, когда я пытаюсь предоставить имя пользователя / пароль с помощью интерфейса оболочки, происходит сбой. После некоторого поиска, я считаю, что это связано с ошибкой, обсуждаемой в этих двух потоках:

В настоящее время для продвижения разработки я предоставляю имя пользователя / пароль в URL в формате: https://admin:pass@site.com/

Мне действительно нужно найти решение, чтобы сделать это правильно, хотя. Мне не нравится идея взломать его, сгенерировав строку в кодировке base64 и изменив заголовок аутентификации. Я также не хочу отходить от этой оболочки (которую очень легко реализовать) на использование чего-то вроде ASIHTTPRequest.

Так что мой вопрос будет: это действительно ошибка? Есть ли другое объяснение того, что происходит? Какие методы вы бы предложили, чтобы попытаться обойти это?

Если вы хотите посмотреть на какой-либо код, посмотрите упаковку, так как я просто ее реализую. https://github.com/akosma/iphonerestwrapper

Большое спасибо!

1 ответ

Решение

Хотя вы не хотите уходить из класса-оболочки, похоже, это ошибка в классе-оболочке. NSUrlConnection не имеет этой проблемы, если используется сама по себе, и это также очень легко реализовать. Вот пример кода для работы со службами REST, которые используют HTTP-аутентификацию, если вы решите пойти по этому пути. Очень просто


-(void)makeConnection{

    NSURL *statusURL = [[NSURL alloc] initWithString:@"URLHERE"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:statusURL];
    //change this to GET/PUT/POST/whatever you need
    [request setHTTPMethod:@"PUT"];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [statusURL release];
    [request release];

    [conn start];

    [conn release];

    responseData = [[NSMutableData alloc] init];
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) 
    {
        NSLog(@"Sending credentials");

        NSURLCredential *newCredential;
        newCredential = [NSURLCredential credentialWithUser:@"USERNAME" password:@"PASSWORD" persistence:NSURLCredentialPersistencePermanent];
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
    }
    else
    {
        [[challenge sender] cancelAuthenticationChallenge:challenge];

        // inform the user that the user name and password
        // in the preferences are incorrect
        NSLog(@"credentials are no good :(");
    }   
}

Я бы не стал использовать обертку, поскольку система загрузки URL сама по себе очень мощная, поэтому усложнение всегда приводит к большим ошибкам:)

Для получения дополнительной информации: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

Другие вопросы по тегам