'[ios] twitter API'에 해당되는 글 1건

  1. 2013.03.05 [iOS]twitter API
개발도구/아이폰2013.03.05 23:46
  

https://github.com/bengottlieb/Twitter-OAuth-iPhone



SA_OAuthTwitterEngineDelegate / 트위터 로그아웃

안녕하세요^^ 오랫만에 맥부기에 글을 올리네요!
이번에 어플리케이션 업데이트를 하면서 SNS연동을 처리하게 되었습니다.
단순 연동에 관해서는 글들이 많이 있어서 처리하기 쉬웠습니다!

그런데!! 트위터나 페이스북의경우 한번 로그인하면 앱을 종료하기까지는 그 아이디만 사용할 수 있더라구여...
관련자료를 계속 검색하다가 결국 구현해서 맥부기에 자료삼아 남겨볼까합니다^^(너무 받기만해서..)

//많은 분들이 아시고 있을 듯하지만 자세한 내용은 있지 않아서 글을 남기네요!!
일단 페이스북 관련입니다!
페이스북은 트위터보다 로그아웃에 관련된 정보가 많아서 쉽게 찾을 수 있었는데요!
일단 페이스북의 기본예제인 Hackbook을 확인하시면 쉽게 구현 가능하실 거에요!

아래의 메서드는 로그인 처리시 불려지고 실행이되게 됩니다.
- (void)fbDidLogin;

또한 로그아웃 처리시 불려지는 메서드로
- (void)fbDidLogout; 라는 메서드가 존재합니다.
facebook 객체에서 [facebook logout:self];을 실행하면 자동으로 객체에 저장한 정보들을 지워주는데
일반적으로 fbDidLogin에서 아래와같이 토큰을 저장해 줬기 때문에

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];

로그아웃 메서드가 호출될때는 반대로 등록한 키값을 제거해 주어야 합니다.

[defaults removeObjectForKey:@"FBAccessTokenKey"];
[defaults removeObjectForKey:@"FBExpirationDateKey"];
[defaults synchronize];

일단 페이스북의 내용은 Hackbook에 정말 잘 작성되어 있기때문에 꼭 참고하셔서 구현하시길 바랍니다!!
(제가 글을 못써서 이것만 보시면 정말 아무것도 안될수도....꼭 확인하세여..ㅠㅠ)

다음으로 Twitter 로그아웃 부분입니다. iOS 5 부터는 트위터 라이브러리를 제공하기 때문에 로그인, 로그아웃
이러한 처리자체가 필요없습니다!!(정말 좋더라구여..) 하지만 이하의 버전부터는 다른방법으로 구현을 해 주어야하는데요
저같은 경우는 Twitter+OAuth를 사용해서 붙여 넣었습니다.
이미지 전송 및 텍스트 전송을 위해 SA_OAuthTwitterEngine에 메서드를 따로 선언하여 구현하였습니다.
혹시나 필요하신분은 아래 소스를 참고하시면 될것 같네요^^

- (NSString *)_sendRequestWithMethod:(NSString *)method 
                                path:(NSString *)path
                               image:(UIImage *)image
                         requestType:(MGTwitterRequestType)requestType 
                        responseType:(MGTwitterResponseType)responseType
{
    // 이미지 전송하기 소스코드
    NSURL *finalURL = [NSURL URLWithString:path];

    if (!finalURL) {
        return nil;
    }

    OAMutableURLRequest *theRequest = [[[OAMutableURLRequest alloc] initWithURL:finalURL
                                                                       consumer:self.consumer 
                                                                          token:_accessToken 
                                                                          realm: nil
                                                              signatureProvider:nil] autorelease];
    if (method) {
        [theRequest setHTTPMethod:method];
    }
    
    [theRequest setHTTPShouldHandleCookies:NO];
    
    // Set headers for client information, for tracking purposes at Twitter.
    [theRequest setValue:_clientName    forHTTPHeaderField:@"X-Twitter-Client"];
    [theRequest setValue:_clientVersion forHTTPHeaderField:@"X-Twitter-Client-Version"];
    [theRequest setValue:_clientURL     forHTTPHeaderField:@"X-Twitter-Client-URL"];
    
    // Set body
    NSString *boundary = @"----------------------------991990ee82f7";
    
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [theRequest setValue:contentType forHTTPHeaderField:@"content-type"];
    
    NSMutableData *body = [NSMutableData dataWithLength:0];
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"media[]\"; filename=\"MansCoordinate.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:UIImageJPEGRepresentation(image, 1.0)];
    
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"status\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

    /* 이부분은 단지 지역화를 위해 로컬라이징 스트링을 사용하였고,
    * 
해당 라이브러리의 경우 같은내용의 메시지로 글을 올리면
    * 메서드 수행으로 이미지, 텍스트는 이상없이 올라가는데 수행결과로 403?401? 에러코드를 내밷습니다.
    * 따라서 시간값을 추가해서 전송할 메시지가 이전에 올린 글과 중복되지 않도록 처리해 주었습니다.
    */
    [body appendData:[[NSString stringWithFormat:@"%@ [%@]\r\n", NSLocalizedString(@"share_msg", @"sns"), [NSDate date]] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [theRequest prepare];
    [theRequest setHTTPBody:body];
    
    // Create a connection using this request, with the default timeout and caching policy,
    // and appropriate Twitter request and response types for parsing and error reporting.
    MGTwitterHTTPURLConnection *connection;
    connection = [[MGTwitterHTTPURLConnection alloc] initWithRequest:theRequest 
                                                            delegate:self 
                                                         requestType:requestType 
                                                        responseType:responseType];
    
    if (!connection) {
        return nil;
    } else {
        [_connections setObject:connection forKey:[connection identifier]];
        [connection release];
    }
    
    return [connection identifier];
}

음... 로그아웃을 말씀드리다가 다른길로 새버렸네요;;; 혹시나..혹시나 필요하신분은 참고해주세요!
아무튼 마지막으로 트위터의 로그아웃!!
트위터도 페이스북과 마찬가지로 로그인시 NSUserDefaults에 키값을 저장하는 부분이 있습니다.
따라서 로그아웃 버튼을 클릭시 Twitter 객체의 clearAccessToken을 불러와 토큰값을 지워주고
할당된 객체를 해제시켜버렸습니다.

[_engine clearAccessToken];
                         
_engine = nil;
[_engine release];
                        
[defaults removeObjectForKey:@"authData"];
[defaults synchronize];

그런데! 이렇게 로그아웃 처리를 해도 가장 처음 로그인할때 모달뷰로 뜨는 창에는 아직도 로그인상태인것을 확인할 수 있습니다!
따라서 해당 뷰의 로그인 상태를 해지하기위해서 Twitter객체를 선언해줄때 아래와같이 하나의 메서드를 포함시켜주세요

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

이렇게 setClearsCookies값을 YES로 만들어주시면 로그아웃하고 다시 로그인창을 불러올때
이전에 로그인한 정보는 날려버리고, 새롭게 아이디, 패스워드를 입력하는 창으로 나오게 됩니다^^

밤을새고 수업시간에 심심해서 글을 올리게되서 두서없이 글을 적게된것 같네요...
여기까기 글을 읽어주셔서 감사합니다!! 아참, 틀리거나 이상한 부분은 댓글로 수정부탁드리겠습니다.ㅠ
아직까지도 초보프로그래머이기 때문에 많은 가르침 부탁드리겟습니다!!
새롭게 시작되는 한주 즐겁게 보내세요!!


Posted by 예배하는 프로그래머