http аутентификация в Xcode - PullRequest
0 голосов
/ 04 мая 2010

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

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
 NSString* strData = [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding] autorelease];
 NSLog(@"Received data: %@", strData ) ;
 return ;
}

Распечатывает: полученные данные: Не могу распознать тебя. ,

Однако приложение продолжает публиковать твит, который у меня есть, и игнорирует ошибку. Очевидно, у меня нет прав на настройку для обнаружения такой ошибки в твиттере, поэтому мой вопрос: как мне заставить Xcode распознать такую ​​ошибку? При этом используется базовая http-аутентификация, кстати, и ничего не упоминается об OAuth ... просто сейчас пытаюсь заставить это работать.

    -(void) onLogin:(id)sender
    { 
 [loading1 startAnimating];

 NSString *postURL = @"http://twitter.com/account/verify_credentials.xml";
 NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:postURL ] ];

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

 if (!theConnection) 
 {
  UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Failed to Connect to twitter" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
  [aler show];
  [aler release];
 } 

 else
 {
  receivedData = [[NSMutableData data] retain];
 }

 [request release];
    }

    -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    {
    if ([challenge previousFailureCount] == 0 && ![challenge proposedCredential]) 
 {
        NSURLCredential *newCredential;
        newCredential=[NSURLCredential credentialWithUser:txtUsername.text
                                                 password:txtPassword.text
                                              persistence:NSURLCredentialPersistenceNone];

        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        } 
 else 
 {
  isAuthFailed = YES;
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        }
    } 

Ответы [ 3 ]

3 голосов
/ 04 мая 2010

Ваш делегат должен реализовать ...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

Который должен получить вызов, если сервер, к которому вы пытаетесь подключиться, требует аутентификации. Вот пример кода из моей программы ...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{   
        if ([challenge previousFailureCount] == 0) {
            NSURLCredential *newCredential;
            newCredential=[NSURLCredential credentialWithUser:_username
                                        password:_password
                                        persistence:NSURLCredentialPersistenceNone];
            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        } else {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
            NSLog(@"Bad Username Or Password");
        }
    }
}
0 голосов
/ 04 мая 2010

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

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];

NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];

return;
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
{
NSLog(@"response: %@", string);
}
0 голосов
/ 04 мая 2010

Метод - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data вызывается ноль или более раз в зависимости от объема доступных данных.

В случае веб-запроса вполне вероятно, что он будет вызван более одного раза. Что вам нужно сделать, это создать объект NSMutableData и сохранить его как переменную экземпляра. Затем, когда вызывается этот метод, вам нужно добавить новые данные в ваш объект NSMutableData, например:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //myMutableData should be an instance of NSMutableData and stored as an instance variable in your class. Don't forget to initialise it.
    [myMutableData appendData:data];
}

Если вы этого не сделаете, возможно, вам не хватает части ответа.

Я не знаю точно, как вы выполняете запрос или какой ответ вы получаете, но в идеале вы захотите получить ответ, отформатированный в XML или JSON, и вам следует использовать парсер, чтобы превратить ответ в то, что вы можете использовать.

Таким образом, вы сможете извлечь коды ошибок, сообщения и т. Д. И действовать в соответствии с ними.

Наконец, если вы собираетесь использовать Twitter из своего приложения, рассмотрите возможность использования встроенной библиотеки, такой как MGTwitterEngine. Это избавит вас от многих неприятностей и хлопот. Кроме того, даже если вы сказали не упоминать об этом, MGTwitterEngine теперь также поддерживает OAuth, что избавит вас от необходимости исправления кода после отключения базовой аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...