[cocos2d Advent Calendar 2011]TwitterのOAuth認証のライブラリをcocos2dで使用する方法(サンプル付き)

この記事は最終更新日から13年以上経過しています。

iPhoneアプリ[ MashMosh ]の開発にはcocos2dを使用しているのですが、cocos2dだけだとゲームに付けたい機能が足りなかったので、追加でライブラリをいくつか付け足しました。 今回は「Twitterでつぶやく」のOAuth認証をcocos2dで実装する方法のエントリーです。

iPhoneアプリからOAuth認証をする方法は 強火で進めさんのエントリ - [iPhoneプログラミング][OAuth]TwitterのOAuth認証を使う に詳しく記載されているのですが、僕もTwitter-OAuth-iPhoneライブラリを使用しています。

このエントリーでは ・cocos2dで使用しやすいようにCCLayerを継承したTwiterLayerを作成 ・ログイン、投稿の状況を取得、表示させる機能の追加 といった内容を記載しています。

手順

1.アプリの登録申請

- Create an application からアプリの登録申請をし、 Consumer keyとConsumer secretを取得します。

前述の 強火で進めさんのエントリ により詳しく記載があります。

2.新規プロジェクトを作成

cocos2dで新規でプロジェクトを作成します。

3.Twitter-OAuth-iPhoneライブラリをダウンロードしてプロジェクトに追加

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

をダウンロードし、プロジェクトに追加します。 僕は/libs/以下に一式入れるようにしています。

4.libxmlライブラリを追加

3のTwitter-OAuth-iPhoneライブラリはlibxmlというCライブラリをプロジェクトに追加しないとコンパイルエラーが発生してビルドできないので追加します。

・libxmlライブラリの追加

Project > Target > Linked にlibxml(僕は2.2.7.3を使用しました)を追加します。

・Header Search Pathの記述

Project > Build Settings > Search Paths > Header Search Path にlibxmlへのパス ${SDKROOT}/usr/include/libxml2 を記載します。

libxmlライブラリの追加方法は テン*シー*シーさんが詳細な内容を書かれておられました。 - iPhoneアプリ開発、その(143) libxml2を使ってみる

%

5.AppDelegateを編集

Twitter-OAuth-iPhoneライブラリはviewControllerが絡んでくるので、 ライブラリのサンプルと同様にAppDelegateを編集します。

ここで1で取得したConsumer keyとConsumer secretが必要になってきます。

他のクラスから呼び出せるように

コピーしました
-(NSNumber ) twit:(NSString)s;
-(void) twitReset;

の2つの関数を追記しました。

AppDelegate.h
コピーしました
#import <uikit/UIKit.h>

//twitter
#import "SA_OAuthTwitterEngine.h"
#import "SA_OAuthTwitterController.h"
#define kOAuthConsumerKey                   @"xxxxx"                        //REPLACE ME
#define kOAuthConsumerSecret                @"xxxxx"   //REPLACE ME

@class RootViewController;

@interface AppDelegate : NSObject <uiapplicationDelegate> {
	UIWindow			*window;
	RootViewController	*viewController;

    //twitter
    SA_OAuthTwitterEngine *twitterEngine;
    NSNumber *twitterState;//0.ログイン前 1.ログイン後 2.つぶやき終了
}

@property (nonatomic, retain) UIWindow *window;

//twitter
-(NSNumber *) twit:(NSString*)s;

@end
AppDelegate.m
コピーしました
-(NSNumber *) twit:(NSString*)s
{
    if(!twitterState) twitterState = [[NSNumber alloc] initWithInt:0];

    //
    if(s == @"") {
        if([twitterState intValue] == 0) if(twitterEngine && [twitterEngine isAuthorized]==YES) twitterState = [[NSNumber alloc] initWithInt:1];
        return twitterState;
    }

    UIViewController *controller = nil;
    if (!twitterEngine || [twitterEngine isAuthorized]==NO) {
        twitterEngine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
        twitterEngine.consumerKey = kOAuthConsumerKey;
        twitterEngine.consumerSecret = kOAuthConsumerSecret;
        controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine:twitterEngine delegate: nil];
        [viewController presentModalViewController: controller animated: YES];
    } else {
        if([twitterState intValue] != 2) {//2重投稿禁止
            [twitterEngine sendUpdate:s];
            twitterState = [[NSNumber alloc] initWithInt:2];
        }
    }
    return twitterState;
}

-(void) twitReset
{
    twitterState = [[NSNumber alloc] initWithInt:0];
}
6.呼び出し

あとはTwiterLayerからAppDelegateに命令を送ったらつぶやけます。

[appdelegate twit:@"つぶやき内容"];

下記の3段階のステップで投稿します。

0.ログイン前の場合は認証画面を表示 1.ログインしていたらつぶやく 2.二重で投稿しないように、1度つぶやくと投稿完了のステータスになる。 [appdelegate twit:@""]; とすると 上記のどの状態かがNSNumberとして戻ってくるような構造になっています。 こちらで状態を取得して、表示を切り替えています。

一度つぶやいたけれどもキャンセルして別の内容をつぶやきたい場合は [appdelegate twitReset]; で最初の状態に戻ります。

細かい状態の取得や表示はもっと効率良いやり方がありそうですがw TwiterLayerをご覧いただけますととりあえず実装する方法がわかるかと思います。

サンプル

今回使用したソースはgithubにサンプルとして一式アップしています。

https://github.com/is8r/iphone-howto-twiter/

もっと効率の良い実装方法をご存知のかたがおられましたら、お気軽にForkしていただけますと嬉しいです。

MashMoshはFacebookからの投稿もできるようにしていたのですが、 とある理由でTwitterだけにしました。 せっかくサンプルも作ったので、次のエントリーではFacebookから投稿する方法を記載しようと思います。

Profile

石原 悠 / Yu Ishihara

デザインとプログラミングと編み物とヨーグルトが好きです。