문제

트위터에 맞춤 로그인보기를 구현하려고합니다 (UIWebView를 원하지 않습니다). 나는 많은 수업을 다운로드했고 지금까지 악몽 이것으로. 이제 저는 Twitter + Oauth를 만들려고 노력하고 있습니다. 데모 코드는 다음과 같습니다.

_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]]];

이제 내가하고 싶은 것은 SA_OAUTHTWITTERCONTROLLER를 사용자 정의 UITEXTFIELD로 바꾸는 것입니다. 그래서 나는 이것을 시도하고있다 :

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

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

그러나 나는 계속 오류를 얻는다. 누구나?

도움이 되었습니까?

해결책

나는 당신이 놓친 비트가 여기에 있다고 생각합니다, 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;
}

이 사용자가 직접 로그인해야합니다. Twitter를 별도의 요청으로 보내는 것으로 생각합니다. 유효한 액세스 토큰이 접수 된 후에 호출하는 setusername 메소드는 실제로 게시물 작업으로 호출되는 것으로 보입니다. 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];
}

단계는 다음과 같습니다.

  1. 요청 토큰 요청
  2. 가짜 사용자가 트위터에 로그인하고 PIN 값을 얻습니다.
  3. 엔진에 핀을 설정하십시오
  4. 액세스 토큰을 요청하십시오

sa_oauthtwittercontroller.m : 156에서 sa_oauthtwittercontroller가 핀을 끄는 곳을 볼 수 있습니다.

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

도움이 되었기를 바랍니다.

다른 팁

view 컨트롤러를 제거하는 view는 사용자에게 트위터로 응용 프로그램을 인증하도록하는 웹 뷰를로드합니다. 사용자 인증이 없다면 인증 된 트위터 전화를 할 수 없습니다. 원하는대로 할 수있는 방법이 있지만, 모든 OAuth 단계를 직접 겪어야합니다. 다음은 a에서 지정된 단계입니다 다른 웹 서비스 (Vimeo), 그러나 동일한 규칙이 적용됩니다.

  1. 애플리케이션은 소비자 키와 함께 요청을 보내고 소비자 비밀과 서명하여 요청 토큰이라고 불리는 것입니다. 신청서를 올바르게 확인하면 요청 토큰 및 토큰 비밀을 다시 보내 드리겠습니다.

  2. 그런 다음 사용자가 요청 토큰으로 클릭 할 수있는 링크를 만듭니다.

  3. 사용자가 Vimeo에 도착하면 신청서가 계정에 액세스 할 수 있도록 프롬프트됩니다. 그들이 예를 클릭하면 검증 자와 함께 응용 프로그램으로 다시 보내드립니다.

  4. 그런 다음 요청 토큰, 검증 자 및 토큰 비밀을 사용하여
    액세스 토큰을 얻으려는 또 다른 전화. Access Token은 Vimeo에서 사용자의 정보에 액세스하는 데 사용할 수있는 것입니다.

Oauth는 엉덩이에 진정한 고통이므로 행운을 빕니다. ;-)

당신은 사용해야합니다 Xauth 사용자 정의 사용자/패스 컨트롤 용. 그러나 트위터의 허가가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top