まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

iOS5でTextFieldからツイートする

iOS5からOSレベルでTwitterとの連携が可能になり、Twitter.frameworkというフレームワークを使えばツイートするのがずいぶん楽になりましたね。

最初はわざわざ設定画面に行った後アプリを立ち上げ直してもらうという苦労が微妙にひっかかっていて、OAuth認証でやろうと思っていました。

でもOAuth認証を使ってユーザに連携を承認してもらう画面で「このアプリを信頼しているんですね!」という何とも微妙な日本語が表示されたため、そっとWebViewを消しました・・・

公式のものを少し改良しただけでできました。
すいません、はてなダイアリーの設定を変えたら記事に不自然な改行が入ってしまいました(修正しました)。
サンプルがここにありますので、こちらを参照してください。
GitHub - prince9/TweetPostSampleiOS5: After inputting a text into A and pushing a button, it post to Twitter.TextFieldからテキストを入力、ボタンを押すとツイートされます。iOS5専用

操作の流れはこんな感じ。

1.TabBarの右のタブをタップしてOSの「設定」にアクセス、Twitterのアカウント設定とアプリ承認を行う
2.再度アプリを立ち上げる
3.TabBarの左のタブをタップしてTextFieldにツイートしたいテキストを入力(初期状態では#tweetTestというハッシュタグがおしりにつく設定になっています。半角スペース忘れずに)
4.ボタンを押すとツイートされる
5.ツイートが成功すれば「Tweet Success」と表示される。少し時間がかかることも

OSの「設定」でTwitterの設定をしていない場合はおそらくTextFieldをクリックした瞬間に「設定」へ誘導する画面が出ると思います。
ですが、設定画面に誘導してそこから「設定」を呼び出したい場合もあるかと思い、OSの「設定」を呼び出すUIAlertViewを設定しておきました。

以下、コードを書く流れです。

1.Tabbed Applicationで作成、Accounts.frameworkとTwitter.frameworkをTARGETSのLinked Framework and Librariesから追加
2.Label・TextField・Buttonを設置、それぞれ接続する
3.FirstViewController.hと.m、SecondViewController.hと.mに以下を入力

・FirstViewController.h

#import <UIKit/UIKit.h>

//追加

#import <Twitter/Twitter.h>
#import <Accounts/ACAccount.h>
#import <Accounts/ACAccountStore.h>
#import <Accounts/ACAccountType.h>

@interface FirstViewController : UIViewController

//ツイート入力
@property (weak, nonatomic) IBOutlet UITextField *tweetField;

//ツイートが成功したか失敗したか
@property (weak, nonatomic) IBOutlet UILabel *networkSt;


//入力後キーボードを隠す、keyboard is hidden.
- (IBAction)keyhide:(id)sender;

//ツイートボタン。これがないと始まらない、Tweet button.
- (IBAction)tweet:(id)sender;
@end

・FirstViewController.m

@implementation FirstViewController
@synthesize tweetField;
@synthesize networkSt;

...

//ツイートボタン。これがないと始まらない
- (IBAction)tweet:(id)sender {
    /*
     {}内、NSString *tweetText、*hashTag、*sendTweet以外はすべてtwitterアカウントを使用して自動でポストするために必要。
     決まった文を入れたい場合はdictionaryWithObject:tweetTextのところをdictionaryWithObject:@"ほげほげ"にすればOK。
     */
	ACAccountStore *accountStore = [[ACAccountStore alloc] init];
	
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
        if(granted) {
            NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
            
			if ([accountsArray count] > 0) {
                
				ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
				
                
                //UITextFieldに入力するテキスト
                NSString *tweetText = tweetField.text;
                
                //ハッシュタグ
                NSString *hashTag = @" #tweetTest";
                //最終的にツイートされるテキスト、ハッシュタグがいらない場合は上の1行を削除してdictionaryWithObject:tweetTextにすればOK
                NSString *sendTweet = [tweetText stringByAppendingString:hashTag];
                
				TWRequest *postRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"] parameters:[NSDictionary dictionaryWithObject:sendTweet forKey:@"status"] requestMethod:TWRequestMethodPOST];
                
				[postRequest setAccount:twitterAccount];
                
				[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
					NSString *output = [NSString stringWithFormat:@"HTTP response status: %i", [urlResponse statusCode]];
                    if ([urlResponse statusCode] == 200) {
                        networkSt.text = @"Tweet Success";
                    } else {
                        networkSt.text = @"Tweet NG";
                    }
                    
                    NSLog(@"%@",output);
                    
                }];
			}
        }
	}];

}
@end

・SecondViewController.h

//「設定」を呼び出す、Settings is called. 
- (IBAction)acountSet:(id)sender;

・SecondViewController.m

#import "SecondViewController.h"
@implementation SecondViewController

...

//「設定」を呼び出すダイアログ、The dialog which calls "Settings".
- (IBAction)acountSet:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"お知らせ" message:@"「設定」を開く" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"open setting", nil];
    [alert show];
}

//「設定」を呼び出す、Settings is called. 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == 1){
        NSURL *twSettingURL = [NSURL URLWithString:@"prefs:root=TWITTER"];
        [[UIApplication sharedApplication] openURL:twSettingURL];
    }
}

@end