2010-05-04 5 views
0

J'essaie de faire fonctionner Twitter dans mon application et tout fonctionne bien, sauf le code ne semble pas reconnaître une erreur de Twitter. Si le nom d'utilisateur/mot de passe ne sont pas valides, je reçois un message d'erreur par cette fonction:http authenitcation dans Xcode

- (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 ; 
} 

Il imprime: les données reçues: Impossible vous authentifier. .

Toutefois, l'application continue à afficher un tweet que j'ai et ignore l'erreur. De toute évidence, je n'ai pas de configuration adéquate pour détecter une telle erreur de la part de Twitter, alors ma question est de savoir comment obtenir que Xcode reconnaisse une telle erreur? Cela utilise http auth btw de base et ne mentionne rien à propos d'OAuth ... essayant juste de faire fonctionner ceci pour l'instant.

-(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]; 
     } 
    } 
+0

Je sais presque rien sur les choses internet alors s'il vous plaît essayer de me aider – fraggleRockz

+0

Cela n'a rien à voir avec Xcode - Xcode est juste un IDE - vous dire probablement Objective-C et CocoaTouch. –

Répondre

0

ok donc je peux maintenant obtenir une réponse d'erreur ou une réponse d'authentification dans xml. Maintenant, comment puis-je dire, utiliser cette réponse comme un facteur déclenchant pour connectionDidFailWithError, car si Twitter me renvoie une erreur, je veux donner une erreur dans l'application.

- (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

Essayez de regarder dans ... - (void) connexion: (NSURLConnection *) connexion didFailWithError: erreur (NSError *) Identique à ci-dessus. Implémentez-le et voyez quels types d'erreurs vous récupérez. – Staros

+0

ok, tout fonctionne maintenant, juste a été confus sur la façon de faire échouer correctement. – fraggleRockz

0

La méthode - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data est appelée zéro fois ou plus en fonction de la quantité de données disponibles.

Dans le cas d'une requête Web, il est probable qu'elle sera appelée plusieurs fois. Ce que vous devez faire est de créer un objet NSMutableData et de le stocker en tant que variable d'instance. Ensuite, lorsque cette méthode est appelée vous devez ajouter les nouvelles données à votre objet NSMutableData, comme ceci:

- (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]; 
} 

Si vous ne le faites pas, vous pourriez être parties manquantes de la réponse. Je ne sais pas exactement comment vous exécutez la requête ou quel type de réponse vous obtenez, mais idéalement, vous voulez une réponse formatée en XML ou JSON, et vous devez utiliser un analyseur pour activer la réponse en quelque chose que vous pouvez utiliser. De cette façon, vous seriez en mesure d'extraire les codes d'erreur, les messages, etc. et d'agir en conséquence. Enfin, si vous utilisez Twitter depuis votre application, pensez à utiliser une bibliothèque prédéfinie telle que MGTwitterEngine. Cela vous épargnera beaucoup de chagrin et de tracas. De plus, même si vous avez dit de ne pas le mentionner, MGTwitterEngine prend maintenant en charge OAuth, ce qui vous évite d'avoir à patcher votre code une fois l'authentification de base désactivée.

+0

J'ai eu quelque chose de similaire au message ci-dessus et ce que vous avez posté aussi et il n'a jamais été égal à 0. – fraggleRockz

3

Votre délégué doit mettre en œuvre ...

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

qui devrait se demander si le serveur que vous essayez de vous connecter requiert une authentification. Voici un exemple de code d'un programme de la mienne ...

-(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

J'ai dans mon code et ce n'est pas assez, encore jamais frapper l'autre – fraggleRockz