Как я могу обойти эту ошибку NSURLConnection? - PullRequest
0 голосов
/ 14 февраля 2011

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 14 февраля 2011

Хотя вы не хотите уходить из класса-оболочки, похоже, это ошибка в классе-оболочке. 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

...