[cocos2d Advent Calendar 2011]FacebookのOAuth認証のライブラリ「Facebook Connect」をcocos2dで使用する方法(サンプル付き)
cocos2d Advent Calendar 2011に本日7日担当として参加させていただきました。 ATND: cocos2d Advent Calendar 2011 前日の記事: cocos2dのEAGLViewを透明化して、背景をカメラにする方法 ( @kasajeiさん )
このエントリーでは、「FacobookのOAuth認証のライブラリ[Facebook Conect]をcocos2dで使用する方法」をテーマに記事を書かせていただこうかと思います。
(楽しそうなので勢いで参加表明してみたものの、連日の他の参加者の方の記事のレベルが高くてガクブルなってました・・・こんな記事で・・す、すいません・・・)

cocos2d以外でのFacebook Connectの使用方法はアチコチで紹介されているので、 この記事で使うサンプルには ・CCLayerを継承したFacebookLayerというのを作成してそこにつぶやく方法を実装 ・ログイン前、ログイン後、投稿後のステータスを表示。 ・2重投稿を禁止 などなどの機能を追加しておきました。
今回作ったサンプルはgithubにアップしておきますので、躓いた方の手がかりか何かになりますと嬉しいです。
手順
1.アプリの登録申請
https://developers.facebook.com/apps/
こちらからアプリの登録申請をし、
App ID、App Secretを取得します。
(日本語訳でAPP Secretが「アプリの秘訣」って何だよ・・)
2.新規プロジェクトを作成
cocos2dで新規でプロジェクトを作成します。
3.ライブラリをダウンロード+プロジェクトに追加
https://github.com/facebook/facebook-ios-sdk
をダウンロードし、プロジェクトに追加します。


僕は/libs/以下に一式入れるようにしています。 /src/ってフォルダだけあれば十分です。
(ターミナルから落とすならgit clone git://github.com/facebook/facebook-ios-sdk.gitだと早いです!)
4.AppDelegateを編集
AppDelegateを編集します ここで1で取得したApp ID、App Secretが必要になってきます。
AppDelegate.h
//
// AppDelegate.h
// untitled
//
#import <UIKit/UIKit.h>
#import "FBConnect.h"
//facebook
#define kFBAppId @"xxxxx" //REPLACE ME
#define kFBAppSecret @"xxxxx" //REPLACE ME
@class RootViewController;
@interface AppDelegate : NSObject <uiapplicationDelegate, FBRequestDelegate, FBDialogDelegate, FBSessionDelegate> {
UIWindow *window;
RootViewController *viewController;
//facebook
Facebook* _facebook;
NSArray* _permissions;
NSNumber *facebookState;//0,1,2 でログイン状態をメモログイン前、ログイン後、つぶやき終了
}
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) Facebook *_facebook;
-(NSNumber *) facebook:(NSString*)s;
@endAppDelegate.m
//facebook
-(NSNumber *) facebook:(NSString*)s
{
if(!facebookState) facebookState = [[NSNumber alloc] initWithInt:0];
if(s == @"logout") {//ログアウトの場合
[_facebook logout:self];
facebookState = [[NSNumber alloc] initWithInt:0];
return facebookState;
}
if([facebookState intValue] == 2) return facebookState;
//状態取得したい時
if(s == @"") {
if(_facebook && _facebook.isSessionValid==YES) {
facebookState = [[NSNumber alloc] initWithInt:1];
} else {
facebookState = [[NSNumber alloc] initWithInt:0];
}
return facebookState;
}
//実行関連
if([facebookState intValue] == 0) {//ログインの場合
[self facebookAccountLogin];
} else if([facebookState intValue] == 1) {//投稿
[self postfacebook:s];
facebookState = [[NSNumber alloc] initWithInt:2];
}
return facebookState;
}
-(void) facebooktReset
{
facebookState = [[NSNumber alloc] initWithInt:0];
}5.呼び出し
あとはFacebookLayerからAppDelegateに命令を送ったらつぶやけます。
[appdelegate facebook:@"つぶやき内容"];
で投稿します。
0.ログイン前の場合は認証画面を表示 1.ログインしていたらログアウトor投稿 2.二重で投稿しないように、1度投稿すると投稿完了のステータスになります。
[appdelegate facebook:@""];
とすると上記のどの状態かがNSNumberとして戻ってくるような構造になっています。
こちらで状態を取得して、表示を切り替えています。
一度つぶやいたけれどもキャンセルして別の内容をつぶやきたい場合は[appdelegate facebooktReset];で最初の状態に戻ります。
細かい状態の取得や表示はもっと効率良いやり方がありそうですがw
FacebookLayerをご覧いただけますととりあえず実装する方法がわかるかと思います。
■サンプル 今回使用したソースはgithubにサンプルとしてアップしています。
https://github.com/is8r/iphone-howto-facebook
間違ってるよ!とか、あともっと効率の良い実装方法をご存知のかたがおられましたら、お気軽にForkしていただけますとありがたいです。
そして明日のcocos2d Advent Calendar 2011は @hkato193 さんです。 宜しくお願いします!
>リンク予定地
8日目:
CCMotionStreakを使えばライントレースアプリも簡単
