안녕하세요.

cocos2d 프로젝트와 트위터를 연동하는 방법을 간단하게 정리해볼까 합니다. 하지만 이 방법은 iOS5에서 정상적으로 실행되지 않으니 참고만 해주셨으면 좋겠네요. 혹시 xcode4.2 + ios5 조합에서 제대로 연동에 성공한 분이 계시다면 의견 부탁드립니다.

뭐가 문제였는지 모르겠지만 처음부터 다시 하니 xcode4.2 + ios5에서도 잘 되네요;;;;;


먼저, 제가 참고한 소스들입니다. 저는 저 소스들로부터 짜집기 해서 제가 원하는 결과물을 얻었습니다.

http://www.iphil.co.uk/index.php/2011/02/integrating-twitter-and-cocos2d-oauth/
https://github.com/bengottlieb/Twitter-OAuth-iPhone
http://www.playngive.com/blog/2010/5/2/twitter-integration-with-cocos2d-and-twitter-oauth-iphone.html
http://www.icodeblog.com/2010/09/16/dealing-with-the-twitter-oauth-apocalypse/ 


제가 이번 글을 통해 구현하고자 하는 것은 버튼 클릭이나 특정 조건을 만족시켰을 경우 트윗 전송 메서드가 호출되어 특정 메시지를 자동으로 전송해주는 것입니다. 버튼만 누르면 묻지도 따지지도 않고 그냥 정해진 문자를 트윗하는 거죠.

그럼 먼저 필요한 준비물부터 챙깁시다.

2번째 링크에서 파일을 다운받습니다. 왼쪽 상단에 ZIP 이라고 돼있는 버튼을 누르시면 되겠습니다. 그리고 압축파일에 있는 Twitter+OAuth 폴더를 프로젝트로 드래그해서 추가합니다.

 
그리고 프레임워크에 libxml2.dylib 파일을 추가합니다.  기본 리스트에 없으면 add other에서 아래 경로의 파일로 수동 지정 해줍니다. 저는 ios5에서 했습니다.
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib


 다음으로는 Header Search Paths 에 아래 경로를 추가해줍니다.
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/libxml2

 

다음으로는... 아래 링크로 가서 앱을 등록하고 컨슈머 키와 시크릿 키값을 받습니다.
https://dev.twitter.com/apps




이제 코드 만지기 전에 할 일은 끝났습니다. 프로젝트의 AppDelegate를 수정할 차례군요. 헤더파일로 갑시다.


#import <UIKit/UIKit.h>

#import "SA_OAuthTwitterController.h"

#import "SA_OAuthTwitterEngine.h"


@class RootViewController;

@class SA_OAuthTwitterEngine;


@interface AppDelegate : NSObject <UIApplicationDelegate, SA_OAuthTwitterControllerDelegate> {

UIWindow *window;

RootViewController *viewController;

    SA_OAuthTwitterEngine *_engine;

}


@property (nonatomic, retain) UIWindow *window;

-(void) twitterAccountLogin;


@end


SA_OAuthTwitterEngine 관련이랑  twitterAccountLogin 메서드 부분만 추가해주시면 됩니다.
추가하셨으면 이제 AppDelegate.m 부분으로 갑니다. 메서드 추가해야죠 ㅎ_ㅎ
요로코롬 추가합니다. define 에는 위에서 받은 키값들을 넣어주세요.

#define kOAuthConsumerKey @"컨슈머 키값"

#define kOAuthConsumerSecret @"컨슈머 시크릿값"


-(void) twitterAccountLogin {

    UIViewController *controller = nil;

    if (!_engine) {

        _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];

        _engine.consumerKey = kOAuthConsumerKey;

        _engine.consumerSecret = kOAuthConsumerSecret;

        

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

    }

    

    if (controller)

    {

        NSLog(@"트윗 실패!!");

        [viewController presentModalViewController: controller animated: YES];

    }

    else {

        NSLog(@"트위터는 트윗트윗 하고 웁니다 _");

        [_engine sendUpdate: [NSString stringWithFormat: @"@asreanet 짱멋짐 >.<"]];

    }

}



그리고 여러분의 프로젝트에 메서드를 추가해줍니다. 추가하실때 AppDelegate 임포트 잊지마시고요.
메서드 호출하는 부분은 적당히 앱 디자인에 맞춰 추가하시면 됩니다. 저는 임시로 게임오버 메서드 안에다 [self twitter]; 이렇게 추가했네요.

  -(void) twitter {
  [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"postToTwitter"];

    [[NSUserDefaults standardUserDefaults] synchronize];


    AppDelegate *myApp = (AppDelegate *)[UIApplication sharedApplication].delegate;

    [myApp twitterAccountLogin];

}

 
이쯤 해서 실행하시면... 처음에 인증하고 메서드 두번째 호출부터 트윗이 되긴 되는데 계정 정보 저장이 안 되는 고로 앱을 껐다가 다시 켜면 새로 인증을 하게 되는 번거로움이 있습니다. 여기서 꼼수를 좀 씁시다. 

맨 아래쪽(4번째) 링크로 가신 다음 스크롤 쭉 내리시면 맨 밑에 소스파일을 다운받을 수 있는 링크가 있습니다. 거기서 tweet.h, tweet.m 파일만 가져와서 프로젝트에 추가합니다.

그리고... AppDelegate.h 에 한 줄 추가합니다.

NSMutableArray *tweets;

AppDelegate.m 에서는 아까 집어넣은 Tweet.h 임포트 하시고 아래 코드를 와장창 때려넣습니다.

고백컨데 다른 부분도 그렇지만 특히 이 부분은 어디서 무슨 기능을 하는지 잘 모른 상태에서 퍼와서 집어넣은 것입니다. 보시면서 이건 필요없겠다 싶은 부분은 과감히 지워주세요.
 


#pragma mark SA_OAuthTwitterEngineDelegate


- (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) username {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject: data forKey: @"authData"];

[defaults synchronize];

}


- (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) username {

return [[NSUserDefaults standardUserDefaults] objectForKey: @"authData"];

}


#pragma mark SA_OAuthTwitterController Delegate


- (void) OAuthTwitterController: (SA_OAuthTwitterController *) controller authenticatedWithUsername: (NSString *) username {

NSLog(@"Authenticated with user %@", username);

tweets = [[NSMutableArray alloc] init];

//[self updateStream:nil];

}


- (void) OAuthTwitterControllerFailed: (SA_OAuthTwitterController *) controller {

NSLog(@"Authentication Failure");

}


- (void) OAuthTwitterControllerCanceled: (SA_OAuthTwitterController *) controller {

NSLog(@"Authentication Canceled");

}


#pragma mark MGTwitterEngineDelegate Methods


- (void)requestSucceeded:(NSString *)connectionIdentifier {

    

NSLog(@"Request Suceeded: %@", connectionIdentifier);

}



- (void)receivedObject:(NSDictionary *)dictionary forRequest:(NSString *)connectionIdentifier {

    

NSLog(@"Recieved Object: %@", dictionary);

}


- (void)directMessagesReceived:(NSArray *)messages forRequest:(NSString *)connectionIdentifier {

    

NSLog(@"Direct Messages Received: %@", messages);

}


- (void)userInfoReceived:(NSArray *)userInfo forRequest:(NSString *)connectionIdentifier {

NSLog(@"User Info Received: %@", userInfo);

}


- (void)miscInfoReceived:(NSArray *)miscInfo forRequest:(NSString *)connectionIdentifier {

NSLog(@"Misc Info Received: %@", miscInfo);

}

 

 

 여기까지 하시면 정상적으로 되긴 되실텐데 아마 경고가 좀 있을 겁니다. 최종적으로 하실 일은...
MGTwitterEngine 에 있는 MGTwitterXMLPhaser.h 에다가 
<NSXMLParserDelegate요거 하나 추가해주시면 되겠습니다.


이렇게 해주시면... 모든, 또는 대부분의 경고가 사라집니다.

동작 테스트 결과 잘 되네요. xcode4.1에서 작업하고 4.2에서 구동하니 잘 안 되던데 아예 처음부터 4.2에서 작업하니 잘 되는군요;;;

긴 글 읽어주셔서 감사합니다. 복받으실 거에요 ~_~



 
Posted by As Kafka

블로그 이미지
서둘지 말되 멈추지도 말라 SIN PROSA SIN PAUSA
As Kafka

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함