【iOS5】あなたのアプリにカンタンにカンタンつぶやき機能を実装しましょう!

iOS5が一般りりーすされましたよ〜!やった〜!

iOS5のSDKにはご存知の通り「twitter機能」が組み込まれています。

これ、使ってみたらおそろしくカンタンに利用できて、かつ面倒なことはほとんどSDKが吸収してくれてます。

iOS5のtwitter関連SDKを使うとタイムラインの取得やイメージの投稿などいろいろできるのですが、ここでは「あらかじめアプリで決めたつぶやき文章をユーザーがボタンを押して「ちょっと編集」できてつぶやき投稿する」というシンプルな機能を紹介します。

※基本的にはAppleが提供しているサンプル(Tweeting)を見ればわかると思います。

【機能の概要】

・「つぶやき」ボタンを押すとアプリで規定したベース文字列と140文字カウントするダイアログが表示される。
・ユーザーはそのダイアログで投稿するtwitterアカウントの変更や文章の編集を行うことができる。
・「送信」ボタンで投稿。
・アカウント管理はSDKに任せる。

【SETP1】 フレームワークを追加する。

アプリのプロジェクトに「Accounts.framework」と「Twitter.framework」を追加します。このとき、アプリがiOS5以前をターゲット対象とする場合「弱い参照」=「RequiredではなくOptional」にします。

Requiredのままにしてしまうと、iOS5以前のデバイスでアプリを起動しようとする場合にすぐ落ちて終了してしまいます。

【STEP2】 ヘッダファイルの追加

やり方はいくつかあると思いますが、ここではツイート機能を実装するビューコントローラにツイート機能に関連するヘッダファイル2つをインポートします。

【STEP3】 アカウント管理クラスから変更通知を受ける準備

Twitterのアカウント情報自体はiOS5の「設定」として管理されています。(これがとっても助かる!)

そこで、アプリがバックグラウンドで起動中などの場合にユーザーがTwitterの設定でアカウントの変更(特にアカウント削除やアプリ単位でのアカウント情報利用禁止設定など)が行われたタイミングで通知(Nortification)を受け、ツイート可能かどうかを検証しなければならないんです。

そこで、以下のコードで通知があったらセレクタ呼んでね〜と登録しておきます。viewDidLoadでの実装がよいかと思います。この通知はアカウントに変更がないと呼び出されないので、このタイミングで「performSelector」で一度自分で呼び出しておいて、この時点でのツイート可否を検証しておきます。

/* iOS5以降の場合にアカウント情報変更通知を受ける。 */
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0f)  {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onCheckTweetStatus) name:ACAccountStoreDidChangeNotification object:nil];
    [self performSelector:@selector(onCheckTweetStatus)];
}

セレクタ「onCheckTweetStatus」は以下のような感じで実装しました。ここで特筆すべきは、TWTweetComposeViewControllerクラスのクラスメソッド「canSendTweet」です。このメソッドが諸々の事情を勘案し「今ツイートが可能かどうか」を判断してBOOLで返してくれます。すばらしい!

- (void) onCheckTweetStatus
{
    /* ツイート可能かどうかをチェックする。 */
    if ([TWTweetComposeViewController canSendTweet]) {
        /* ここでツイート可能判定時の処理を記述する。ボタンの有効化や可視化など。*/
        [self setFlagCanTweet:YES];
        [self.btTweet setAlpha:1.0f];
    }
    else  {
        /* ここでツイート不可判定時の処理を記述する。ボタンの無効化や不可視化など。 */
        [self setFlagCanTweet:NO];
        [self.btTweet setAlpha:0.3f];
    }
}

【Step4】 ツイートボタンが押下された時のセレクタ

ツイートボタンを押下した際に登録しておくセレクタが呼び出された際の処理です。ほぼサンプルどおりww

/* ツイート可能になっていない場合 */
if(!self.flagCanTweet)  {
		/* UIAlertViewなどでアラート表示 */
}
/* ツイート可能な状態の場合 */
else   {

	/* ツイート画面のためのビューコントローラインスタンスを生成する。 */
	TWTweetComposeViewController *vcTweet = [[TWTweetComposeViewController alloc] init];

        /* 初期表示文字列の指定 */
	[vcTweet setInitialText:[NSString stringWithFormat:@"アロマの暗記(歴史)のすべてのカードを覚えました! #mystudyapp "]];

	/* ツイート結果ハンドラブロック(ツイート送信orキャンセル時の処理をここに記述) */
	[vcTweet setCompletionHandler:^(TWTweetComposeViewControllerResult result) {
		NSString *stringOutPut = nil;
		switch (result) {
			case TWTweetComposeViewControllerResultCancelled:
				// The cancel button was tapped.
				stringOutPut = @"ツイートをキャンセルしました。";
				break;
			case TWTweetComposeViewControllerResultDone:
				// The tweet was sent.
				stringOutPut = @"ツイートに成功しました。";
				break;
			default:
				break;
		}

		[self performSelectorOnMainThread:@selector(onDisplatText:) withObject:stringOutPut waitUntilDone:NO];

		// Dismiss the tweet composition view controller.
		[self dismissModalViewControllerAnimated:YES];
	}];

	[self presentModalViewController:vcTweet animated:YES];
	[vcTweet release];
}

実行すると・・

⬆差出人の部分をタップすることで複数ツイッターアカウントの変更もサポートされてます。

みなさまのアプリにもツイート機能を実装してみてはいかがでしょうか?

<関連記事>

【iOS5,xcode4.2】iOS4.3以前をターゲットにしていると発生する問題と対応策。

アプリアップデート時にアプリ名を変更しようとして大変なことに・・

アプリ内課金(In App Purchase)のスクリーンショットは具体的に何を提出する?

xcodeでのデバッグ方法(メソッド開始ログ、終了ログ)

<その他の記事>

AppStoreで1日どれくらいのアプリがダウンロードされている?

何かが起きた、AppStore、ダウンロード数激増の怪。

テーマはユーザー体験。なるほど、Apple。

<関連サイト>

mipoiApp - iPhoneアプリ作成 -

  1. mipoiappさま

    はじめまして、ナカタニです^^

    SDKにツイート機能が付いたこと、全然知りませんでした・・。
    そして、久しぶりに見るObjective-Cに、これまでの恐怖が蘇る・・・。

    ツイート機能、すごく大事ですよね。
    いいアプリであればあるほど、やっぱりつぶやきたくなりますし。

    機能を付けたいなと思ったら、このページを参考にさせてもらおうと思います^^

  2. ナカタニさん、はじめまして〜♪
    コメントありがとうございます〜♪

    SDK利用すると、画像付きのツイートとかもカンタンにできそうなんですよ〜。
    近いうちにまたまとめて記事にしたいと思います。

    ナカタニさん、今後とも、よろしくお願いします〜〜♪

  3. こんにちは!
    とても参考になり、私のアプリにもtweet入れました。
    ありがとうございます!

    • matsuhouseさん、こんにちは〜!!
      コメントありがとうございます♪

      SDKのツイート機能、とっても便利ですよね!

      画像とかURLとかも入れたりできるみたいなので、
      今度はそちらにチャレンジしてみたいと思います〜♪

    • waka
    • 2011年 11月2日 4:31pm

    これは目からウロコでした。

    AndroidではOAuthやxAuthを使うためにライブラリ入れたりしていたので、
    こんなに簡単につぶやけるとは。位置情報もつけられますし。

    おっしゃるように写真eとって画像付きツイートまでできれば最高です。

    あとタイムラインの取得とかはついてないんですかね???調べてるとこですが。

    • wakaさん、こんにちは〜♪

      わたしもiOS5以前にアプリにツイートのっけようと思った事があったのですが、OAuth等々見て
      「・・・iOS5待とう」
      になりましたww

      タイムラインの取得もできるみたいですよ〜。
      ※Appleのtwitterサンプルで取得するコードがありました。

      iOS SDKレベルで面倒なところできるだけ吸収してもらえるのがほんと助かります。

    • makoto
    • 2012年 1月21日 10:46pm

    はじめまして!

    ツイッター用のライブラリを入れてみようとして
    1日うんうん悩んでいましたが、
    こちらを参考にさせていただいて
    サクッとできてしまいびっくりしました!w

    ただ、ツイート入力画面のボタンが
    英語のままでした…。
    シミュレータのせいかな?とおもいiphoneで試してみたのですが
    やはり英語でした…。
    もしかして、もっともっと基本的な準備が必要だったりするのでしょうかー?
    よかったら教えてください!><

    • 初めまして!コメントありがとうございます!

      >>ただ、ツイート入力画面のボタンが
      >>英語のままでした…。

      シミュレータ、iPhoneともに、
      「設定アプリ」>「一般」>「言語環境」>「言語」
      の設定に従ってツイート入力画面の表示言語が決定されています。
      この設定アプリを「日本語」に指定する事で日本語になるかと思います。

      シミュレータの方はこれが原因かと思うのですが、おそらく日本語環境で普段お使いになっている実機(iPhone)の方も同様に、というのが気になります。。。

        • makoto
        • 2012年 1月25日 10:15pm

        返信ありがとうございます!

        試行錯誤してたのですが
        実機は、storyboardのlocalizationにjapaneseを追加してあげると
        ちゃんと日本語で表示されました!

        シミュレータも日本語設定ってできたんですね…。
        英語をちゃんと理解できていなくて、シミュレータは英語のみだと
        思い込んでしまっていましたw
        そして、こちらもちゃんと日本語で表示されました!

        始めてまだ2ヶ月なので、iphoneDeveloperには当たり前的なところが
        足りていないなーと痛感しました><

        でも、勉強になりました!ありがとうございます!w

        • 少しでもお役に立てて、よかったです〜!!

          シミュレータですが、できないことも多くありますが、
          逆に意外なことが可能だったりもするんですよね。。

          iPadがRetinaディスプレイ対応になった時のシミュレータがPCの画面にほとんど収まらないのではないかと危惧しています(笑)。

  1. 2011年 10月17日
    トラックバック先 :tweet機能の追加 | matsuhouse
*


Advertisement