2009-12-02 7 views
3

J'essaie de mettre en place une vue de connexion personnalisée à Twitter (je ne veux pas que UIWebView). J'ai téléchargé de nombreuses classes, et je suis si loin d'avoir un cauchemar avec ça. Maintenant, j'essaie de faire fonctionner Twitter + oAuth. Voici le code de démonstration (qui fonctionne):Twitter + oAuth cauchemar

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; 
_engine.consumerKey = kOAuthConsumerKey; 
_engine.consumerSecret = kOAuthConsumerSecret; 

[_engine requestRequestToken]; 

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; 

if (controller) 
    [self presentModalViewController: controller animated: YES]; 
else 
    [_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]]; 

Maintenant, ce que je veux faire est de remplacer que SA_OAuthTwitterController avec UITextFields personnalisés. Donc j'essaie ceci:

_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; 
_engine.consumerKey = kOAuthConsumerKey; 
_engine.consumerSecret = kOAuthConsumerSecret; 

[_engine requestRequestToken]; 
[_engine requestAccessToken]; 
[_engine setUsername:@"username" password:@"password"]; 
[_engine sendUpdate:@"tweet"]; 

Mais je continue à recevoir l'erreur 401. Il me manque probablement une étape. N'importe qui?

Répondre

1

Je pense que le bit vous manque ici, SA_OAuthTwitterEngine.m: 103:

//This generates a URL request that can be passed to a UIWebView. It will open a page in which the user must enter their Twitter creds to validate 
- (NSURLRequest *) authorizeURLRequest { 
     if (!_requestToken.key && _requestToken.secret) return nil;  // we need a valid request token to generate the URL 

     OAMutableURLRequest *request = [[[OAMutableURLRequest alloc] initWithURL: self.authorizeURL consumer: nil token: _requestToken realm: nil signatureProvider: nil] autorelease];  

     [request setParameters: [NSArray arrayWithObject: [[[OARequestParameter alloc] initWithName: @"oauth_token" value: _requestToken.key] autorelease]]]; 
     return request; 
} 

Vous devrez « faux » ce login utilisateur vous-même, je crois en envoyant twitter la Identifiants de connexion en tant que demande distincte. Il semble que la méthode setUsername que vous appelez soit effectivement appelée en tant qu'opération de publication une fois qu'un jeton d'accès valide a été reçu. Voir SA_OAuthTwitterEngine.m: 185

// 
// access token callback 
// when twitter sends us an access token this callback will fire 
// we store it in our ivar as well as writing it to the keychain 
// 
- (void) setAccessToken: (OAServiceTicket *) ticket withData: (NSData *) data { 
     if (!ticket.didSucceed || !data) return; 

     NSString *dataString = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease]; 
     if (!dataString) return; 

     if (self.pin.length && [dataString rangeOfString: @"oauth_verifier"].location == NSNotFound) dataString = [dataString stringByAppendingFormat: @"&oauth_verifier=%@", self.pin]; 

     NSString        *username = [self extractUsernameFromHTTPBody:dataString]; 

     if (username.length > 0) { 
       [[self class] setUsername: username password: nil]; 
       if ([_delegate respondsToSelector: @selector(storeCachedTwitterOAuthData:forUsername:)]) [(id) _delegate storeCachedTwitterOAuthData: dataString forUsername: username]; 
     } 

     [_accessToken release]; 
     _accessToken = [[OAToken alloc] initWithHTTPResponseBody:dataString]; 
} 

Ainsi, les étapes sont les suivantes:

  1. Demande demande de jeton
  2. connexion utilisateur faux twitter et obtenir la valeur de la broche
  3. Régler la broche sur le moteur
  4. Demander un jeton d'accès

Vous pouvez voir où e SA_OAuthTwitterController parse la goupille du contenu WebView dans SA_OAuthTwitterController.m: 156

#pragma mark Webview Delegate stuff 
- (void) webViewDidFinishLoad: (UIWebView *) webView { 
     NSError *error; 
     NSString *path = [[NSBundle mainBundle] pathForResource: @"jQueryInject" ofType: @"txt"]; 
    NSString *dataSource = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; 

    if (dataSource == nil) { 
     NSLog(@"An error occured while processing the jQueryInject file"); 
    } 

     [_webView stringByEvaluatingJavaScriptFromString:dataSource]; //This line injects the jQuery to make it look better 

     NSString          *authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     if (authPin.length == 0) authPin = [[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById('oauth_pin').getElementsByTagName('a')[0].innerHTML"] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     [_activityIndicator stopAnimating]; 
     if (authPin.length) { 
       [self gotPin: authPin]; 
     } 
     if ([_webView isLoading] || authPin.length) { 
       [_webView setHidden:YES]; 
     } else { 
       [_webView setHidden:NO]; 
     } 
} 

espérons que cette aide.

+0

Merci pour la réponse génial. Cependant, j'ai fini par utiliser l'UIWebView. Je pensais que la plupart des applications utilisaient oAuth sur ces UITextFields, mais ce n'est pas le cas. D'où le "posté via API". – samvermette

2

Le contrôleur de vue que vous éliminez charge une vue Web qui invite l'utilisateur à authentifier votre application avec Twitter. Si l'utilisateur ne s'authentifie jamais, vous ne pourrez pas effectuer d'appels Twitter authentifiés. Il y a un moyen de faire ce que vous voulez, cependant, vous devez passer par toutes les étapes OAuth vous-même. Voici les étapes spécifiées d'un different web service (Vimeo), mais appliquent les mêmes règles:

  1. Votre application envoie une demande avec la clé client et signé avec votre code secret client, pour une quelque chose appelé demande de jeton. Si nous vérifions votre demande correctement, nous vous renverrons un jeton de demande et un secret de jeton.

  2. Vous allez ensuite créer un lien sur lequel l'utilisateur cliquera avec le jeton de demande. Lorsque l'utilisateur accède à Vimeo, il est invité à autoriser l'accès de votre application à son compte. Si elles cliquent sur oui, nous leur renvoyons à votre application, avec un vérificateur.

  3. Vous utiliserez ensuite le jeton de demande, vérificateur et secret de jeton pour faire
    un autre appel à nous pour obtenir un jeton d'accès . Le jeton d'accès est ce que vous utiliserez pour accéder aux informations de l'utilisateur sur Vimeo.

OAuth est une vraie douleur dans le croupion, alors bonne chance. ;-)

1

Vous devez utiliser xAuth pour les contrôles utilisateur/passe personnalisés. Mais il nécessite l'autorisation de Twitter.